• app_navCreated with Sketch.app_navCreated with Sketch.

    App

    扫码下载APP

  • tougao_navCreated with Sketch.tougao_navCreated with Sketch.

    投稿

  • Sign in_navCreated with Sketch.Sign in_navCreated with Sketch.

    登录

  • register_navCreated with Sketch.register_navCreated with Sketch.

    注册

挖链福利 | 挖链网突破100万用户,邀您30天瓜分8枚ETH!
超级现金王者归来 HCASH云算力重塑价值
以太坊白皮书2018年中文版解读
2018-04-19 18:24:26

以太坊白皮书中文版翻译


以太坊:下一代智能合约和去中心化应用平台

中本聪在2009年开发的比特币作为货币的激进发展经常被致敬,它是数字资产的第一个例子,没有资产担保或内在价值,同时也没有中央发行者或控制者。然而,比特币实验的一部分,可以说更重要的一部分,底层的区块链技术,是一个分布式共识的工具,并且越来越多的注意力都转向它。常用的基于区块链技术的非传统应用包括:用区块链上数字资产表示定制的货币和金融工具(彩色币),一个底层物理设备所有权(智能财产),不可替代资产如域名(名字币),和更复杂的应用(涉及数字资产直接由一段代码控制,这些代码实现固定规则-智能合约),以至于基于区块链的去中心化自治组织(DAOs)。以太坊打算提供的是一种区块链,它内置完全成熟的图灵完备的编程语言,可以用来创建合约,简单地通过几行代码写出相应逻辑,来实现任意状态转移的功能,允许用户创建上面提到的任意系统,还有实现很多我们还没有想到的东西。

介绍比特币和已有概念

历史

去中心化数字货币,以及非传统应用如财产注册的概念已经存在了几十年。二十世纪八九十年代提出的匿名电子现金协议,主要依赖加密学原语的乔姆盲签技术,提供了一种具有高度隐私性的货币,但是这些协议由于高度依赖中心化的中介,大部分未能取得进展。1998年,戴伟的b-money首次提出通过解决数学难题和去中心化共识创建货币,但是这个方案对于如何实现去中心化共识的建议还不够详细,未能付诸实践。2005年,哈尔芬尼介绍了一个可重复的工作量证明的概念,和一个系统,这个系统使用了b-money的思想,并结合亚当贝克的难以计算的哈希现金难题创建了一个加密货币的概念,但是由于依赖可信的后台计算绝,无法达到理想。2009年,中本聪在实践中第一次实现了去中心化货币,它结合了通过公钥密码学建立所有权管理的原语和跟踪谁拥有币的一种共识算法,被称为"工作量证明"


工作量证明背后的机制是空间上的突破,因为它同时解决了两个问题。第一,它提供了一个简单的适度有效的共识算法,允许网络中的节点对比特币账本状态的一套规范更新共同协商。第二,它提供了一种机制,允许自由加入共识过程,解决了决定谁影响共识的政治难题,同时防止女巫攻击。它通过用经济门槛取代正式门槛来参与,比如要以独一无二的实体注册到一个特定的列表里-在共识投票过程中,一个单独节点的权重和该节点能带来的算力成正比。其后,一个替代的方法就被提出来了,称为权益证明,通过节点持币比例来计算权重,而非计算资源。对于两种方法优缺点的讨论超出了本文的范围,但是需要注意的是,两种方法都可以用来作为加密货币的基础。

比特币作为一个状态转移系统

从技术角度看,加密货币的账本如比特币可以被认为是一个状态转移系统,状态包含了所有已经发行的比特币的所有权状态,状态转移函数通过输入一个状态和交易,输出一个新的状态。比如,在一个标准的银行系统里,状态是一张余额单,一个交易是一个从AB转移X美元的请求,状态转换函数把A账户减少X美元,B账户增加X美元。如果开始A账户的余额少于X美元,状态转换函数返回错误。因此,可以正式定义:

APPLY(S,TX) -> S' or ERROR

在上面定义的银行系统里:

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

比特币的状态是所有已挖出但未花费的比特币的集合(技术上称为未花费交易输出,或UTXO),每个UTXO包含面额和所有者(用一个20字节的地址来定义,本质上是加密算法里的公钥)。一个交易包含一个或多个输入,每一个输入包含一个对有效UTXO的引用和一个加密签名,是用所有者地址对应的私钥的签名,还包含一个或多个输出,每个输出包含一个新的UTXO,这个UTXO将加入到状态中。

状态转移函数APPLY(S,TX) -> S'大致定义如下:

1. 对每一个TX中的输入:

-如果引用的UTXO不在S中,返回错误。

-如果提供的数字签名和UTXO所有者不匹配,返回错误。

2. 如果所有输入面额的总和比输出的所有UTXO面额的总和少,返回错误。

