以太坊黄皮书连载(一)

天露   |     |   3077 次阅读

以太坊:一种安全去中心化的通用性交易账本

“家园”(Homestead)版本


翻译作者:Jorden Gao 邮箱:gaotl33@126.com / tianlu.jorden.gao@gmail.com
本文作者:Dr. Gavin Wood,以太坊&Ethcore的创始者 邮箱:GAVIN@ETHCORE.IO

摘要:以下是一个实行密码保护交易的区块链范例,而且它已经通过很多项目展示了它的实用性且不亚于比特币。每个单独的项目都能被看成是一个个基于去中心化但独立在电脑资源上的简单应用。我们称这个范例为共享状态和可交易的独立机构。
以太坊完成这个范例只是采用一个通用的方法。在未来,以太坊会提供大量的资源,每一个都是截然不同的状态和可操作的代码,但是它们能通过一个通信框架去和其他的交流。我们讨论了它的设计、实现难题、提供的机会、和我们想象的未来障碍。

1. 简介

随着万能的网络连接在世界上多数城市的发展,全球信息共享的成本越来越便宜。像比特币这样的技术层次的运动已经出现,与此同时它已经与世界分享和完全被免费使用,通过一个可能利用网络设计成的去中心化的价值转移系统的默认的算力、公式机制、和自愿遵守的社会合约。这个系统对于加密安全学来说,能被说成是一个非常特别的特例因为它是基于交易的状态机。域名币(Namecoin)作为进一步发展货币,虽然它是很简单的一种,但是它的系统实现了这样的技术从原有的“货币应用”到其他的应用中。
以太坊是一个去尝试建立通用性技术的项目;这些技术可能全部被建立于基于交易的状态机的概念上。而且以太坊准备去提供一个紧凑地综合的端对端的系统给终端开发者,其目的是为了开发至今还没有发开的电脑软件实例软件:一种通过电脑通信的可信任机制框架。
驱动因素。 以太坊有很多的目标,其中最重要的目标是为了简化个体之间存在互相不信任对方的交易。这些不信任可能是因为地理分离(远距离)、接口对接难度、或者是不兼容、不称职、不情愿、不便宜、不确定、不方便或者现有合法系统的腐败。于是,我们想用一个丰富且清晰的语言去说明一个转台改变的系统,和去搭建一个能自动执行一个争论而且能给我们理想的期望值的系统,最后能给出一个方案去研究这个系统。
在研究这个系统的过程中发现在现实世界有几个属性很难被找到。最难被找到的就是正义清廉化,因为它来自于清廉的算法程序员。其次是透明化,或者说能够清晰的看见一个状态或者一个决断如何传出交易日志和规则或者代码。它几乎没有完美地发生在基于人性的系统之上,因为自然语言的必要含糊,信息经常性的遗漏,和一成不变的思想导致透明化很能去实现。
总的来说,我希望能发明一个系统,用户能被保证他们的交易是安全的,无论是和其他个体、系统还是组织。而且用户们都能完全放心的处理这些可能的结果和将这些结果实现。
前期事迹。2013年9月下旬,Buterin第一次提出这种工作的系统机制。虽然现在发展成了很多方法,但是这主要的区块链功能是有一个图灵完备的语言和有效地不受限制和不可改变的互相交易模式下的储存剩余容量。
早在1992年,Dwork和Naor就提出了用一种通过网络去传输价值信号和密码学的方法去证明电脑工作量(“proof-of-work”)。在这里,这些价值信号是当成一个阻挡垃圾邮件的机制,而不是任何一种货币。但是在多番证明后,这个潜在的基础数据通道可以携带一个强大的金融信号,同时允许一个接收器去做一个不依赖与信任的物理断言。2002下半年一种类似血管(vein)的系统被发明。
第一个为强大的金融信号做电脑工作量证明,从而去保护一种货币的范例在2003年被Vish-numurthy et al使用。在这个案例中,它的令牌被用作去保持p2p(peer-to-peer)的交易文件在支票中,同时保证“消费者们”能操作微付(pay)到为他们提供服务的“供应商”的账户上。这种通过工作量证明的安全模式在电子签名技术、可以确保历史记录不能破坏的账本技术、和怀有恶意的行为不能欺骗付费或者不满意的服务交货抱怨的技术下被扩大。五年后(2008年),Nakamoto介绍了另一种广义下安全的工作量证明的价值令牌。比特币成为这个项目下的产物,而且它是第一个广泛被全球接受的去中心化交易账本。
由于比特币的成功,电子货币项目开始兴起;通过改变它的协议去创建数以千计其他的货币。2013年Sprankel讨论比较知名的币有莱特币(Litocoin)和素数币(Primecoin)。而其他的项目在探索这个协议的价值性的核心内容机制和完善它;例如2012年,Aron讨论了这个域名币(Namecoin)的项目,而且准备去规定一个去中心化的域名争议解决方案系统。
剩下的项目基本都是以共识机制的原则建立于比特币之上,同时借助这个系统的庞大价值和巨大的算力。2013年,第一个被Willett提议的万事达币(Mastercoin)项目,它的目标是通过从属插件的数字使用去创建一个比比特币上层协议还有更多,更高级的特性的丰富的核心协议。2012年,彩色币(Coloured Coins)项目被Rosenfeld提出,去简化这些协议但是保持功能一样,同时润色了这个交易的规则为了打破比特币的基础货币的替代性和允许通过特别的色度钱包(“chroma-wallet”)创造和跟踪这些令牌 – 感知协议的软件碎片。
在这个区域剩下的工作已经被完成通过放弃一些去中心化基础;2014年,Boutellier和Heinzen讨论了瑞波币(Ripple)。它已经探索出并创建了一个货币兑换的联邦系统(“federated ”system),同时有效地创建了一个新的金融结算系统。这个金融系统展示了高效的收益能被创造如果去中心化基础能被放弃。
在1997年,Szabo和Miller已经完成了早期的智能合约(“smart contract”)。上个世纪90年代,算法执行的协议在人类合作中起着重大的作用,这个理念已经变得很清晰。虽然当时没有设计出任何特别的方法去实现这样的系统,但是它已经被提出这样的系统会严重地影响未来的法律。在这个预言下,以太坊可能被看成完成了这样密码学法律的系统的成就。

