1. 以太坊简介
Vitalik Buterin 在 2013 年 11 月提出了以太坊的概念,其关键思想是:开发一种图灵完备(Turing-Complete) 的语言,以允许开发用于区块链和去中心化应用的任意程序(智能合约)。该概念与比特比相反,因为后者的脚本语言本质上是受限制的,并且仅允许进行必要的操作。
下表显示了以太坊从第一个版本到计划的最终版本在内的所有版本。
版本 | 发布日期 |
Olympic(奥林匹克) | 2015 年 5 月 |
Frontier(前沿) | 2015 年 7月 |
Homestead(家园) | 2016 年 3月 |
Metropolis (大都会) Byzantine (拜占庭,大都会的第一阶段) | 2017 年 10 月 |
Constantinople(君士坦丁堡,大都会的第二阶段) | 2019 年 3 月 |
Serenty(宁静,以太坊最终版) | 即将发布 |
以太坊的第一个版本为 Olympic (奥林匹克),于 2015 年 5 月发布。
大约两个月后,即 2015 年 7 月,以太坊的一个名为 Frontier (前沿)的版本发布。
2016 年 3 月,发布了具有改进功能的名为 Homestead (家园) 的版本。
2017 年 10 月,Byzantium (拜占庭)版本发布,这是 Metropolis (大都会) 版本的第一阶段。此版本于 2017 年 10 月在区块高度为 4370000 的区块上实施了 Constantinople (君士坦丁堡)硬分叉,这也是 Metropolis 版本的第二阶段。
2019 年 3 月,以太坊网络在区块高度为 708000 的区块上实施了 Constantinople(君士坦丁堡)硬分叉,这也是 Metropolis 版本的第二阶段。
以太坊的最终计划发行版本称为 Serenity (宁静),它将计划引入基于 PoS 的最终版本而不是 PoW。
在以太坊黄皮书中已经描述了以太坊的正式规范,该规范可用于开发以太坊实现。现在我们就来认识一下这个黄皮书。
1.1 黄皮书
以太坊黄皮书由 Ethereum & Parity 公司创始人 Gavin Wood 博士撰写,并作为以太坊协议的正式定义。任何人都可以通过遵循该黄皮书定义的协议规范来实现以太坊客户端。其网址如下:
https://ethereum.github.io/yellowpaper/paper.pdf
尽管普通人阅读该黄皮书可能有些挑战,尤其是对于没有代数或数学背景并且不熟悉数学符号的读者来说,想要全面理解可能需要多做功课,但它包含了以太坊的完整、正式规范,该规范可用于实现完全兼容的以太坊客户端。
下面将提供该黄皮书中所有符号及其含义的列表,以帮助你更轻松地阅读以太坊黄皮书。在理解了这些符号的含义之后,就能轻松理解该黄皮书所描述的概念和规范。
1.2 有用的数学符号
1.3 以太坊区块链
就像其他任何区块链一样,以太坊区块链可以可视化为基于交易的状态机。Gavin Wood 博士在以太坊黄皮书中提到了这个定义。其核心思想是:在以太坊区块链中,通过逐步执行交易,将初始状态转换为最终状态,然后将最终转换后的状态作为绝对无可争议的版本。
在下图中,显示了以太坊状态转换函数,其中交易的执行已导致状态转换。
原文 | 译文 | 原文 | 译文 |
INITAL STATE | 初始状态 | FINAL STATE | 最终状态 |
TRANSACTION | 交易 |
在上图中,启动了两个以太坊从地址 4718bf7a 到地址 741f7a2 的转移。初始状态表示交易执行之前的状态,而最终状态则表示交易执行之后的状态。
状态将作为世界状态(World State) 存储在以太坊网络上,这也称为以太坊区块链的全球状态(Global State)。
2. 从用户角度观察以太坊
下面将从用户的角度了解以太坊的工作方式。为此,我们将介绍最常见的转帐示例。
在本示例中,将从一个用户(刘玄德)转帐到另一个用户(张翼德)。我们将使用两个以太坊客户端,一个用于汇款,另一个用于接收汇款。此过程涉及以下步骤:
(1)转帐双方都可以发起操作。收款人可以通过将请求发送给付款人来要求转帐,付款人也可以直接决定将钱款发送给收款人。
收款人发起请求时,可以将收款人的以太坊地址发送给付款人。例如,有两个用户(刘玄德和张翼德),如果张翼德粮草不足,要求刘玄德付款,则可以使用二维码将请求发送给刘玄德。刘玄德收到此请求后,将扫描二维码或手动输入张翼德的以太坊地址,然后将以太币发送到张翼德的以太坊地址。该请求被编码为如下图所示的二维码
原文 | 译文 |
Tap to copy this address.Share it with the sender via email or text. | 点击以复制此地址。可通过电子邮件或短信与发送者(付款人)共享 |
可以通过电子邮件、文本或任何其他通信方式共享。Jaxx 钱包的下载地址如下:https://jaxx.io
(2)一旦刘玄德收到此请求,他将扫描二维码或在以太坊钱包软件中复制以太坊地址并启动交易,如下图所示
其中,iOS 上的 Jaxx Ethereum 钱包软件用于向张翼德汇款。该图还显示,刘玄德已输入了用于发送以太币的金额和目标地址。在发送以太币之前,最后一步是确认(Confirm)交易。
(3)一旦在钱包软件中构造了汇款请求(交易),它将被广播到以太坊网络。交易由发送方(刘玄德)进行数字签名,以证明他是该以太币的所有者。
(4)该交易由以太坊网络上称为矿工的节点进行拾取,以进行验证并将其包含在区块中。在此阶段,交易仍未确认。
(5)一旦被验证并包含在区块中,PoW 过程就会开始。
(6)一旦矿工找到了 PoW 问题的答案(通过使用新的随机数重复对区块进行哈希处理),则该区块将立即被广播到其余节点,然后其他节点将验证该区块和 PoW。
(7)如果所有验证都通过,则此区块将添加到区块链中,并相应地向矿工支付奖励。
(8)张翼德得到以太币,并在他的钱包软件中显示出来,如下图所示:
在区块链上,此交易由以下交易哈希标识:
0xc63dce674e1640abd63ee63027c3352aed8cdb92b6a02ae25225666e171009e |
可以在 https://etherscan.io/ 的区块浏览器中查看有关该交易的详细信息,如下图所示。
在上述示例中,我们完成了最常见的以太坊网络操作,即将以太币从一个用户转帐到另一个用户。本示例只是对交易过程的大致介绍,目的是让你形成对以太币交易的粗略概念。
3. 以太坊网络
和比特币网络一样,以太坊网络也是一个点对点网络,节点参与其中以维护区块链并促进共识机制。根据需求和使用情况,以太网络可以分为 3 种类型:主网、测试网络和私有网络。
3.1 主网
主网(Mainnet) 是以太坊当前的实时网络。主网的当前版本为 Byzantium(Metropolis),其链 ID 为1。链 ID 用于标识网络,可以使用以太坊浏览器探索以太坊区块链。
3.2 测试网络
以太坊的测试网络(Testnet) 也称为 Ropsten,是以太坊区块链广泛使用的测试网络。该测试区块链用于在部署到生产实时区块链之前测试智能合约和 DApp。此外,作为测试网络,它也可以进行实验和研究。
主测试网络称为 Ropsten,其中包含针对特定版本创建的其他较小和专用测试网络的所有功能。其他的测试网络包括测试拜占庭版本而开发的 Kovan 和 Rinkeby。在这些较小的测试网络上实现的更改也已在 Ropsten 上实现。现在,Ropsten 测试网络包含 Kovan 和 Rinkeby 的所有属性。
3.3 私有网络
私有网,顾名思义就是可以通过生成新的创世区块而创建的私有网络(Private Net)。在私有区块链分布式帐本网络中通常就是这种情况,在该类网络中,一组私有实体启动其区块链并将其用作许可的区块链。
下表显示了以太坊网络及其网络 ID 的列表,这些网络 ID 被以太坊客户端用来标识网络。
网络名称 | 网络ID/链 |
以太坊主网 | 1 |
Morden | 2 |
Ropsten | 3 |
Rinkeby | 4 |
Kovan | 42 |
经典以太坊主网 | 61 |
4. 以太坊生态系统的组成部分
以太坊区块链堆栈包含多个组成部分。
首先,其核心是在对等以太坊网络上运行的以太坊区块链。
其次,有一个运行在节点上的以太坊客户端(通常是 Geth)。客户端连接到点对点以太坊网络,从该网络下载区块链并存储在本地。它提供了各种功能,例如挖矿和帐户管理。区块链的本地副本定期与网络同步。
还有一个组件是 web3.js 库,该库允许通过远程过程调用(Remote Procedure Call,RPC)接口与 geth 客户端进行交互。
下图显示了以太坊显示的架构。
原文 | 译文 |
WEB3 OR CUSTOM INTERFACE | web3 或自定义接口 |
RPC | 远程过程调用(RPC) |
ETHEREUM CLIENT | 以太坊客户端 |
LOCAL BLOCK CHAIN | 本地区块链 |
Synced with main network | 与主网同步 |
以下是以太坊区块链中所有高级元素的正式列表:
- 密钥和地址
- 帐户
- 交易和消息
- 以太坊加密货币/代币
- 以太坊虚拟机(EVM)
- 智能合约
5. 交易和消息
以太坊中的交易是使用私钥进行数字签名的数据包,其中包含的指令在完成后会导致消息调用或合约创建.
交易可以根据它们产生的输出又分为以下两种类型:
- 消息调用交易。此交易仅产生一个消息调用,该消息调用用于将消息从一个合约帐户传递到另一个合约帐户.
- 合约创建交易。合约创建交易,顾名思义就是交易导致创建新的合约帐户.这意味着,成功执行此交易后,它将创建一个具有关联代码的帐户。
下图对此结构进行了可视化处理,
5.3 消息
在下图中,显示了两种类型的交易(合约创建和消息调用)之间的区别。
6. 以太坊区块链中的状态存储
从根本上讲,以太坊区块链是一种由交易和共识驱动的状态机。状态需要永久存储在区块链中。为此,世界状态、交易和交易收据都将以区块的形式存储在区块链上。
下图显示了世界状态以及它与帐户字典树、帐户和区块标头之间的关系。
下图显示了交易收据的生成过程。
7. 以太币
作为对矿工的激励,以太坊会发放它自己的货币,也就是以太币.
在 DAO 遭到入侵后,提出了一个硬分叉来解决该问题。现在出现了两个以太坊区块链:一是经典以太坊(Ethereum Classic) ,其货币以 ETC 表示; 二是硬分叉版本的代币 ETH,它将继续增长并且正在积极地进行开发。
8. 以太坊虚拟机
以太坊虚拟机是一个简单的基于堆栈的执行机,它运行字节码指令以将系统状态从一种状态转换为另一种状态。虚拟机的字长设置为 256 位。堆栈大小限制为 1024 个元素,并且基于后进先出(Last In,First Out,LIFO)队列。
下图显示了 EVM 的设计。
执行环境可以可视化为包含 10 个元素的元组,如下图所示。
8.3 迭代器函数
机器状态可以看作是一个元组,如下图所示