3. 返回的S'会删除所有输入的UTXO,加上所有输出的UTXO

第一步的前半部分防止发送者花费不存在的币,后半部分防止发送者花费别人的币。第二步强调了价值平衡。为了将上面的状态转移函数用于支付,协议如下。假设爱丽丝想发送11.7btc给鲍勃。首先,爱丽丝找到一组她所有的可用的UTXO,总和至少是11.7btc。事实上,爱丽丝很难正好有11.7btc,她可以得到的最小的数是6+4+2=12。然后她创建了一笔交易,包含三个输入和两个输出。第一个输出是给鲍勃的11.7btc,第二个输出将是剩余的0.3btc的找零,是给爱丽丝自己的。

挖矿

如果我们访问的是值得信赖的中心化服务,这个系统很容易实现,它可以简单按照确切需求进行编码,使用中心化的服务器硬盘来跟踪状态。然而,比特币试图创建的是一个去中心化的货币系统,所以我们需要结合状态转化系统和共识系统,来确保每个人都同意交易的顺序。比特币的去中心化的共识过程需要网络中的节点不断尝试生成称为区块的交易包。该网络希望大致每十分钟生成一个区块,每个区块链包含一个时间戳,一个随机数,前一个块的引用(哈希),从前一个块产生后发生的所有交易的列表。随着时间的推移,这将创建一个持续的,不断增长的区块链,不断更新的区块链代表了比特币账本最新的状态。

检查一个区块是否有效的算法,在这个范例中,如下所示:

1. 检查该区块的上一个区块是否存在和有效。

2. 检查该区块的时间戳是否比上一个区块大,并且小于未来两个小时。

3. 检查区块上的工作量证明是否有效。

4. 设S[0]等于上一个区块结束时的状态。

5. 假设TX是区块内交易列表,包含n个交易。对于所有ii等于0n-1,设S[i+1]=APPLY(S[i],TX[i]),如果任意一步返回错误,该步骤退出并返回假。

6. 如果返回真,并且记录S[n]作为该区块后的状态。

基本上,该区块内的每一笔交易都要提供一个有效的状态转移,从这个交易执行之前的典型状态转移到一个新的状态。注意这个状态不会以任何方式在该区块编码记录。这是一个被验证节点记住的完全抽象的概念,要计算某个区块,只能从创世状态开始,对每一个区块依次应用每一笔交易。此外,要注意矿工打包交易进区块的顺序很重要,如果区块里有两笔交易ABB花费一个由A创建的UTXO,如果AB之前则区块有效,反之区块无效。

上面提到的一个验证条件是其他系统不需要的,这个验证条件是工作量证明。这个精确的条件是每一个区块的双SHA256哈希,作为256bit的数字,必须小于一个可以动态调整的目标值,截止到本文的时候,这个目标值接近2^187。这样做的目的是让区块的产生依靠计算难度,从而防止女巫攻击者按他们的利益重新创建整条区块链。因为SHA256被设计成一个完全不可预测的伪随机函数,创建有效区块的唯一方式就是简单的试错,不断对随机数进行递增然后计算检查哈希是否匹配。就现在目标值~2^187来说,网络在找到有效区块之前需要平均尝试~2^69次,通常网络每隔2016个区块会对目标值调整一次,这样让节点可以大概保持平均每十分钟产生一个区块。为了补偿矿工的计算工作,每个区块的矿工有权打包一个给自己12.5btc的交易,这个交易只有输出,没有输入。此外,如果任意一个交易输入的总面额比输出的高,这个差值也会作为交易手续费给矿工。顺便提一下,这也是比特币发行的唯一机制,创世状态一个币也没有。

为了更好的理解挖矿,我们检查一下当有恶意攻击的时候会发生什么。因为比特币底层的密码技术公认是安全的,攻击者将攻击比特币系统中没有被密码技术保护的部分:交易顺序。攻击者策略很简单:

1. 发送100btc给商户买商品(最好是快速交货的数字产品)

2. 等待交货

3. 产生另一个交易发送相同的100btc给自己

4. 试图说服网络发给他自己的那笔交易是最先来的

一旦第一步发生,几分钟后就有矿工打包这笔交易到区块,假设区块号270。大约一个小时候,又有5个区块产生,追加到刚才那个区块后面。这5个块中的每一个块都间接指向这笔交易,并且因此确认了它。这时候,商户将最终接受这个支付,并发货,因为我们假定是数字产品,发货是即时的。现在攻击者创建另一个交易,发送100btc给自己。如果攻击者简单的把这笔交易发出去,这笔交易是不会被处理的。矿工将会运行APPLY(S,TX),注意TX花费了状态里已经不存在的UTXO。所以,攻击者创建了一个区块链的分叉,从挖另一个版本的区块270开始,也指向同样的区块269,作为父区块,并且用新交易替换了旧的。因为区块数据不一样了,这需要进行工作量证明。进一步说,攻击者新版本的区块270的哈希不同,所以原来区块271~275并没有指向它,原来的链和攻击者的新链完全的分离的。规则是这样的,分叉中最长的链被认为是真实的,所以合法的矿工将在区块275的链上工作,只有攻击者自己在区块270的链上工作。攻击者为了让自己的链变成最长链,他需要有比其余所有矿工的组合更多的算力,这样才能追上(因此,发生51%攻击)。