2.区块链的实例

以太坊,作为一个整体,能被看成是一个基于交易的状态机:我们开始于一个创世块(“Genesis”)状态,然后伴随着执行交易的写入到最后的状态。这个最后状态是我们能接受的权威的版本在以太坊世界。这个状态保存了一下信息,比如账号的余额、名誉度、信誉度、和附属的现实世界的数据。总而言之,最近能被电脑描绘的任何事都是合理的。因此,交易就代表了两个状态的有效桥梁;这个“有效”是很重要的 – 因为这里存在无效的状态改变远远超过有效的状态改变。举一个例子:无效的状态改变可能是这里减少了一个账号的余额,但是没有在其它任何账号上加上同等的额度。然而,一个有效的状态转换是来自一个交易。公式上:
(1) σ(t+1) ≡ γ(σt,T)
其中γ是以太坊的状态交换函数。在以太坊中γ与σ是相当地强大超过现存任何的类似系统;γ允许部分成分去实现特有的计算,相比下σ允许部分成分存贮特有的状态在交易间。
交易是被校对在区块中;区块采用一种密码学的哈希值(hash)作为参考方法被“链子”链接起来。区块充当一个日记,记录着一系列与之前区块的交易和鉴定最后一个状态(虽然它不能通过自己存贮最后状态 – 因为这个区块链会一直增加)。他们也标记这些交易系列为了激励节点去挖矿。这样的激励作为状态转换函数发生,同时增加相应的价值到一个特定的账号。
挖矿是一个奉献努力的过程,这个过程是为了维持交易链(区块链)在任何一个潜在的竞争块中。它是由于一种密码学上安全证明的方式被实现。这个工作量证明的体制(POW)是众所周知,会在11.5小结讨论更多的细节。
公式上,我们张开成:
(2) σ(t+1) ≡ Π(σt,B)
(3) B ≡ (…,(T0,T1,…))
(4) Π(σt,B) ≡Ω(B,γ(γ(σ,T0 ),T1)…)
其中Ω是区块完成状态转换函数(这个函数是奖励一个特有的团体);B是这个区块,它包含了某些成分中的一系列交易;Π是区块等级(“block-level”)状态转换函数。
上述是区块链范例的基础,这种模型不仅仅只是形成了以太坊的基础结构,而是迄今为止所有基于共识去中心化的交易系统。
价值。为了去激励网络的算力,这里需要一种方法去被定义交易价值。为了解决这个问题,以太坊设计了一个固有的币,以太币(“Ether”),ETH是大家所知的符号,有些时候用古老的D(“Д)描述。以太币最小的面额是位(“Wei”),因为位能在货币中所有整数值进行计数。一个以太币被定义成10^18位。这里还有以太币的其他面额值:

