学习区块链有一段时间了,涉及到的相关技术比较多,因此想通过写文章来进行一个技术总结。同时,会写几个教程,让对区块链有兴趣的童鞋们更好的入门。
从介绍以太坊的架构作为起点,本文分为三部分,第一部分介绍以太坊以及以太坊区块链的整体架构,第二部分详细介绍组成以太坊各个部分的概念,第三部分介绍以太坊生态的开发工具和技术。
Part 1 以太坊与以太坊区块链整体架构
区块链(BlockChain):
本质上是一个应用了密码学技术的分布式数据库系统。
以太坊(Ethereum):
是一个基于区块链技术的去中心化平台,允许任何人在这个平台上开发去中心化应用和使用它们。2014年 Vitalik Buterin 发布了白皮书 https://github.com/ethereum/wiki/wiki/White-Paper
很多人即使看了许多相关的技术资料,仍然难以清晰的理解什么是以太坊,为了让你更加简单直白的理解什么是以太坊,我们以传统的Client/Server的架构来作对比。
图1.1 传统的Web应用一般都由两部分组成,客户端(Client)和服务器端(Server)。
用户通过客户端的应用例如(浏览器,curl/wget 命令行工具)与服务器端的web应用交互。这种情景下,服务器端是中心化的,所有的客户端都是通过访问这个唯一的中心化服务器获取资源以及进行用户想要实现的功能操作。
这里需要记住两个概念。
1. 中心化系统(即传统的Client/Server架构)
2. 去中心化系统(以太坊)
图1.2 可以把以太坊想象成一个由来自全世界成千上万的一个个计算机节点组成的一个超大计算机平台,你可以在这个平台上面开发去中心化应用(Dapp),编写智能合约(Smart Contract),执行转账交易等。所有的节点相互连接并且每个节点可以拥有整个平台的代码和区块链数据的完整备份。由于节点数量众多,只要你开发的应用已经在以太坊上面成功部署,那你的应用几乎是永远可以被随时访问的(即使有部分节点宕机或出现故障,仍有很多其他的节点在维持网络的运行。这个是传统的中心化系统(C/S架构)无法做到的,只要系统的中心服务器出现一点小故障,都可能导致客户端无法访问服务器的资源)。
图1.3 以太坊架构与以太坊区块链
没有中心化的服务器端,所有客户端通过与节点上的实例化应用进行交互。
那么,什么是以太坊区块链呢?以太坊区块链主要由2部分组成。
1. 数据库: 以太坊网络的所有交易都会储存在区块链里,部署一个Dapp,就算是一次交易。举个实际应用例子,比如我们开发一个投票的应用,每个用户都可以给候选人投票,那么每次投票给候选人就可以当作是一次交易。所有这些交易记录都是公开可见,可被验证并且无法篡改。那么以太坊是怎么实现这些功能并且保证整个网络的安全性呢?这就涉及到密码学技术以及分布式系统的共识机制(后面会有文章再专门讲解)。
2. 代码: 除了储存所有的交易记录,以太坊区块链还会储存所有智能合约代码。目前,绝大多数的智能合约都是用 Solidity语言编写开发,Solidity Compiler 会把智能合约代码编译成 Ethereum Byte Code 然后把这些 Byte Code 部署到区块链,再在 EVM(Ethereum Virtual Machine 以太坊虚拟机)上执行这些Byte Code。(后面会再专门讲解)
图1.3 里面的Web3js 是一个js库,通过这个库可以让Dapp的前端与区块链里的智能合约进行交互。
Part 2 组成以太坊各个部分的概念
2.1 智能合约(Smart Contract)
第一部分里我们讲过,用 Solidity 语言编写开发并部署到以太坊区块链上面的应用,称为智能合约。作为刚开始学习以太坊的你,肯定会觉得懵逼,为什么这些应用会叫做智能合约?通常意义上,合约是双方或者多方之间拟定的具有法律效应的协议。当我们把这些协议通过代码来呈现并把他们发布到区块链上,我们就有了数字合约。以太坊区块链运用技术手段来保证这些数字合约,一旦达成条件,就一定会按照协议强制执行,这就是为什么这些数字合约会被称为智能合约。
那么这些代码是如何强制执行的?发布到区块链上的智能合约,是无法修改的,并且条件达成时,一定会执行相应的代码。
举个实际的应用例子,比如我要开发一个领养宠物的应用,需要募集2万元(通过以太币的形式)来开发这个应用,对这个应用感兴趣的用户都可以捐助10-1000元。那么这个智能合约可以这样写,假如最后我在预期时间内完成了应用的开发,那募集的所有储存在以太坊区块链上面的以太币就会转到我的以太坊账户上,反之,则会相应的转回给每个用户的以太坊账户上。这种情景下,使用智能合约就拥有以下4个优点:
1. 所有用户捐助的以太币都储存在以太坊区块链的智能合约里,我或者用户都无法随意拿走这些以太币。
2. 一旦在预期时间内完成了应用开发,智能合约就会执行相应代码把以太币转到我的账户上。
3. 假如在预期时间内没有完成,智能合约就会执行相应代码把以太币转给相应的用户。
4. 智能合约一旦发布到以太坊区块链上,所有的代码都无法被修改或者篡改。
2.2 以太币和它的不同单位
图 2.1 以太币以及它的不同单位的换算
好比现实世界里,每个国家都有自己的货币比如人民币,美金,英镑,欧元。以太坊也有自己的货币,以太币。
点击这里 可以查看实时的以太币价格。
拿人民币作为例子,1元等于10角,1角等于10分。以太币也有相应的换算单位,Ether 以及 Wei。
2.3 以太坊地址
当我们登录银行网站时,需要输入用户名和密码进行验证,在银行网站里,用户名就是我们的身份标识。那么在以太坊区块链里,地址就是我们的身份标识。以太坊的地址示例: 0x807a59ca6e531225f86dc5f5abfd42f779290325。 每个地址都有对应的私钥,私钥就像是你的银行网站密码。你需要 地址+私钥 才能和以太坊区块链进行交互。关于地址和私钥有三点要记住的:
1. 地址是公开的,可以让所有人知道。
2. 私钥不能随意分享给其他人,最好只有你自己知道。
3. 地址和私钥都不保存在数据库里面,要自己保管好。
2.4 以太坊账户
有了地址和私钥就形成了以太坊的账户。账户可以保存余额(以太币)以及发送交易,以太坊有两种账户类型。
1. 外部拥有账户(EOA: Externally owned accounts): 地址+私钥的组合形成一个外部拥有账户。
1.1 你可以用这个账户来接收来自其他账户的以太币,也可以给其他账户发送以太币。
1.2 可以给智能合约发送交易。
2. 合约账户(Contract accounts): 这类账户是没有私钥的。当你把智能合约发布到以太坊区块链上时,就会生成这类账户。
2.1 合约账户像EOA一样也可以发送或者接收以太币。
2.2 合约账户里面有智能合约的代码。
2.3 交易必须是通过EOA或者其他合约账户触发的。
2.5 以太坊钱包
钱包用来存放和管理以太坊账户,还有对交易进行数字签名,追踪余额等功能。
6种以太坊钱包的基本介绍
2.6 以太坊(Gas, Gas Price, Gas Limit)
发布智能合约到以太坊区块链以及执行交易等操作都是有代价的,要给予矿工一定数量的以太币以让他们去执行相应的功能操作。那么执行什么操作需要对应什么价格呢?以太坊的黄皮书有写明标准,比如执行两个数相加需要3 units of work,两个数相乘则需要 5 units of work, 这里的unit of work 单位就是 Gas(气). 以太坊黄皮书
我们现在知道每笔交易需要多少Gas,但我们仍然不知道我们要向矿工支付多少以太币,这是由Gas价格决定的,比较有意思的是,你可以设置任何想要的Gas价格。例如,你可以说我的交易是"我愿意为每个Gas支付3Gwei"。如果交易需要100000Gas,并且将Gas价格设置为3Gwei,那最终的交易支付便是 3000000GWei。并且你设定的Gas价格越高,交易就开始得越快。因为大多数矿工按照Gas价格从高到低的顺序对交易进行分类,并选择Gas价格较高的交易纳入区块。如果将价格设置得较低,交易虽然总会被写进在区块中,但需要等待的时间就比较久。
要确切知道交易需要多少 Gas 是很困难的。作为开发人员,不能盲目执行交易,并意识到你的交易可能会花费数百美元的以太币。为了避免这种情况,可以指定一个Gas Limit,指明你愿意支付以执行交易的最大Gas数量。
2.7 Byte Code
智能合约代码一般是用 Solidity 语言编写的,接着代码会被 Solidity Compiler 编译成 EVM(Ethereum Virtural Machine 以太坊虚拟机) bytecode。实际上真正被发布到区块链上面的就是这些被编译后的 bytecode. 因为EVM只能读懂也只能执行这些 bytecode。
这样设计的优点是开发者可以选择自己想要的编程语言去开发智能合约。目前还有另外一种编程语言 Vyper (类似Python语言) 也可以编译成 EVM bytecode。假如你是一个语言设计者,你甚至可以根据黄皮书的标准实现自己的编程语言去开发智能合约。
2.8 EVM(Ethereum Virtual Machine 以太坊虚拟机)
EVM是一个具备图灵完整,256bit的,并且允许任何人执行任意 EVM bytecode 的虚拟机。EVM同时也是以太坊协议的一部分。
Part 3 以太坊工具与技术
3.1 Geth
到目前为止,我们讲解了以太坊基本的理论概念。 现在来看看以太坊有哪些工具,库和应用。
Geth是以太坊基金会提供的官方客户端软件,用Go语言编写。 当您启动geth时,它会连接到网络中的其他以太坊客户端(节点)并下载区块链副本。 它会不断和其他节点通信,以保持区块链的最新副本。 它还可以挖掘区块并将交易添加到区块链中,验证区块中的交易并执行交易。
Geth附带一个JavaScript客户端(geth控制台),可用于连接到区块链。
Geth的安装使用指南
3.2 Web3.JS / Truffle
Web3.JS 是一个很流行的JavaScript库,用于与以太坊区块链进行交互。 你可以在任何前端框架中使用它来开发Dapp。后面我会写一个开发Dapp的教程,里面会涉及到如何使用Web3.JS。
Truffle就像Web应用程序开发的框架,比如Ruby on Rails,Python的Django等一样,Truffle是用于开发Dapp的最流行的框架之一。 他们将区块链上编译和部署合同的复杂性抽象出来。 你可以在这里查看 Truffle 的更多细节。
3.3 Ganache
使用比如geth等客户端进行开发可能效率不高,因为执行每个交易需要15秒。 为了解决这个问题,开发人员通常使用ganache进行开发。 你可以安装 ganache-cli 命令行版本或GUI版本。 Ganache 另一个好处是一开始就有10个测试帐户并且都预先加载了100个以太币。点击这里查看Ganache
3.4 Metamask
我们在前一部分讲过钱包,Metamask是以太坊社区中的流行钱包之一,你可以在Chrome里面以插件的形式安装他们。点击这里查看MetaMask
3.5 Etherscan
由Etherscan公司提供的一项免费服务,提供方便的前端界面用来探索以太坊区块链。可以在这个网站上查看所有地址,交易,区块详细信息等。
Mainnet是以太坊的主网络,其他3个是以太坊的测试网络。
Mainnet:https://etherscan.io/
Ropsten:https://ropsten.etherscan.io/
Rinkeby:https://rinkeby.etherscan.io/
Kovan:https://kovan.etherscan.io/
3.6 Remix
一个浏览器IDE,可用来编写智能合约。 不仅可以把它用作编辑器,还可以用于编译和将智能合约部署到各种网络,并直接从IDE与它们进行交互。 它具有许多功能来选择各种编译器版本,调试智能合约等等。 可以在这里访问IDE
下一篇文章会写一个基于以太坊的投票Dapp开发教程,敬请关注。