默克尔树

左边:仅用很少的节点就可以证明一个分支的有效性。

右边:任何修改默克尔树某一部分的企图都会导致链上面的某个地方不一致。

比特币的一个重要的可扩展的特性是区块以多层数据结构存储。区块的哈希实际上仅仅是区块头的哈希,大约200字节数据,包含时间戳,随机数,前一个区块哈希和默克尔数的根哈希,默克尔树存储所有交易在区块里。默克尔树是一种二叉树,由一组节点组成,树的底部包含大量的叶子节点,其中包含底层数据,一组中间节点,每个节点都是两个孩子的哈希,最后生成一个单独的根节点,也是由两个孩子节点哈希成的,代表了树的顶部。使用默克尔树的目的是允许区块里的数据可以分离的传递:一个节点可以从一个来源仅下载区块头,从其他来源下载与他们有关的树的一小部分,并且仍然可以确保所有的数据都是正确的。为什么可以呢?因为哈希值是向上传播的:如果恶意用户想用一个假的交易和默克尔树底部的一个交易进行交换,这将使得上面的节点发生变化,进而这个节点上面的节点也发生变化,最后改变了树的根,也改变了区块的哈希,协议使得它作为一个完全不同的区块进行记录(几乎可以肯定是个无效的工作量证明)。

默克尔树协议对长期可持续发展是至关重要的。比特币网络的一个全节点,它存储每个区块的整体,2014年四月的时候比特币网络需要大概15GB的磁盘空间,并且以每个月以1GB的速度增加。现在对于一些桌面电脑还是可以的,但是手机不行,不远的将来只有企业和爱好者才能参与。一个被称为简化支付验证的协议允许其他类型的节点存在,我们叫它轻节点,他们下载区块链头,在上面验证工作量证明,然后仅下载和他们有关的交易的分支。这允许轻节点很安全的确定任意一个比特币交易的状态和他们的余额,虽然仅下载整个区块链很小的一部分。

非传统的区块链应用

将区块链思想应用到其它领域的想法早就出现了。1998年,尼克·萨博提出了《用所有权为财产冠名》的概念,这个文档描述了可复制数据库技术新进展,将允许一个基于区块链的系统登记土地所有权,创建了一个精心设计的框架,它包含一些概念比如宅地,非法占有和乔治亚洲土地税。然而,很遗憾那时候并没有一个实用的可复制数据库系统,这个协议从未被实践过。可是2009年后,自从比特币的去中心化共识被开发出来,大量非传统应用开始迅速出现。

---名字币 – 2010年创建,名字币是被很好的描述成一个去中心化名字注册数据库。在去中心化协议里,像洋葱路由,比特币和比特信,需要一种识别账户的方式使得他们可以进行交互,但是所有已有的解决方案里,可用的识别码是一个伪随机数就像1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy。理想情况是能有一个名字叫像"乔治"这样的的账户。然而,问题是如果一个人可以用乔治创建一个账户,然后其他人也以同样的步骤注册乔治,冒充他。仅有的方案是使用第一申请范式,第一个可以注册成功,第二个失败 这是一个完全适合比特币共识协议的问题。名字币是最早的,最成功的用这个思想实现的名字注册系统。

---彩色币 彩色币协议为人们在比特币区块链上创建他们自己的数字货币 或者,在更重要的一般意义上的货币(数字通证)提供服务。按照彩色币的协议,人们通过给特定的比特币UTXO分配一种颜色来发行新币,协议还递归的定义了其他UTXO和交易输入拥有一样的颜色(一些特别的规则应用在混合颜色输入的情况)。这允许用户的钱包仅包含一种特定颜色的UTXO,并且可以像普通比特币一样发送他们,通过回溯区块链来确定他们收到任意一个UTXO的颜色。

---元币 元币背后的理念是建立在比特币之上的协议,用比特币交易存储元币交易,但是状态转换函数不一样,记为APPLY'。因为元币协议不能阻止比特币区块链上出现的无效的元币交易,在APPLY'(S,TX)返回错误的时候增加一个规则,协议默认是APPLY'(S,TX) = S。这为创建任意的加密货币协议提供了一个简单的机制,这些高级特性靠比特币本身不能实现,而且开发成本也很低,因为复杂的挖矿和网络问题已经由比特币协议处理好了。元币被用于实现几个类型的金融合约,名字注册和去中心化交易所。