Multiplier Name
10^0 Wei
10^12 Szabo
10^15 Finney
10^18 Ether

纵观目前的工作,无论是任何价值的参考、以太币的内容、货币、还是余额或者支付,都应该被看成用“位”来计算。
它的历史?因为这是一个去中心化的系统而且所有的团队都有机会在一些之前的区块上去建立新的区块,这个合成的架构必然是区块链树。为了去形成一个共识,路径通过这种架构从底部(创世块)到叶子(包含最新交易的区块),这就是众所周知的区块链,这里必须都去共识。如果某个时段在最长的区块链中节点之间有一个争论,那么分叉(“fork”)出现。
这个就意味着过去给定的时间点(区块)和系统的多个状态共存:一些节点相信一个区块是包含标准的交易,其他的节点则相信另外一些区块包含标准的交易,其中就包含彻底不同或者不兼容的交易。这也是为了去避免所以不确定的代价,因为它会破坏整个系统中的所有信用。
计划去产生共识,我们使用了一个简单GHOST协议版本。这个协议在2013年被Sompolinsky和zohar提出。我们会在10小结描述它的细节。

3.协定

我用了大量的印刷体协定去表示正式的符号,其中一些对于现在的工作来说是非常具有意义:
这两个高度结构化的集合中,高标准(“high-level”),状态值,被指的是粗体小写的希腊字母。他们注入了全局状态(“world-state”)并且被用σ代表(或者一个变体的thereupon)和机器状态(“machine-state”)被用μ代表。
在高度结构化值中,可操作函数(“function operating”)被表示成一个大写的希腊字母,例如:γ,同时也是以太坊中的状态转换函数。
对于更多的函数来说,通常用一个大写的字母,例如:C,通用的费用函数。这些也可能作为下角标被表示为一些特别的变量,例如:CSSTORE,费用函数中的SSTORE操作。对于特别的和可能外形清晰的函数,我可能设计成了打印机的文字,例如:Keccak-256哈希函数(按获奖作品SHA-3竞赛函数)被用KEC表示(通常是用来解释Keccak)。还有KEC512也正在被用作去表示Keccack-512哈希函数。
数组通常也是用一个大写字母去代表,例如:T,被用作去表示一个以太坊的交易。如果相对下地定义,这个符号可能成为下角标用去表示一个独立的成分,例如:Tn,表示上述交易的随机数。这些下角标的形式用于表示它们的类型;例如:大写的下角标表式带有下角标成分的数组。
标量和固定大小的字节顺序(或者同义字,数组)都能用小写的字母来表示,例如:n在数据文件中被用来一个交易的随机数。小写的希腊字母能代表一些特别的含义,例如:δ表示为所需的项目数在堆栈上所对应的操作。
任意长度的序列通常用加粗的小写字母表示,例如O被表示为信息调用中输出数据的字节序列。有时候,加粗的大写字母表示一些特别重要的值。
总体来说,我们认为标量都是正整数而且属于集合P。字节序列的集合是B,我们在附件B中书写了正式的定义。如果像这样的序列集合被限制它们的特有的长度,它能用下角标符号去代表。因此字节为32的所有序列集合命名为B32,所有正整数小于2^256的集合命名为P256。正规定义将会在4.4小结讨论。
正方形括号被用作索引和代表独立的成分或者序列下的子序列,例如:μs [0]表示计算机堆栈中的第一个数字。对于子序列来说,省略号被用作具体去说明一定的范围,且含头尾的限制元素,例如:μm [0…31]表示计算机内存中的第一个32数字。
在全局状态的情况下,σ是一个含多个账号的序列,本身的数组,正方形括号被用作去表示一个单独的账号。
当去考虑现有的变量时,我遵循在给定的范围内去定义的原则,如果我们认为这些不可修改的输入值将被用□(“占位符”)来表示,可修改和有用的值用□^’表示,中间的值则用□,□() &c。在非常特别的场合下,为了扩大可读性和清晰性,我可能会使用字母-数字下角标表示中间值,尤其他们是特别的。
当去考虑去用现有的函数时,给定一个函数f或者f
,其中序列之间替换了函数之间的映射关系。他们将被正式的定义在4.4小节。
全过程中,我定义了很有有用的函数。最常见的是函数是l (小写L),功能是计算给定序列的最后一个数字:
(5) l(X) ≡X[ || X ||- 1]*

原文:http://gavwood.com/Paper.pdf (也可以联系我,我可发PDF原文给你)
本人第一次翻译文章,如有错误,请留言联系或邮箱讨论,谢谢!

 
7 人喜欢