汇智网 Hubwiz.com
以太坊白皮书中文版
导读
以太坊是什么?
以太坊是一个全新开放的区块链平台,它允许任何人在平台中建立和使用通过
区块链技术运行的去中心化应用。就像比特币一样,以太坊丌受任何人控制,
也丌归任何人所有——它是一个开放源代码项目,由全球范围内的很多人共同
创建。和比特币协议有所丌同的是,以太坊的设计十分灵活,极具适应性。在
以太坊平台上创立新的应用十分简便,随着 Homestead 的发布,任何人都可
以安全地使用该平台上的应用。
以太坊白皮书中文版广泛流传于网络,翻译者丌可考,感谢他们的辛勤工作。
本电子书由汇智网(http://www.hubwiz.com)根据网上的版本编目整理。
但由于以太坊本身(以及周边生态)的发展非常快,一些实践性内容已经落后
于现状。因此编者建议本电子书的读者,在阅读时应注意吸收核心的理念思想,
而丌要过分关注书中的实践操作环节。
为了弥补这一遗憾,汇智网推出了在线交互式以太坊 DApp 实战开发课程,以
去中心化投票应用(Voting DApp)为课程项目,通过三次迭代开发过程的详
细讲解不在线实践,并且将区块链的理念不去中心化思想贯穿于课程实践过程
中,为希望快速入门区块链开发的开发者提供了一个高效的学习不价值提升途
径。读者可以通过以下链接访问《以太坊 DApp 开发实战入门》在线教程:
http://xc.hubwiz.com/course/5a952991adb3847553d205d1?affid=wp
1 / 33
汇智网 Hubwiz.com
以太坊白皮书中文版
教程预置了开发环境。进入教程后,可以在每一个知识点立刻进行同步实践,
而丌必在开发环境的搭建上浪费时间:
汇智网 Hubwiz.com
2018.2
以太坊白皮书中文版
当中本聪在 2009 年 1 月启动比特币区块链时,他同时向世界引入了两种未经测
试的革命性的新概念。第一种就是比特币(bitcoin),一种去中心化的点对点的
网上货币,在没有任何资产担保、内在价值或者中心发行者的情况下维持着价值。
到目前为止,比特币已经吸引了大量的公众注意力, 就政治方面而言,它是一种
没有中央银行的货币,并且有着剧烈的价格波动。
然而,中本聪的伟大试验还有与比特币同等重要的一部分:基于工作量证明的区
块链概念使得人们可以就交易顺序达成共识。作为应用的比特币可以被描述为一
2 / 33
汇智网 Hubwiz.com
以太坊白皮书中文版
个先申请(first-to-file)系统:如果某人有 50BTC 并且同时向 A 和 B 发送这 50BTC,
只有被首先确认的交易才会生效。没有固有方法可以决定两笔交易哪一笔先到,
这个问题阻碍了去中心化数字货币的发展许多年。中本聪的区块链是第一个可靠
的去中心化解决办法。现在,开发者们的注意力开始迅速地转向比特币技术的第
二部分,区块链怎样应用于货币以外的领域。
常被提及的应用,包括使用链上数字资产来代表定制货币和金融工具(彩色币),
某种基础物理设备的所有权(智能资产),如域名一样的没有可替代性的资产(域
名币)以及如去中心化交易所,金融衍生品,点到点赌博和链上身份和信誉系统
等更高级的应用。
另一个常被问询的重要领域是“智能合约”- 根据事先任意制订的规则来自动转移
数字资产的系统。例如,一个人可能有一个存储合约,形式为“A 可以每天最多
提现 X 个币,B 每天最多 Y 个,A 和 B 一起可以随意提取,A 可以停掉 B 的提
现权”。这种合约的符合逻辑的扩展就是去中心化自治组织(DAOs)-长期的包
含一个组织的资产并把组织的规则编码的智能合约。以太坊的目标就是提供一个
带有内置的成熟的图灵完备语言的区块链,用这种语言可以创建合约来编码任意
状态转换功能,用户只要简单地用几行代码来实现逻辑,就能够创建以上提及的
所有系统以及许多我们还想象不到的的其它系统。
历史沿革
去中心化的数字货币概念,正如财产登记这样的替代应用一样,早在几十年以前
就被提出来了。1980 和 1990 年代的匿名电子现金协议,大部分是以乔姆盲签
技术(Chaumian blinding)为基础的。这些电子现金协议提供具有高度隐私性
的货币,但是这些协议都没有流行起来,因为它们都依赖于一个中心化的中介机
构。1998 年,戴伟(Wei Dai)的 b-money 首次引入了通过解决计算难题和去
中心化共识创造货币的思想,但是该建议并未给出如何实现去中心化共识的具体
方法。2005 年,芬尼(Hal Finney)引入了“可重复使用的工作量证明机制”
(reusable proofs of work)概念,它同时使用 b-money 的思想和 Adam Back
提出的计算困难的哈希现金(Hashcash)难题来创造密码学货币。但是,这种
概念再次迷失于理想化,因为它依赖于可信任的计算作为后端。
因为货币是一个先申请应用,交易的顺序至关重要,所以去中心化的货币需要找
到实现去中心化共识的方法。比特币以前的所有电子货币协议所遇到的主要障碍
3 / 33
汇智网 Hubwiz.com
以太坊白皮书中文版
是,尽管对如何创建安全的拜占庭问题容错(Byzantine-fault-tolerant)多方共
识系统的研究已经历时多年,但是上述协议只解决了问题的一半。这些协议假设
系统的所有参与者是已知的,并产生如“如果有 N 方参与到系统中,那么系统可
以容忍 N/4 的恶意参与者”这样形式的安全边界。然而这个假设的问题在于,在
匿名的情况下,系统设置的安全边界容易遭受女巫攻击,因为一个攻击者可以在
一台服务器或者僵尸网络上创建数以千计的节点,从而单方面确保拥有多数份额。
中本聪的创新是引入这样一个理念:将一个非常简单的基于节点的去中心化共识
协议与工作量证明机制结合在一起。节点通过工作量证明机制获得参与到系统的
权利,每十分钟将交易打包到“区块”中,从而创建出不断增长的区块链。拥有大
量算力的节点有更大的影响力,但获得比整个网络更多的算力比创建一百万个节
点困难得多。尽管比特币区块链模型非常简陋,但是实践证明它已经足够好用了,
在未来五年,它将成为全世界两百个以上的货币和协议的基石。
作为状态转换系统的比特币
从技术角度讲,比特币账本可以被认为是一个状态转换系统,该系统包括所有现
存的比特币所有权状态和“状态转换函数”。状态转换函数以当前状态和交易为输
入,输出新的状态。例如,在标准的银行系统中,状态就是一个资产负债表,一
个从 A 账户向 B 账户转账 X 美元的请求是一笔交易,状态转换函数将从 A 账户
中减去 X 美元,向 B 账户增加 X 美元。如果 A 账户的余额小于 X 美元,状态转
换函数就会返回错误提示。所以我们可以如下定义状态转换函数:
APPLY(S,TX) > S’ or ERROR
4 / 33
汇智网 Hubwiz.com
以太坊白皮书中文版
在上面提到的银行系统中,状态转换函数如下:
APPLY({ Alice: $50, Bob: $50 },”send $20 from Alice to Bob”) = { Alice:
$30,Bob: $70 }
但是:
APPLY({ Alice: $50, Bob: $50 },”send $70 from Alice to Bob”) = ERROR
比特币系统的“状态”是所有已经被挖出的、没有花费的比特币(技术上称为“未花
费的交易输出,unspent transaction outputs 或 UTXO”)的集合。每个 UTXO
都有一个面值和所有者(由 20 个字节的本质上是密码学公钥的地址所定义[1])。
一笔交易包括一个或多个输入和一个或多个输出。每个输入包含一个对现有
UTXO 的引用和由与所有者地址相对应的私钥创建的密码学签名。每个输出包含
一个新的加入到状态中的 UTXO。
在比特币系统中,状态转换函数 APPLY(S,TX)->S‟大体上可以如下定义:
1. 交易的每个输入:
- 如果引用的 UTXO 不存在于现在的状态中(S),返回错误提示
- 如果签名与 UTXO 所有者的签名不一致,返回错误提示
1. 如果所有的 UTXO 输入面值总额小于所有的 UTXO 输出面值总额,返回错误提
示
2. 返回新状态 S‟,新状态 S‟中移除了所有的输入 UTXO,增加了所有的输出 UTXO。
第一步的第一部分防止交易的发送者花费不存在的比特币,第二部分防止交易的
发送者花费其他人的比特币。第二步确保价值守恒。比特币的支付协议如下。假
设 Alice 想给 Bob 发送 11.7BTC。事实上,Alice 不可能正好有 11.7BTC。假设,
她能得到的最小数额比特币的方式是:6+4+2=12。所以,她可以创建一笔有 3
个输入,2 个输出的交易。第一个输出的面值是 11.7BTC,所有者是 Bob(Bob
的比特币地址),第二个输出的面值是 0.3BTC,所有者是 Alice 自己,也就是
找零。
挖矿
5 / 33
汇智网 Hubwiz.com
以太坊白皮书中文版
如果我们拥有可信任的中心化服务机构,状态转换系统可以很容易地实现,可以
简单地将上述功能准确编码。然而,我们想把比特币系统建成为去中心化的货币
系统,为了确保每个人都同意交易的顺序,我们需要将状态转换系统与一个共识
系统结合起来。比特币的去中心化共识进程要求网络中的节点不断尝试将交易打
包成“区块”。网络被设计为大约每十分钟产生一个区块,每个区块包含一个时间
戳、一个随机数、一个对上一个区块的引用(即哈希)和上一区块生成以来发生
的所有交易列表。这样随着时间流逝就创建出了一个持续增长的区块链,它不断
地更新,从而能够代表比特币账本的最新状态。
依照这个范式,检查一个区块是否有效的算法如下:
1. 检查区块引用的上一个区块是否存在且有效。
2. 检查区块的时间戳是否晚于以前的区块的时间戳,而且早于未来 2 小时[2]。
3. 检查区块的工作量证明是否有效。
4. 将上一个区块的最终状态赋于 S[0]。
5. 假设 TX 是区块的交易列表,包含 n 笔交易。对于属于 0……n-1 的所有 i,进行状
态转换 S[i+1] = APPLY(S[i],TX[i])。如果任何一笔交易 i 在状态转换中出错,退
出程序,返回错误。
6. 返回正确,状态 S[n]是这一区块的最终状态。
6 / 33
汇智网 Hubwiz.com
以太坊白皮书中文版
本质上,区块中的每笔交易必须提供一个正确的状态转换,要注意的是,“状态”
并不是编码到区块的。它纯粹只是被校验节点记住的抽象概念,对于任意区块都
可以从创世状态开始,按顺序加上每一个区块的每一笔交易,(妥妥地)计算出
当前的状态。另外,需要注意矿工将交易收录进区块的顺序。如果一个区块中有
A、B 两笔交易,B 花费的是 A 创建的 UTXO,如果 A 在 B 以前,这个区块是有
效的,否则,这个区块是无效的。
区块验证算法的有趣部分是“工作量证明”概念:对每个区块进行 SHA256 哈希处
理,将得到的哈希视为长度为 256 比特的数值,该数值必须小于不断动态调整
的目标数值,本书写作时目标数值大约是 2^190。工作量证明的目的是使区块的
创建变得困难,从而阻止女巫攻击者恶意重新生成区块链。因为 SHA256 是完
全不可预测的伪随机函数,创建有效区块的唯一方法就是简单地不断试错,不断
地增加随机数的数值,查看新的哈希数值是否小于目标数值。如果当前的目标数
值是 2^192,就意味着平均需要尝试 2^64 次才能生成有效的区块。一般而言,
比特币网络每隔 2016 个区块重新设定目标数值,保证平均每十分钟生成一个区
块。为了对矿工的计算工作进行奖励,每一个成功生成区块的矿工有权在区块中
包含一笔凭空发给他们自己 25BTC 的交易。另外,如果交易的输入大于输出,
差额部分就作为“交易费用”付给矿工。顺便提一下,对矿工的奖励是比特币发行
的唯一机制,创世状态中并没有比特币。
为了更好地理解挖矿的目的,让我们分析比特币网络出现恶意攻击者时会发生什
么。因为比特币的密码学基础是非常安全的,所以攻击者会选择攻击没有被密码
学直接保护的部分:交易顺序。攻击者的策略非常简单:
1. 向卖家发送 100BTC 购买商品(尤其是无需邮寄的电子商品)。
2. 等待直至商品发出。
3. 创建另一笔交易,将相同的 100BTC 发送给自己的账户。
4. 使比特币网络相信发送给自己账户的交易是最先发出的。
一旦步骤(1)发生,几分钟后矿工将把这笔交易打包到区块,假设是第 270000
个区块。大约一个小时以后,在此区块后面将会有五个区块,每个区块间接地指
向这笔交易,从而确认这笔交易。这时卖家收到货款,并向买家发货。因为我们
假设这是数字商品,攻击者可以即时收到货。现在,攻击者创建另一笔交易,将
相同的 100BTC 发送到自己的账户。如果攻击者只是向全网广播这一消息,这
一笔交易不会被处理。矿工会运行状态转换函数 APPLY(S,TX),发现这笔交易
7 / 33
汇智网 Hubwiz.com
以太坊白皮书中文版
将花费已经不在状态中的 UTXO。所以,攻击者会对区块链进行分叉,将第
269999 个区块作为父区块重新生成第 270000 个区块,在此区块中用新的交易
取代旧的交易。因为区块数据是不同的,这要求重新进行工作量证明。另外,因
为攻击者生成的新的第 270000 个区块有不同的哈希,所以原来的第 270001 到
第 270005 的区块不指向它,因此原有的区块链和攻击者的新区块是完全分离的。
在发生区块链分叉时,区块链长的分支被认为是诚实的区块链,合法的的矿工将
会沿着原有的第 270005 区块后挖矿,只有攻击者一人在新的第 270000 区块后
挖矿。攻击者为了使得他的区块链最长,他需要拥有比除了他以外的全网更多的
算力来追赶(即 51%攻击)。
默克尔树
左:仅提供默克尔树(Merkle tree)上的少量节点已经足够给出分支的合法证明。
右:任何对于默克尔树的任何部分进行改变的尝试都会最终导致链上某处的不一
致。
比特币系统的一个重要的可扩展特性是:它的区块存储在多层次的数据结构中。
一个区块的哈希实际上只是区块头的哈希,区块头是包含时间戳、随机数、上个
区块哈希和存储了所有的区块交易的默克尔树的根哈希的长度大约为 200 字节
的一段数据。
8 / 33