因此,一般来说,有两种方法来建立共识协议:建立一个独立的网络,在比特币上建立一套协议。前一种方法很难实现,尽管像名字币这样的应用已经获得了成功。每个应用都需要创立独立的区块链,建立和测试所有可能的状态转移和网络代码。另外,我们预测去中心化技术的应用将会服从幂律分布,大多数应用太小不足以保证区块链的安全,我们还注意到现有的大量的去中心化应用,尤其是去中心化组织,需要互相交互。

另一方面,基于比特币的方法缺点是无法继承简化支付验证的特性。比特币之所以可以实现简化支付验证,是因为它使用区块深度作为验证区块有效的代理。在这点上,一旦一个交易的祖先追溯到足够远的地方,就可以安全的说它是状态的合法部分。与之相反,基于区块链的元币协议,不能强制要求区块链不包含不符合元币协议的交易。因此,一个元币协议版本的完全安全的简化支付验证版本需要向后扫描所有的区块链确认某些交易是否有效。所有基于比特币的元币协议的轻实现依靠一个可信赖的服务器提供数据,可以说是一个非常不理想的结果,尤其是当一个加密货币不需要依赖信任的时候。

脚本

即使没有任何扩展,比特币协议实际上也可以实现智能合约的一个弱化版本。比特币的UTXO不仅可以被一个公钥所有,也可以由一个复杂脚本所有,这个脚本是用一个简单的基于堆栈的编程语言实现的。在这种范式下,要花费这个UTXO的交易必须提供数据满足这个脚本。实际上,基本的公钥所有权机制也是通过一个脚本的实现的:脚本将椭圆曲线的数字签名作为输入,通过它验证交易和UTXO所有者的地址,如果验证成功就返回1,反之返回0。更复杂的脚本用于其他更复杂的场景。比如,一个人可以创建一个脚本,这个脚本需要三个中的两个私钥签名来验证(多签),这对企业账户,安全储蓄账户,某些商业代理来说这种设置非常有用,脚本也可以用于对解决问题的用户发赏金,一个人可以创建这样一个脚本,"如果你能够提供已经发送一定面额的狗狗币给我的简化验证支付证明,这个比特币的UTXO就是你的了",基本上允许不同的加密货币之间进行交换。

然而,比特币中实现的脚本语言有几个重要限制:

---缺少图灵完备性 也就是说,虽然比特币脚本语言支持多种计算,但它也不是无所不能。最主要的缺失是循环。这么做的原因时防止验证交易时出现无限循环。理论上,这个是程序员可以克服的障碍,因为任何一个循环通过简单的多次执行相应的if语句的代码来模拟,但它会导致脚本在空间上的低效。比如,实现一个替代的椭圆曲线签名算法,这种算法可能需要256轮的乘法操作,每轮操作都需要单独写代码。

---价值盲 UTXO脚本没有方法对取款额度进行精细的控制。比如,预言机合约的一个强大的应用就是对冲合约,AB同时向对冲合约发送价值1000美元的比特币,30天后,脚本向A发送1000美元的比特币,向B发送剩余的比特币。这需要预言机确定1btc值多少美元,但是与现在已经在用的完全中心化的方案相比,这个方案已经在信任和基础设施方面有了巨大的改进。然而,因为UTXO是不可细分的,唯一的方法就是非常低效的采用很多不同面值的UTXO(比如,有一个2kUTXOk最大是30)并用预言机选择哪些UTXO发给A,哪个发给B

---缺少状态 UTXO只能是花费或未花费状态,对于多阶段合约或脚本就无法实现,因为除了这两个状态还需要某些其他内部状态。这使得实现多阶段期权合约,去中心化交换要约或两阶段加密承诺协议(安全的计算奖励非常必要)非常困难。它也意味着UTXO只能用于建立简单的,一次性的合约,而不是建立复杂的多状态的合约,比如去中心化组织,使得元币协议很难实现。二元状态结合价值盲也意味着另外一个重要的应用,取款限制无法实现。

---区块链盲 UTXO对区块链数据一无所知,比如随机数,时间戳和上一个块的哈希。这一缺陷剥夺了脚本语言中有价值的随机性的来源,严重限制了博彩等其他领域的应用。

因此,我们看到了三种在加密货币上构建高级应用的方法:创建一个新的区块链、使用比特币上的脚本、在比特币上建立一个元币协议。构建一个新的区块链,允许自由无限制的实现任意特性,但是需要很大的投入。使用脚本的方法非常容易实现和标准化,但是能力非常有限,还有元币协议,虽然容易,但是存在扩展性差的缺陷。用以太坊,我们想构建一个替代的框架,在开发易用性上提供更大的好处,还有更强大的轻客户端属性,同时允许应用程序共享经济环境和区块链的安全性。