以太坊白皮书
发布于 3 年前 作者 qinxingyi 699 次浏览 来自 7*24快讯

以太坊白皮书 这个介绍论文最初发表于2013年维塔利克·巴特林,的创始人复仇,该项目在2015年推出它的值得指出的是复仇,像许多社区驱动的开源软件项目,自最初成立以来发展之前。

虽然已有数年之久,但我们仍保留该论文,因为它继续作为有用的参考和对以太坊及其愿景的准确表示。要了解以太坊的最新发展以及如何对协议进行更改,我们建议您使用本指南。

下一代智能合约和去中心化应用平台 中本聪(Satoshi Nakamoto)在2009年开发的比特币经常被誉为货币和货币的激进发展,是数字资产的第一个示例,它同时没有支持或内在价值 ,也没有集中的发行者或控制者。但是,比特币实验的另一个(可能更重要的)一部分是作为分布式共识工具的基础区块链技术,人们的注意力正在迅速转移到比特币的另一个方面。普遍引用的区块链技术替代应用包括使用区块链上的数字资产代表自定义货币和金融工具(彩色硬币),底层物理设备的所有权(智能财产)。),域名等非替代性资产(Namecoin),以及更复杂的应用程序,涉及由实施任意规则的代码直接控制数字资产(智能合约),甚至是基于区块链的分散式自治组织 (DAO) 。以太坊打算提供的是一种带有内置完整成熟的图灵完备编程语言的区块链,该语言可用于创建可用于编码任意状态转换函数的“合约”,从而允许用户创建上述任何系统,以及我们尚未想到的许多其他功能,只需通过几行代码编写逻辑即可。

比特币和现有概念简介 历史 去中心化数字货币的概念以及财产登记等替代应用已经存在了数十年。1980年代和1990年代的匿名电子现金协议主要依赖于一种被称为Chaumian盲法的加密原语,为货币提供了高度的隐私性,但是由于依赖于中央中介机构,这些协议在很大程度上未能获得关注。1998年,戴巍的 b-money成为第一个提出通过解决计算难题以及去中心化共识来创造金钱的想法的建议,但该建议在如何实际实施去中心化共识方面没有任何细节。2005年,Hal Finney引入了可重复使用的工作证明概念,该系统使用来自b-money的想法以及Adam Back的计算困难的Hashcash难题来创建一种加密货币的概念,但由于依靠可信计算作为后端,这又一次超出了理想。2009年,中本聪首次在实践中实施了一种去中心化货币,将通过公钥密码管理所有权的既定原语与用于跟踪谁拥有硬币的共识算法(称为“工作证明”)相结合。

工作量证明背后的机制是该领域的一项突破,因为它同时解决了两个问题。首先,它提供了一种简单而适度有效的共识算法,允许网络中的节点共同商定一组关于比特币分类账状态的规范更新。其次,它提供了一种机制,允许自由进入共识过程,解决了决定谁可以影响共识的政治问题,同时防止了锡比尔攻击。它通过替换正式的参与障碍(例如要求在特定列表中注册为唯一实体)和经济障碍来实现此目的-共识投票过程中单个节点的权重与计算能力成正比节点带来的。自那以后,权益证明,将节点的权重计算为与其货币持有量成正比,而不与计算资源成正比;关于这两种方法的相对优点的讨论不在本文讨论范围之内,但应注意,这两种方法都可以用作加密货币的骨干。

这是以太坊创始人Vitalik Buterin撰写的有关以太坊史前史的博客文章 。 这 是具有更多历史的另一篇博客文章。

比特币作为国家过渡系统 以太坊状态转换

从技术角度来看,可以将诸如比特币之类的加密货币的分类帐视为状态转换系统,其中存在一个“状态”,该状态由所有现有比特币的所有权状态组成,而一个“状态转换函数”则采用一个状态并进行交易,并输出结果的新状态。例如,在标准银行系统中,状态是资产负债表,交易是将$ X从A转移到B的请求,状态转换函数将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个字节的地址定义,本质上是一个加密的公共密钥fn。1)。事务包含一个或多个输入,每个输入包含对现有UTXO的引用和由与所有者地址相关联的私钥产生的加密签名,以及一个或多个输出,每个输出包含要添加到的新UTXO。状态。

状态转换函数APPLY(S,TX) -> S’可以大致定义如下:

对于中的每个输入TX:

如果引用的UTXO不在中S,则返回错误。 如果提供的签名与UTXO的所有者不匹配,则返回错误。 如果所有输入UTXO的面额之和小于所有输出UTXO的面额之和,则返回错误。

返回S’所有输入UTXO删除,并添加所有输出UTXO。

第一步的前半部分防止交易发送者花费不存在的硬币,第一步的后半部分防止交易发送者花费其他人的硬币,而第二步则强制保护价值。为了将其用于支付,协议如下。假设爱丽丝想向鲍勃发送11.7 BTC。首先,Alice将寻找一组她拥有的可用的UTXO,其总数至少为11.7 BTC。实际上,爱丽丝将无法准确获得11.7 BTC;说她能得到的最小数是6 + 4 + 2 = 12。然后,她使用这三个输入和两个输出创建一个事务。第一个输出将是11.7 BTC,以Bob的地址作为其所有者,第二个输出将是剩余的0.3 BTC“更改”,所有者是Alice自己。

矿业 以太坊区块

如果我们可以访问值得信赖的集中式服务,那么该系统的实施将非常简单;只需使用集中式服务器的硬盘驱动器跟踪状态,就可以完全按照描述的方式对其进行编码。但是,对于比特币,我们正在尝试构建去中心化的货币系统,因此我们需要将状态转换系统与共识系统结合起来,以确保每个人都同意交易顺序。比特币的去中心化共识过程要求网络中的节点不断尝试产生称为“区块”的交易包。该网络旨在每十分钟产生大约一个块,每个块包含一个时间戳,一个随机数,一个引用(即 上一个区块的哈希值,以及自上一个区块以来发生的所有交易的列表。随着时间的流逝,这将创建一个持续不断增长的“区块链”,该区块链会不断更新以表示比特币分类账的最新状态。

此范例中表示的检查块是否有效的算法如下:

检查该块引用的前一个块是否存在并且有效。 检查该块的时间戳是否大于前一个块的时间戳。2 和小于2小时到未来 检查块上的工作证明是否有效。 我们S[0]是在先前块结束的状态。 假设TX是带有n交易的区块交易列表。对于iin中的所有0…n-1,请设置S[i+1] = APPLY(S[i],TX[i])如果有任何应用程序返回错误,请退出并返回false。 返回true,并S[n]在此块末尾注册为状态。 本质上,该块中的每个事务必须提供从事务执行之前的规范状态到某个新状态的有效状态转换。注意状态没有以任何方式编码在块中。它纯粹是验证节点要记住的一种抽象,只能通过从创始状态开始并按顺序在每个块中应用每个事务,才能(安全地)为任何块计算该抽象。此外,请注意,矿工将交易纳入区块的顺序很重要;如果一个区块中有两个事务A和B,使得B花费了A创建的UTXO,那么如果A在B之前,则该区块有效。

上面列表中存在的一个有效条件是在其他系统中找不到的,是对“工作量证明”的要求。精确的条件是,每个块的double SHA256哈希(视为256位数字)必须小于动态调整的目标,在撰写本文时,该目标约为2 187。这样做的目的是使计算块的创建变得“困难”,从而防止sybil攻击者以他们的喜好重新构建整个区块链。因为SHA256被设计为完全不可预测的伪随机函数,所以创建有效块的唯一方法是反复试验,反复增加随机数并查看新哈希是否匹配。

在当前目标〜2 187,网络必须使平均的〜2 69次的有效块被发现之前的尝试; 通常,网络每隔2016个块对目标进行一次重新校准,因此平均而言,网络中的某个节点每隔十分钟会产生一个新块。为了补偿矿工的计算工作量,每个区块的矿工都有权包括一笔无偿提供12.5 BTC的交易。此外,如果任何交易的输入总面额高于输出的总面额,则差额也作为“交易费”分配给矿工。顺便说一句,这也是发布BTC的唯一机制。起源状态根本不包含任何硬币。

为了更好地理解挖掘的目的,让我们检查一下恶意攻击者发生的情况。由于已知比特币的底层加密是安全的,因此攻击者将针对比特币系统不受加密直接保护的部分:交易顺序。攻击者的策略很简单:

向商家发送100 BTC,以换取某些产品(最好是快速交货的数字商品) 等待产品交付 产生另一笔交易,向自己发送相同的100 BTC 尝试说服网络,他对自己的交易是第一笔交易。 一旦执行了步骤(1),几分钟后,一些矿工将交易包含在一个区块中,例如区块编号270。大约一小时后,该区块之后的链中将再添加五个区块,每个区块这些块间接指向交易并因此“确认”交易。此时,商家将接受最终确定的付款并交付产品;由于我们假设这是一种数字商品,因此交付是即时的。现在,攻击者创建了另一个向自己发送100 BTC的交易。如果攻击者只是简单地将其释放到野外,则不会处理该交易;矿工将试图逃跑,APPLY(S,TX)并注意到TX消耗不再处于状态的UTXO。因此,取而代之的是,攻击者创建了区块链的“分叉”,首先是挖掘块270的另一个版本,该版本指向与父代相同的块269,但新的交易代替了旧的交易。由于块数据不同,因此需要重做工作量证明。此外,攻击者的块270的新版本具有不同的哈希值,因此原始块271至275不会“指向”它;因此,原始块271至275不会“指向”它。因此,原始链和攻击者的新链是完全分开的。规则是,用叉子最长的区块链才是事实,因此合法的矿工将在275链上工作,而仅攻击者在270链上工作。为了使攻击者能够使自己的区块链最长,

默克尔树 比特币中的SPV

左:仅在Merkle树中显示少量节点即可证明分支的有效性。

正确:尝试更改Merkle树的任何部分最终都会导致链上某些地方出现不一致。

比特币的重要可伸缩性功能是,该块存储在多级数据结构中。块的“哈希”实际上只是块头的哈希,大约200字节的数据,其中包含时间戳,随机数,先前的块哈希以及称为Merkle树的数据结构的根哈希,该数据结构存储所有事务在块中。默克尔树(Merkle tree)是一种二叉树,由一组节点组成,在该树的底部包含大量底层节点,包含基础数据;一组中间节点,其中每个节点是其两个子节点的哈希,最后是单个根节点,该节点也由其两个子节点的哈希组成,代表树的“顶部”。Merkle树的目的是允许块中的数据零散地传递:一个节点只能从一个源下载块的标头,而从另一源下载与它们相关的树的一小部分,并且仍然可以确保所有数据都是正确的。之所以可行,是因为哈希向上传播:如果恶意用户试图将假交易交换到Merkle树的底部,则此更改将导致上方节点的更改,然后导致上方节点的更改。 ,最后更改树的根并更改块的哈希值,从而导致协议将其注册为完全不同的块(几乎可以肯定带有无效的工作证明)。

默克尔树协议可以说对于长期可持续性至关重要。比特币网络中的一个“完整节点”,用于存储和处理每个块的全部内容,截至2014年4月在比特币网络中占据约15 GB的磁盘空间,并且每月增长超过1 GB。当前,这对于某些台式机而不是电话是可行的,并且在以后的将来,只有企业和业余爱好者才能参加。称为“简化付款验证”(SPV)的协议允许存在另一类节点,称为“轻型节点”,这些节点下载块头,验证块头上的工作量证明,然后仅下载“分支”与与之相关的交易相关联。

替代区块链应用 采取底层区块链概念并将其应用于其他概念的想法也有悠久的历史。1998年,Nick Szabo提出了拥有所有者权限的安全产权的概念,该文档描述了“复制数据库技术的新进展”将如何允许基于区块链的系统存储谁拥有土地的注册管理机构,精心设计的框架,包括房屋维护,逆权管有和格鲁吉亚土地税等概念。但是,不幸的是,当时没有有效的复制数据库系统可用,因此该协议从未在实践中实施。但是,在2009年之后,一旦比特币的去中心化共识得以制定,许多替代应用便迅速出现。

Namecoin-创建于2010年,Namecoin最好地描述为一个分散的名称注册数据库。在Tor,Bitcoin和BitMessage等去中心化协议中,需要某种方法来识别帐户,以便其他人可以与它们进行交互,但是在所有现有解决方案中,唯一可用的标识符是伪随机哈希,例如 1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy。理想情况下,人们希望能够拥有一个名称为“ george”的帐户。但是,问题在于,如果一个人可以创建一个名为“ george”的帐户,那么其他人也可以使用相同的过程为自己注册“ george”并模拟他们。唯一的解决方案是从第一个到第一个文件的范例,其中第一个注册器成功,第二个注册器失败-这个问题非常适合比特币共识协议。Namecoin是使用这种思想的最古老,最成功的名称注册系统的实现。 彩色金币-目的彩色硬币 是作为一个协议,让人们创建自己的数字货币-或者,在货币的重要琐碎的情况下一个单元,数字标记,在比特币blockchain。在有色硬币协议中,通过公开为特定的比特币UTXO分配颜色来“发行”一种新货币,并且该协议以递归方式将其他UTXO的颜色定义为与创建它们的交易所用输入的颜色相同。 (某些特殊规则适用于混合色输入)。这使用户可以维护仅包含特定颜色的UTXO的钱包,并像常规比特币一样将它们发送到周围,在区块链中回溯以确定他们收到的任何UTXO的颜色。 Metacoins - Metacoin背后的想法是拥有一个生活在比特币之上的协议,该协议使用比特币交易来存储Metacoin交易,但具有不同的状态转换功能APPLY’。由于metacoin协议无法阻止无效的metacoin交易出现在比特币区块链中,因此添加了一条规则,如果APPLY’(S,TX)返回错误,则该协议默认为APPLY’(S,TX) = S。这提供了一种创建任意加密货币协议的简便机制,该协议可能具有无法在比特币本身内部实现的高级功能,但开发成本非常低,因为挖掘和联网的复杂性已由比特币协议处理。元硬币已用于实现某些类别的金融合同,名称注册和分散交易。 因此,通常,有两种方法来建立共识协议:建立一个独立的网络,以及在比特币之上建立一个协议。前一种方法虽然在Namecoin之类的应用程序中相当成功,但难以实施;每个单独的实现都需要引导一个独立的区块链,以及构建和测试所有必要的状态转换和联网代码。此外,我们预测去中心化共识技术的应用程序集将遵循幂律分布,其中绝大多数应用程序太小而不能保证拥有自己的区块链,并且我们注意到存在大量的去中心化应用程序类别,尤其是去中心化自治系统组织,需要彼此交互。

另一方面,基于比特币的方法具有一个缺点,即它不继承比特币的简化付款验证功能。SPV适用于比特币,因为它可以使用区块链深度作为有效性的代理。在某个时候,一旦交易的祖先走得足够远,可以肯定地说他们是国家的合法组成部分。另一方面,基于区块链的元协议不能强制区块链不包括在其自身协议范围内无效的交易。因此,一个完全安全的SPV元协议实现将需要一直反向扫描到比特币区块链的开始,以确定某些交易是否有效。目前,所有基于比特币的元协议的“轻型”实施都依赖于受信任的服务器来提供数据,

脚本编写 即使没有任何扩展,比特币协议实际上也确实促进了“智能合约”概念的弱版本。比特币中的UTXO不仅可以由公钥拥有,还可以由以简单的基于堆栈的编程语言表达的更复杂的脚本拥有。在这种范式中,一笔交易花费了UTXO必须提供满足脚本的数据。实际上,甚至基本的公共密钥所有权机制都是通过脚本实现的:该脚本采用椭圆曲线签名作为输入,根据事务和拥有UTXO的地址对其进行验证,如果验证成功,则返回1,否则返回0。对于各种其他用例,还存在其他更复杂的脚本。例如,一个人可以构造一个脚本,该脚本需要给定三个私钥中的两个进行签名(“

但是,用比特币实现的脚本语言有几个重要限制:

缺乏图灵完整性-也就是说,尽管比特币脚本语言支持很大一部分计算,但它几乎不支持所有功能。缺少的主要类别是循环。这样做是为了避免在事务验证期间出现无限循环。从理论上讲,这对于脚本程序员来说是一个无法克服的障碍,因为任何循环都可以通过简单地使用if语句重复底层代码多次来模拟,但这确实导致了脚本的空间效率非常低。例如,实现替代的椭圆曲线签名算法可能会需要256个重复的乘法回合,每个回合都单独包含在代码中。 价值盲目-UTXO脚本无法对可提取的金额提供细粒度的控制。例如,甲骨文合同的一个强大用例是对冲合同,其中A和B投入了价值$ 1000的BTC,脚本在30天后向A发送了价值$ 1000的BTC,其余向B发送。甲骨文确定1 BTC的美元价值,但即使这样,与现在可用的完全集中化解决方案相比,这在信任和基础结构要求方面还是一项巨大的改进。但是,由于UTXO是全有或全无,因此实现此目标的唯一方法是通过非常低效的破解方法,即拥有许多不同面额的UTXO(例如,最多30个k中的每2 k一个UTXO ),并选择O UTXO发送给A,哪个发送给B。 缺乏状态的-一个UTXO既可以花费或未用; 多阶段合同或脚本没有机会保留超出此范围的任何其他内部状态。这使得很难制定多阶段期权合约,分散交易报价或两阶段密码承诺协议(安全计算赏金所必需)。这也意味着UTXO仅可用于建立简单的一次性合同,而不能用于构建诸如分散组织之类的更复杂的“有状态”合同,从而使元协议难以实施。二进制状态与价值盲目相结合还意味着另一个重要的应用程序,即撤回限制,是不可能的。 区块链盲目性-UTXO对诸如随机数,时间戳和先前区块哈希等区块链数据视而不见。通过剥夺脚本语言潜在的宝贵随机性,这严重限制了赌博以及其他几个类别的应用。 因此,我们看到了三种在加密货币之上构建高级应用程序的方法:构建新的区块链,在比特币之上使用脚本,以及在比特币之上构建元协议。构建新的区块链可以无限自由地构建功能集,但要花费开发时间,引导工作和安全性。使用脚本很容易实现和标准化,但功能却非常有限,而元协议虽然容易,但存在可伸缩性方面的缺陷。借助以太坊,我们打算建立一个替代框架,该框架在易于开发以及更强大的轻客户端特性方面可提供更大的收益,同时允许应用程序共享经济环境和区块链安全性。

以太坊 以太坊的目的是创建一个构建去中心化应用程序的替代协议,提供一套不同的权衡方案,我们认为这对一大类去中心化应用程序将非常有用,尤其是在快速开发时间,小型和小型安全性方面。很少使用的应用程序以及不同应用程序进行非常有效的交互的能力非常重要。以太坊通过构建本质上最终的抽象基础层来做到这一点:具有内置图灵完备编程语言的区块链,允许任何人编写智能合约和去中心化应用程序,他们可以在其中创建自己的所有权,交易格式和状态转换功能。可以用两行代码来编写Namecoin的基本版本,其他协议(例如货币和信誉系统)可以内置于20种以内。也可以在平台之上构建智能合约,即包含价值并只有在满足特定条件时才将其解锁的​​密码“盒子”,其功能远比比特币脚本提供的功能强大,这是由于图灵完备性的附加功能所致,价值意识,区块链意识和状态。

哲学 以太坊背后的设计旨在遵循以下原则:

简便性:以太坊协议应该尽可能简单,即使是以一些数据存储或时间效率低下为代价。fn。3理想情况下,普通程序员应该能够遵循并实现整个规范fn。4,以充分实现加密货币带来的前所未有的民主化潜力,并进一步推动以太坊作为对所有人开放的协议的愿景。除非该优化提供了非常可观的好处,否则不应包括任何增加复杂性的优化。 普遍性:以太坊设计哲学的基本部分是,以太坊不具有“功能”。fn。5 相反,以太坊提供了一种内部图灵完备的脚本语言,程序员可以使用该语言来构建任何可以数学定义的智能合约或交易类型。是否想发明自己的金融衍生品?使用以太坊,您可以。想自己做货币吗?将其设置为以太坊合约。是否想建立一个完整的Daemon或Skynet?您可能需要成千上万个互锁的合约,并且一定要慷慨地提供它们,但这并不能阻止以太坊触手可及。 模块化:以太坊协议的各个部分应设计为尽可能模块化和可分离。在开发过程中,我们的目标是创建一个程序,如果要在一个位置进行小的协议修改,则应用程序堆栈将继续运行而无需任何进一步的修改。创新如Ethash(见黄皮书附录 或wiki文章),改性帕特里夏树(黄皮书, 维基)和RLP(YP, 维基)应该并且已经实现为单独的功能完整的库。这样一来,即使它们在以太坊中使用,即使以太坊不需要某些功能,这些功能也仍然可以在其他协议中使用。应该最大程度地进行以太坊开发,以使整个加密货币生态系统受益,而不仅仅是自身。 敏捷性:以太坊协议的细节不是一成不变的。尽管我们对修改高层结构非常明智,例如使用分片路线图,抽象执行,并且仅将数据可用性纳入共识。在开发过程的后期进行的计算测试可能使我们发现,对协议体系结构或以太坊虚拟机(EVM)进行的某些修改将大大改善可伸缩性或安全性。如果发现任何此类机会,我们将加以利用。 不歧视和不审查:协议不应尝试积极限制或阻止特定类别的使用。协议中的所有调节机制都应设计为直接调节危害,而不是试图反对特定的不良应用。程序员甚至可以在以太坊之上运行无限循环脚本,只要他们愿意继续支付每个计算步骤的交易费即可。 以太坊账户 在以太坊中,状态由称为“帐户”的对象组成,每个帐户都有一个20字节的地址,状态转换是帐户之间价值和信息的直接转移。以太坊账户包含四个字段:

该随机数,计数器用来确保每笔交易只能一次处理 该账户当前的以太币余额 帐户的合同代码(如果有) 帐户的存储空间(默认为空) “以太”是以太坊的主要内部加密燃料,用于支付交易费用。通常,有两种类型的帐户: 由私钥控制的外部帐户和 由合同代码控制的合同帐户。外部拥有的帐户没有代码,并且可以通过创建和签名交易从外部拥有的帐户发送消息;在合同帐户中,合同帐户每次收到消息都会激活其代码,从而使其能够读取和写入内部存储并发送其他消息或依次创建合同。

请注意,以太坊中的“合约”不应被视为应“履行”或“遵守”的东西;相反,它们更像是以太坊执行环境中的“自治代理”,当被消息或事务“戳”时总是执行特定的代码段,并直接控制自己的以太币余额和自己的密钥/值存储以跟踪持久变量。

消息和交易 在以太坊中使用术语“交易”来指代签名的数据包,该数据包存储要从外部拥有的帐户发送的消息。交易包含:

邮件的收件人 识别发件人的签名 从发送者转移到接收者的以太币数量 可选数据字段 一个STARTGAS值,表示允许事务执行执行的最大计算步骤数 一个GASPRICE值,表示发件人每计算步骤要支付的费用 前三个是任何加密货币中预期的标准字段。数据字段默认情况下不起作用,但是虚拟机具有操作码,合同可以使用该操作码来访问数据。作为示例用例,如果合同充当区块链上的域注册服务,则它可能希望将传递给它的数据解释为包含两个“字段”,第一个字段是要注册的域,第二个字段是要向其注册的IP地址。合同将从消息数据中读取这些值,并将其适当地存储。

在STARTGAS与GASPRICE字段对于以太坊的反拒绝服务模型至关重要。为了防止代码中的意外或敌对的无限循环或其他计算浪费,要求每个事务对它可以使用多少个代码执行计算步骤设置一个限制。计算的基本单位是“气体”。通常,一个计算步骤只消耗1个气体,但是某些操作会消耗更多的气体,因为它们在计算上更加昂贵,或者增加了必须作为状态一部分存储的数据量。交易数据中的每个字节还有5英镑的费用。收费系统的目的是要求攻击者按比例为他们消耗的每个资源(包括计算,带宽和存储)支付费用;因此,

留言内容 合同可以将“消息”发送给其他合同。消息是永不序列化的虚拟对象,仅存在于以太坊执行环境中。一条消息包含:

消息的发件人(隐式) 邮件的收件人 随消息转移的乙醚量 可选数据字段 一个STARTGAS值 从本质上讲,消息类似于交易,只是消息是由合同而非外部参与者产生的。当前执行代码的合同执行CALL操作码时,会生成一条消息,该操作码会生成并执行一条消息。像交易一样,一条消息会导致收件人帐户运行其代码。因此,合同可以以与外部参与者完全相同的方式与其他合同建立关系。

请注意,交易或合同分配的天然气津贴适用于该交易和所有子执行所消耗的总天然气。例如,如果外部参与者A向B发送的交易有1000次交易,并且B在向C发送消息之前消耗了600次交易,并且C的内部执行在返回之前消耗了300次交易,那么B可以在运行之前再花费100次交易没气了。

以太坊状态转换函数 醚状态转变

以太坊状态转换函数APPLY(S,TX) -> S’可以定义如下:

检查交易是否格式正确(即具有正确数量的值),签名有效以及随机数与发送者帐户中的随机数匹配。如果不是,则返回错误。 将交易费用计算为STARTGAS * GASPRICE,然后从签名中确定发送地址。从发件人的帐户余额中减去费用,并增加发件人的现时。如果余额不足,请返回错误。 初始化GAS = STARTGAS,然后每字节释放一定数量的gas以支付事务中的字节。 将交易值从发送者的帐户转移到接收者的帐户。如果收款帐户尚不存在,请创建它。如果接收帐户是合同,请运行合同的代码以完成或直到执行结束为​​止。 如果由于发件人没有足够的钱而导致价值转移失败,或者代码执行用尽了钱,请还原除支付费用外的所有状态更改,然后将费用添加到矿工的帐户中。 否则,将所有剩余瓦斯的费用退还给发送方,并将支付的瓦斯使用费发送给矿工。 例如,假设合同的代码为:

if !self.storage[calldataload(0)]: self.storage[calldataload(0)] = calldataload(32) 请注意,实际上合同代码是用低级EVM代码编写的;为了清楚起见,此示例使用Serpent(一种高级语言)编写,并且可以编译为EVM代码。假设合同的存储空间开始为空,并发送了一个交易,该交易带有10以太值,2000 gas,0.001 ether gasprice和64个字节的数据,字节0-31代表数字2,字节32-63代表字符串CHARLIE。fn。6在这种情况下,状态转换功能的过程如下:

检查交易是否有效且格式正确。 检查交易发件人是否至少拥有2000 * 0.001 = 2以太币。如果是这样,则从发送者的帐户中减去2个以太币。 初始化气体= 2000; 假设交易的长度为170个字节,字节费用为5,则减去850,这样就剩下了1150个gas。 从发送者的帐户中再减去10个以太币,然后将其添加到合同的帐户中。 运行代码。在这种情况下,这很简单:它检查是否使用了合约在index2处的存储,注意到没有使用,因此将index处的存储设置2为value CHARLIE。假设需要187瓦斯,那么剩余的瓦斯量为1150-187 = 963 将963 * 0.001 = 0.963以太币加回到发送者的帐户,并返回结果状态。 如果在交易的接收端没有合同,则总交易费用将简单地等于所提供的费用 GASPRICE乘以交易的长度(以字节为单位),并且与交易一起发送的数据将是无关紧要的。

请注意,就还原而言,消息与事务等效地工作:如果消息执行耗尽,则该消息的执行以及由该执行触发的所有其他执行都将还原,但父执行不需要还原。这意味着对于一个合同调用另一个合同是“安全的”,好像A用G气体调用B一样,那么A的执行保证最多损失G气体。最后,请注意,有一个操作码CREATE可以创建合同。它的执行机制通常类似于CALL,不同之处在于执行的输出确定了新创建合同的代码。

代码执行 以太坊合约中的代码是用基于堆栈的底层字节码语言编写的,称为“以太坊虚拟机代码”或“ EVM代码”。该代码由一系列字节组成,其中每个字节代表一个操作。通常,代码执行是一个无限循环,包括重复执行当前程序计数器(从零开始)的操作,然后将程序计数器加1,直到到达代码末尾或出现错误或 STOP或。RETURN检测到指令。这些操作可以访问三种类型的空间来存储数据:

的堆栈,后进先出容器,其值可以被压入和弹出 内存,一个无限扩展的字节数组 合同的长期存储,即键/值存储。与堆栈和内存不同,堆栈和内存在计算结束后会重置,因此存储可以长期保留。 该代码还可以访问传入消息的值,发送者和数据以及块头数据,并且该代码还可以返回数据的字节数组作为输出。

EVM代码的正式执行模型非常简单。当以太坊虚拟机运行时,其完整的计算状态可以由tuple定义 (block_state, transaction, message, code, memory, stack, pc, gas),其中block_state是包含所有帐户并包括余额和存储的全局状态。在每一轮执行的开始,通过取-的pc-th字节code (如果为pc >= len(code),则为0 )找到当前指令,并且每条指令在如何影响元组方面都有其自己的定义。例如,将ADD两个项目从堆栈中弹出并压入它们的总和,将其减少gas1,然后将其递增 pc1,然后SSTORE将最上面的两个项目弹出堆栈,然后将第二个项目按第一个项目指定的索引插入合同的存储中。尽管有很多方法可以通过即时编译来优化以太坊虚拟机的执行,但是以太坊的基本实现可以用几百行代码来完成。

区块链与采矿 以太坊应用框图

以太坊区块链在很多方面都类似于比特币区块链,尽管它确实有一些区别。以太坊与比特币之间在区块链架构上的主要区别在于,与比特币(仅包含交易清单的副本)不同,以太坊区块包含交易清单和最新状态的副本。除此之外,块编号和难度两个其他值也存储在块中。以太坊中的基本块验证算法如下:

检查所引用的前一个块是否存在并且有效。 检查该块的时间戳是否大于所引用的先前块的时间戳,并且距未来不超过15分钟 检查区块编号,难度,交易根,叔叔根和气体限制(各种以太坊特定的低级别概念)是否有效。 检查块上的工作证明是否有效。 我们S[0]是在先前块结束的状态。 让它TX成为包含交易的区块交易列表n。对于所有i的0…n-1,集S[i+1] = APPLY(S[i],TX[i])。如果有任何应用程序返回错误,或者直到该点为止在区块中消耗的总气体超过GASLIMIT,则返回错误。 让S_FINAL会S[n],但增加支付给矿工块奖励。 检查状态的Merkle树根S_FINAL是否等于块头中提供的最终状态根。如果是,则该块有效。否则无效。 乍一看,该方法似乎效率很低,因为它需要在每个块中存储整个状态,但实际上效率应该与比特币相当。原因是状态存储在树结构中,并且在每个块之后仅需要更改树的一小部分。因此,通常,在两个相邻块之间,树的绝大部分应该是相同的,因此,数据可以存储一次,并使用指针(即子树的哈希)引用两次。一种称为“ Patricia树”的特殊树可用于完成此任务,其中包括对Merkle树概念的修改,该概念允许有效地插入和删除节点,而不仅仅是更改节点。此外,由于所有状态信息都是最后一个块的一部分,

一个常见的问题是合同代码在物理硬件上的“执行位置”。答案很简单:执行合同代码的过程是状态转换函数定义的一部分,状态转换函数是块验证算法的一部分,因此,如果将事务添加到块中,B则将执行该事务产生的代码执行由现在和将来的所有节点下载并验证block B。

应用领域 通常,以太坊之上有三种类型的应用程序。第一类是金融应用程序,它为用户提供了更强大的方式来使用他们的资金来管理和订立合同。这包括子货币,金融衍生产品,对冲合同,储蓄钱包,遗嘱,甚至最终包括某些类别的全面雇佣合同。第二类是半金融应用,涉及金钱,但所进行的工作也有大量的非货币方面。一个完美的例子是用于解决计算问题的自我执行赏金。最后,有些应用程序(例如在线投票和分散式治理)根本不具备财务能力。

代币系统 区块链上的代币系统有很多应用范围,从代表美元或黄金等资产的子货币到公司股票,代表智能财产,安全不可伪造的优惠券的单个代币,甚至甚至与传统价值都没有关系的代币系统都可以用作点。激励制度。令牌系统非常容易在以太坊中实现。要理解的关键点是,货币或令牌系统从根本上讲是一个数据库,它具有一个操作:从A中减去X个单位,并将B个单位提供给X,前提是(1)A在交易前至少有X个单位(2)交易获得A的批准。实施令牌系统所需的全部工作就是将该逻辑实施到合同中。

在Serpent中实现令牌系统的基本代码如下:

def send(to, value): if self.storage[msg.sender] >= value: self.storage[msg.sender] = self.storage[msg.sender] - value self.storage[to] = self.storage[to] + value 这本质上是本文上面进一步描述的“银行系统”状态转换功能的字面实现。首先,需要添加一些额外的代码行来提供分配货币单位的初始步骤,以及其他一些极端情况,并且理想情况下,应添加一个函数,以让其他合同查询地址的余额。但这就是全部。从理论上讲,基于以太坊的代币系统充当子货币可能会包含链上基于比特币的元货币所缺乏的另一个重要功能:直接以该货币支付交易费用的能力。实施该方法的方式是,合同将保持以太币余额,用它可以退还用于向发送方支付费用的以太币,并且它会通过收取费用中使用的内部货币单位并在持续运行的拍卖中将其转售来补充余额。因此,用户将需要使用以太币“激活”他们的帐户,但是一旦有以太币就可以重用,因为合同每次都会将其退还。

金融衍生品和稳定价值货币 金融衍生产品是“智能合约”的最常见应用,也是最简单的代码实现之一。实施金融合同的主要挑战是,大多数金融合同都需要参考外部价格行情;例如,一个非常理想的应用是智能合约,该合约可以对冲以太坊(或另一种加密货币)相对于美元的波动,但是这样做需要合约知道ETH / USD的价值。最简单的方法是通过由特定参与方(例如纳斯达克)维护的“数据馈送”合同进行设计,以使该参与方能够根据需要更新合同,并提供允许其他合同发送合同的接口。消息发送到该合同,然后返回提供价格的响应。

考虑到这一关键因素,对冲合同将如下所示:

等待甲方输入1000以太。 等待乙方输入1000以太。 在存储中记录通过查询数据馈送合约计算得出的1000以太币的美元价值,说这是$ x。 30天后,允许A或B“重新激活”合约,以便将价值$ x的以太币(通过再次查询数据馈送合约以获取新价格来计算)发送给A,其余部分发送给B。 这样的合同在加密商务中将具有巨大的潜力。关于加密货币的主要问题之一是它易变的事实。尽管许多用户和商家可能希望使用安全性和便利性来处理加密资产,但他们可能不希望面对一天损失其资金价值23%的前景。到目前为止,最常见的解决方案是发行人支持的资产。想法是,发行人创建一种子货币,他们有权发行和撤销单位,并向向其(离线)提供单位指定基础资产(例如黄金)的任何人提供一种货币单位。 , 美元)。发行人然后承诺将向任何将一单位加密资产返还的人提供一份基础资产。

然而,实际上,发行人并不总是值得信赖的,在某些情况下,银行基础设施太弱或太敌对,以致无法提供此类服务。金融衍生品提供了另一种选择。在这里,代替单一发行人提供资金来支持资产的是,分散的投机者市场,押注密码参考资产(例如ETH)的价格将上涨,而发挥了作用。与发行人不同,投机者没有选择违约的理由,因为对冲合约将其资金托管在托管人手中。请注意,这种方法还没有完全分散,因为仍然需要可信的来源来提供价格行情,尽管可以说,就减少基础架构要求而言,这仍然是一个巨大的进步(与发行人不同,

身份和信誉系统 最早的替代加密货币 Namecoin尝试使用类似比特币的区块链来提供名称注册系统,用户可以在其中将其名称与其他数据一起注册到公共数据库中。引用的主要用例是用于 DNS系统,将域名(例如“ bitcoin.org”(或在Namecoin的情况下为“ bitcoin.bit”))映射到IP地址。其他用例包括电子邮件身份验证和可能更高级的信誉系统。这是在以太坊上提供类似于Namecoin的名称注册系统的基本合同:

def register(name, value): if !self.storage[name]: self.storage[name] = value 合同很简单;它只是以太坊网络内部的一个数据库,可以被添加,但不能被修改或从中删除。任何人都可以注册一个具有一定价值的名称,然后该注册将永久保留。更复杂的名称注册合同还将具有一个“功能条款”,允许其他合同对其进行查询,以及名称“所有者”(即第一注册者)更改数据或转让所有权的机制。甚至可以在顶部添加信誉和信任网络功能。

去中心化文件存储 在过去的几年中,出现了许多流行的在线文件存储初创公司,其中最著名的是Dropbox,其目的是允许用户上传其硬盘驱动器的备份并让服务存储该备份并允许用户访问它。换取月费。但是,此时文件存储市场有时效率相对较低。粗略查看各种现有解决方案 表明,特别是在20-200 GB级别的“超低谷”中,免费配额或企业级折扣都没有出现,主流文件存储成本的月度价格使您付出的成本超过了整个硬盘的成本一个月内开车。以太坊合同可以促进去中心化文件存储生态系统的发展,在该系统中,单个用户可以通过租用自己的硬盘驱动器来赚取少量资金,而未使用的空间可以用来进一步降低文件存储成本。

这种设备的关键基础就是我们所谓的“分散式Dropbox合同”。该合同的工作方式如下。首先,将所需数据拆分为多个块,对每个块进行加密以保护隐私,然后在其中构建一个Merkle树。然后使用以下规则订立合约:每N个区块,合约将在Merkle树中选择一个随机索引(使用先前的区块哈希,可从合约代码访问,作为随机性的来源),并将X醚赋予第一实体在树中该特定索引处为交易提供类似于区块的付款验证类似的所有权证明。当用户想要重新下载文件时,他们可以使用微支付渠道协议(例如,每32 KB支付1 szabo)来恢复文件;

该协议的一项重要功能是,尽管似乎可以信任许多随机节点而不是决定忘记文件,但可以通过秘密共享将文件分成许多部分,从而将这种风险降低到接近零。观看合同以查看每个节点仍在某个节点中。如果合同仍在付款,则可以提供加密证明,表明有人仍在存储文件。

权力下放的自治组织 “分散的自治组织”的一般概念是指具有一定成员或股东集合的虚拟实体,这些成员或股东可能拥有多数成员的67%,有权使用该实体的资金并修改其代码。成员将集体决定组织应如何分配其资金。分配DAO资金的方法可能从赏金,薪水到甚至更奇特的机制(例如内部货币来奖励工作)不等。这实质上是复制传统公司或非营利组织的法律陷阱,但仅使用加密区块链技术来执行。到目前为止,有关DAO的讨论主要围绕“分散式自治公司”(DAC)的“资本主义”模型,该模型具有接收股息的股东和可交易的股票。另一种可能称为“分散式自治社区”的选择将使所有成员在决策中享有平等的份额,并要求现有成员的67%同意添加或删除成员。这样一来,一个人只能拥有一个成员身份的要求将需要由该组集体执行。

DAO编码的一般概述如下。最简单的设计只是一段自我修改的代码,如果三分之二的成员都同意更改,则该代码会更改。尽管代码在理论上是不可变的,但通过将代码块放在单独的协定中,并将要调用的协定的地址存储在可修改的存储中,可以轻松解决此问题并具有实际的可变性。在这种DAO合同的简单实现中,将存在三种交易类型,通过交易中提供的数据加以区分:

[0,i,K,V]用索引注册提案以i将存储索引处的地址更改K为valueV [1,i] 投票赞成提案 i [2,i]i如果已经进行了足够的投票,则最终确定提案 然后,合同将为每个条款提供条款。它将保留所有开放式存储更改的记录,以及投票支持者的列表。它还将具有所有成员的列表。当任何存储更改获得三分之二的成员投票时,完成交易即可执行更改。一个更复杂的框架还将具有对诸如发送交易,添加成员和删除成员之类的功能的内置投票功能,甚至可能提供流动性民主式投票委派(即,任何人都可以分配某人为其投票,并且分配是可传递的,因此,如果A分配B,B分配C,则C决定A的投票)。这种设计将使DAO成为一个分散的社区,从而有机地发展,使人们最终可以将筛选出谁是成员的任务委托给专家,尽管与“当前系统”不同,专家可以随时间轻易地出现和消失。随着个别社区成员改变其阵营。

另一种模型是一种分散的公司,其中任何帐户可以拥有零个或多个股份,并且需要三分之二的股份才能做出决定。一个完整的框架将涉及资产管理功能,提供买卖股票的要约的能力以及接受要约的能力(最好具有合同内的订单匹配机制)。代表团也将以流动民主的方式存在,概括了“董事会”的概念。

进一步的应用 1.储蓄钱包。假设爱丽丝想确保自己的资金安全,但担心自己会丢失或有人会窃取她的私钥。她将以太币与银行鲍勃的合同如下:

爱丽丝一个人每天最多只能提取资金的1%。 鲍勃一个人每天最多可以提取1%的资金,但爱丽丝有能力用她的钥匙进行交易以关闭该功能。 爱丽丝和鲍勃在一起可以撤回一切。 通常,每天1%的收入足以满足爱丽丝的需求,如果爱丽丝想提款更多,可以联系鲍勃寻求帮助。如果爱丽丝(Alice)的钥匙被黑客窃取,她将奔向鲍勃(Bob)将资金转移到新合同中。如果她丢失了钥匙,鲍勃最终将把钱取出。如果鲍勃被证明是恶意的,那么她可以关闭他的退出能力。

2.作物保险。使用天气数据而不是任何价格指数,可以轻松地订立金融衍生品合约。如果衣阿华州的农民购买的衍生品根据衣阿华州的降水量反向支付,那么如果发生干旱,农民将自动收钱,如果有足够的雨水,农民会很高兴,因为他们的收成很好。一般而言,这可以扩展到自然灾害保险。

3.分散的数据馈送。对于有差异的金融合约,实际上可能可以通过称为SchellingCoin的协议分散数据馈送 。SchellingCoin的基本工作原理如下:N个参与者都将给定数据的值(例如ETH / USD价格)放入系统中,对值进行排序,并且介于25%和75%之间的每个人都会获得一个令牌作为奖励。每个人都有提供其他人将提供的答案的动机,并且许多参与者可以实际达成共识的唯一价值是显而易见的默认值:事实。这创建了一个去中心化的协议,该协议理论上可以提供任何数量的值,包括ETH / USD价格,柏林的温度甚至是特定的困难计算的结果。

4.智能多重签名托管。比特币允许多重签名交易合同,例如,给定五个密钥中的三个可以花费资金。以太坊允许更多的粒度;例如,五分之四的人可以花掉所有东西,五分之三的人每天可以花10%,五分之二的人每天可以花0.5%。此外,以太坊多重签名是异步的-双方可以在不同时间在区块链上注册其签名,最后一个签名将自动发送交易。

5.云计算。EVM技术还可以用于创建可验证的计算环境,允许用户要求其他人执行计算,然后可选地要求提供证明,以证明在某些随机选择的检查点处的计算正确完成。这样就可以创建一个云计算市场,在该市场上任何用户都可以参与其台式机,笔记本电脑或专用服务器,并且可以使用现场检查以及保证金来确保系统值得信赖(即节点无法从中牟利) 。尽管这样的系统可能并不适合所有任务;例如,需要大量进程间通信的任务很难在庞大的节点云上完成。但是,其他任务则更容易并行化。SETI @ home等项目,

6.点对点赌博。可以在以太坊区块链上实现许多对等赌博协议,例如Frank Stajano和Richard Clayton的 Cyber​​dice。最简单的赌博协议实际上只是下一个区块哈希上的差异合约,并且可以从那里建立更高级的协议,从而以几乎为零的费用创建赌博服务,并且无法作弊。

7.预测市场。如果提供了Oracle或SchellingCoin,则预测市场也很容易实现,并且预测市场与SchellingCoin一起可能被证明是futarchy作为分散组织的治理协议的第一个主流应用。

8.以身份和信誉系统为基础的链上去中心市场。

杂项和担忧 修改的GHOST实现 “贪婪最重的可观测子树”(GHOST)协议是一项创新,由Yonatan Sompolinsky和Aviv Zohar于2013年12月提出。GHOST背后的动机是,由于过高的过时率,具有快速确认时间的区块链目前遭受安全性降低的影响-因为如果矿工A挖出一个区块,然后矿工B恰巧挖出另一个区块,则区块需要一定的时间通过网络传播。在矿工A的块传播到B之前,矿工B的块将最终被浪费,并且不会对网络安全做出贡献。此外,还有一个集中化问题:如果矿工A是具有30%哈希能力的采矿池,而B具有10%哈希能力,则A将有70%的时间产生陈旧区块的风险(因为其他30%的时间A生成了最后一个块,因此将立即获得挖掘数据),而B将有90%的时间生成陈旧块的风险。因此,如果块间隔足够短以至于过时率较高,仅凭其大小,A的效率就会大大提高。结合这两种效果,快速产生区块的区块链很可能导致一个采矿池拥有足够大的网络哈希能力百分比,从而对采矿过程进行实际控制。

如Sompolinsky和Zohar所述,GHOST通过在计算哪条链是“最长的”链时包括陈旧的块,解决了网络安全损失的第一个问题。也就是说,不仅要计算区块的父代和其他祖先,而且还要计算区块祖先的陈旧后代(以太坊行话中的“叔叔”),以计算哪个区块具有最大的工作支持总证明它。为了解决集中化偏见的第二个问题,我们超越了Sompolinsky和Zohar所描述的协议,并且还为旧货提供了块奖励:陈旧的块获得其基本奖励的87.5%,而包含陈旧的块的侄子则获得剩余的奖励。 12.5%。但是,交易费用并不授予叔叔。

以太坊实现了GHOST的简化版本,仅下降了七个级别。具体来说,定义如下:

一个块必须指定一个父对象,并且必须指定0个或多个叔叔 包含在其中的叔叔B必须具有以下属性: 它必须是where的k第四代祖先的直接子代。B2 <= k <= 7 它不能是 B 一个叔叔必须是有效的块头,但不必是先前验证过的甚至是有效的块 一个叔叔必须与先前区块中包含的所有叔叔以及同一区块中包含的所有其他叔叔不同(非双重包含) 对于U区块中的每个叔叔B,的矿工B获得的币库奖励额外增加3.125%,而U的矿工获得标准币库奖励的93.75%。 使用GHOST的这种受限版本具有最多7代的叔叔,这是出于两个原因。首先,无限的GHOST会在计算给定块的哪些叔叔有效的过程中包含太多的复杂性。其次,以太坊中使用的无偿GHOST补偿消除了矿工在主链而不是在公共攻击者链上采矿的动机。

费用 由于发布到区块链中的每笔交易都在网络上增加了下载和验证的成本,因此需要某种监管机制来防止滥用,通常涉及交易费用。比特币中使用的默认方法是收取纯自愿性费用,依靠矿工充当看门人并设定动态最低费用。这种方法在比特币社区中非常受欢迎,特别是因为它是“基于市场的”,从而允许矿工和交易发送方之间的供需确定价格。但是,这种推理方式的问题在于,交易处理不是市场。尽管从直观上讲,将矿工提供给发送者的交易处理理解为一种服务,实际上,矿工包含的每笔交易都需要由网络中的每个节点进行处理,因此交易处理的绝大部分费用均由第三方承担,而不是由矿工决定是否包括它。因此,极有可能发生常见的悲剧问题。

但是,事实证明,在基于市场的机制中存在此缺陷时,如果给出特定的不准确简化假设,就会神奇地将其自身消除。参数如下。假设:

交易导致k操作,向kR包括R发件人设置的,k 并且R事先(大致)对矿工可见的包括矿工的任何矿工提供奖励。 一个操作C对任何节点的处理成本都是(例如,所有节点的效率相同) 有N采矿节点,每个节点具有完全相等的处理能力(即1/N总数) 不存在非挖掘的完整节点。 如果预期的回报大于成本,那么矿工将愿意进行交易。因此,期望的报酬是kR/N因为矿工有1/N机会处理下一个区块,并且矿工的处理成本很简单kC。因此,矿工将在kR/N > kC或进行交易R > NC。注意,这R是发送方提供的每次操作费用,因此是发送方从交易中获得的收益的下限,并且NC是整个网络处理操作的成本。因此,矿工有动机只包括总功利超过成本的交易。

但是,实际上与这些假设有几个重要的偏差:

矿工的确要比其他验证节点支付更高的交易费用,因为额外的验证时间会延迟区块传播,从而增加区块变陈旧的机会。 确实存在非挖掘的完整节点。 在实践中,采矿权的分配可能最终从根本上不平等。 确实存在投机者,政治敌人和疯子,其效用功能包括对网络造成损害,他们可以巧妙地建立合同,而其成本要比其他验证节点支付的成本低得多。 (1)为矿工提供了减少交易的趋势,以及(2)增加NC;因此,这两个效果至少部分相互抵消。如何? (3)和(4)是主要问题;为了解决这些问题,我们只需设置一个浮动上限:没有任何一个区块可以进行的操作数量超过 BLK_LIMIT_FACTOR长期指数移动平均数的两倍。具体来说:

blk.oplimit = floor((blk.parent.oplimit * (EMAFACTOR - 1) + floor(parent.opcount * BLK_LIMIT_FACTOR)) / EMA_FACTOR) BLK_LIMIT_FACTOR和EMA_FACTOR暂时将被设置为65536和1.5的常数,但在进一步分析后可能会更改。

还有另一个因素无法激励比特币中的大块:大块将花费更长的时间传播,因此更有可能成为陈旧。在以太坊中,高耗气量区块的传播也可能需要更长的时间,这是因为它们在物理上更大,并且因为它们需要更长的时间来处理交易状态转换以进行验证。在比特币中,这种延迟抑制是一个重要的考虑因素,但由于GHOST协议,因此在以太坊中考虑较少。因此,依靠可调节的区块限制可以提供更稳定的基准。

计算与图灵完备性 需要注意的是,以太坊虚拟机是图灵完备的。这意味着EVM代码可以对任何可以想象得到的计算进行编码,包括无限循环。EVM代码允许以两种方式循环。首先,有一条JUMP指令允许程序跳回到代码中的上一个位置,还有一条 JUMPI指令进行条件跳转,从而允许诸如while x < 27: x = x * 2。其次,合同可以调用其他合同,从而可能允许遍历递归。这自然会带来一个问题:恶意用户是否可以通过强迫矿工和整个节点进入无限循环来使其本质上关闭?出现此问题是由于计算机科学中的一个问题(称为“停止问题”):在一般情况下,无法判断给定程序是否会停止。

如状态转换部分所述,我们的解决方案通过要求事务设置允许执行的最大计算步骤数来工作,如果执行花费更长的时间,则可以恢复计算,但仍需支付费用。消息以相同的方式工作。为了说明我们解决方案背后的动机,请考虑以下示例:

攻击者创建运行无限循环的合同,然后向矿工发送激活该循环的交易。矿工将处理交易,运行无限循环,并等待其用尽天然气。即使执行用完了并且中途停止了,交易仍然有效,并且矿工仍然为每个计算步骤向攻击者索要费用。 攻击者创建了一个非常长的无限循环,其目的是迫使矿工长时间保持计算,以至于在计算完成时将出现更多的块,并且矿工将不可能包含交易索取费用。但是,将要求攻击者提交一个值,以STARTGAS限制执行可以执行的计算步骤的数量,因此,矿工将提前知道计算将采取过多的步骤。 攻击者看到的合同具有某种形式的代码,例如 send(A,contract.storage[A]); contract.storage[A] = 0,并发送足够多的天然气来执行第一步但没有第二步(即进行提款但不让余额下降)。合同作者不必担心会受到此类攻击,因为如果更改执行中途停止执行,它们将被还原。 金融合同的工作方式是取9个专有数据提要的中位数,以最大程度地降低风险。攻击者接管了其中一个数据馈送,该数据馈送旨在通过DAO一节中介绍的可变地址调用机制进行修改,并将其转换为运行无限循环,从而试图迫使试图从中索取资金的任何尝试财务合同用完了。但是,金融合同可以在消息上设置限制,以防止出现此问题。 图灵不完全的替代方法是图灵不完全,其中 JUMP和JUMPI不存在,并且在任何给定时间都只能在调用堆栈中存在每个合同的一个副本。使用此系统,描述的收费系统和围绕我们解决方案有效性的不确定性可能不是必需的,因为执行合同的成本将受到合同规模的限制。另外,图灵不完整甚至没有那么大的限制。在我们内部构思的所有合同示例中,到目前为止只有一个需要循环,甚至可以通过对一行代码进行26次重复来消除该循环。考虑到图灵完成的严重含义和有限的收益,为什么不简单地使用图灵不完整的语言呢?但是,实际上,图灵不完整远非一个巧妙的解决方案。要了解原因,请考虑以下合同:

C0: call(C1); call(C1); C1: call(C2); call(C2); C2: call(C3); call(C3); … C49: call(C50); call(C50); C50: (run one step of a program and record the change in storage) 现在,将交易发送给A。因此,在51笔交易中,我们的合同占2 50计算步骤。矿工可以通过在每个合同旁边保持一个值来指定其可以采取的最大计算步骤数,并针对递归调用其他合同的合同进行计算,从而尝试提前发现此类逻辑炸弹,但这将要求矿工禁止创建的合同其他合同(因为上面所有26个合同的创建和执行都可以轻松地合并为一个合同)。另一个有问题的点是消息的地址字段是一个变量,因此通常甚至无法得知给定合同将提前调用哪些其他合同。因此,总而言之,我们得出一个令人惊讶的结论:图灵完整性非常容易管理,

货币和发行 以太坊网络包含其自己的内置货币以太,其双重目的是提供主要的流动性层,以允许在各种类型的数字资产之间进行有效交换,更重要的是,提供了一种支付交易费用的机制。为了方便起见并避免将来发生争执(请参阅当前比特币中的mBTC / uBTC / satoshi辩论),将对这些面额进行预先标记:

1: 10 12:szabo 10 15:芬尼 10 18:乙醚 应该将其视为“美元”和“美分”或“ BTC”和“中本聪”概念的扩展版本。在不久的将来,我们希望“ ether”将用于普通交易,“ finney”将用于微交易,“ szabo”和“ wei”将用于有关费用和协议实施的技术讨论;其余面额可能会在以后变得有用,并且此时不应包含在客户中。

发行模型如下:

以太币将以货币销售的形式发布,价格为每BTC 1000-2000醚,该机制旨在为以太坊组织提供资金并为开发支付费用,该机制已被Mastercoin和NXT等其他平台成功使用。较早的买家将受益于更大的折扣。从出售中获得的BTC将全部用于向开发人员支付薪水和赏金,并投资以太坊和加密货币生态系统中的各种营利性和非营利性项目。 0.099倍的总销售额(60102216 ETH)将分配给该组织,以补偿早期的贡献者并在创世纪产生之前支付ETH计价的费用。 总销售量的0.099倍将被保留为长期储备。 从那以后,每年将永远将总销售量的0.26倍分配给矿工。 小组发布时1年后5年后

货币单位1.198倍1.458倍2.498倍购买者83.5%68.6%40.0%售前储备支出8.26%6.79%3.96%售后储备支出使用8.26%6.79%3.96%矿工0%17.8%52.0%

长期供应增长率(百分比)

以太坊通货膨胀

尽管货币发行是线性的,就像比特币随着时间的推移,供应增长率仍然趋于零

上面模型中的两个主要选择是(1)捐赠基金的存在和规模,以及(2)永久增长的线性供应的存在,而不是像比特币那样有上限的供应。捐赠池的理由如下。如果捐赠基金不存在,并且线性发行减少到0.217倍以提供相同的通货膨胀率,那么以太坊的总量将减少16.5%,因此每个单位的价值将增加19.8%。因此,在平衡中,将在销售中购买更多19.8%的醚,因此每个单位将再次像以前一样有价值。然后,该组织还将拥有1.198倍的BTC,可以将其分为两部分:原始BTC和附加的0.198x。因此,这种情况是完全等效的与the赋有关,但有一个重要区别:该组织纯粹持有BTC,因此没有受到激励来支持以太坊单位的价值。

永久线性供应增长模型降低了某些人认为比特币过度集中财富的风险,并为生活在当今和未来时代的人们提供了获取货币单位的公平机会,同时又保留了获取和持有货币的强大动力醚,因为随着时间的推移,“供应增长率”的百分比仍趋于零。我们还得出理论,因为硬币总是由于粗心,死亡等原因而随着时间流逝而丢失,并且可以将硬币损失建模为每年总供应量的百分比,因此流通的总货币供应量实际上最终将稳定在某个值上。等于年度发行量除以损失率(例如,损失率为1%,一旦供应量达到26倍,则将开采0.26倍,每年损失0.26倍,从而形成平衡)。

请注意,将来,以太坊很可能会切换到权益证明模型以确保安全,从而将每年的发行要求降低到零到0.05倍之间。如果以太坊组织失去资金或由于其他任何原因而消失,我们将开放“社会合同”:任何人都有权创建未来的以太坊候选版本,唯一的条件是以太币的数量必须为最多等于 60102216 * (1.198 + 0.26 * n)在那里n是发生阶段后的年数。创作者可以自由地进行众筹或以其他方式分配PoS驱动的供应扩展与最大允许供应扩展之间的部分或全部差异,以支付开发费用。不符合社会契约的候选升级可以合理地分叉为兼容版本。

采矿集中化 比特币挖掘算法的工作原理是,让矿工一次又一次地对块头的稍作修改的版本计算SHA256,直到最终一个节点提出其哈希值小于目标值的版本(当前约为2192))。但是,这种挖掘算法容易受到两种集中化形式的影响。首先,采矿生态系统已被ASIC(专用集成电路),计算机芯片所支配,这些计算机芯片是为比特币采矿的特定任务而设计的,因此效率提高了数千倍。这意味着比特币采矿不再是高度分散和平等的追求,需要数百万美元的资金才能有效参与。第二,大多数比特币矿工实际上并未在本地进行区块验证。相反,他们依靠集中式采矿池来提供块头。这个问题可以说更糟:截至撰写本文时,排名前三的采矿池间接控制着比特币网络中约50%的处理能力,

以太坊目前的意图是使用一种挖掘算法,其中要求矿工从状态中获取随机数据,从区块链中的最后N个块中计算一些随机选择的交易,并返回结果的哈希值。这有两个重要的好处。首先,以太坊合约可以包括任何类型的计算,因此以太坊ASIC本质上就是用于通用计算的ASIC,即。一个更好的CPU。其次,采矿需要访问整个区块链,从而迫使矿工存储整个区块链,并且至少能够验证每笔交易。这消除了对集中式矿池的需求;尽管挖掘池仍然可以起到平衡奖励分配随机性的合法作用,但没有中央控制的点对点池也可以很好地发挥这一功能。

该模型未经测试,在使用合同执行作为挖掘算法时,在避免某些聪明的优化过程中可能会遇到困难。但是,该算法的一个显着有趣的功能是,它通过将大量合同引入专门设计来阻碍某些ASIC的区块链中,从而使任何人都可以“毒化井”。对于ASIC制造商而言,存在经济诱因,即他们可以利用这种技巧互相攻击。因此,我们正在开发的解决方案最终将是一种适应性的经济人为解决方案,而不是纯粹的技术性解决方案。

可扩展性 关于以太坊的一个普遍关注是可扩展性问题。像比特币一样,以太坊也遭受缺陷,即网络中的每个节点都需要处理每笔交易。使用比特币,当前区块链的大小约为15 GB,每小时增长约1 MB。如果比特币网络每秒处理Visa的2000笔交易,它将每3秒增加1 MB(每小时1 GB,每年8 TB)。以太坊可能会经历类似的增长模式,因为以太坊区块链之上将有许多应用程序而不是像比特币那样的仅货币,这一事实使情况恶化了,但由于以太坊完整节点需要存储这一事实得到了改善只是状态而不是整个区块链历史。

如此大的区块链大小的问题是集中化风险。如果区块链大小增加到100 TB,则可能的情况是只有极少数大型企业将运行完整节点,所有常规用户都使用轻型SPV节点。在这种情况下,潜在的问题是,整个节点可能会捆绑在一起,并且所有人都同意以某种有利可图的方式作弊(例如,更改区块奖励,给自己分配BTC)。轻节点将无法立即检测到这种情况。当然,至少可能会存在一个诚实的完整节点,几个小时后,有关欺诈行为的信息将通过Reddit之类的渠道传播,但那时为时已晚:由普通用户来组织努力将给定的黑名单列入黑名单,一个大规模的,可能不可行的协调问题,其规模与成功发起51%攻击的规模相似。就比特币而言,这目前是一个问题,但是存在区块链修改彼得·托德(Peter Todd)提出的建议 ,可以缓解此问题。

短期内,以太坊将使用两种其他策略来解决这个问题。首先,由于基于区块链的挖掘算法,至少每个矿工都将被迫成为完整节点,从而在完整节点数量上产生了下限。其次,更重要的是,在处理完每笔交易后,我们将在区块链中包含一个中间状态树根。即使块验证是集中式的,只要存在一个诚实的验证节点,就可以通过验证协议来规避集中化问题。如果矿工发布了无效的区块,则该区块必须格式S[n]错误或状态不正确。由于S[0]已知是正确的,因此必须存在一些S[i]不正确的第一状态,其中S[i-1]是正确的。验证节点将提供索引i,以及“无效证明”,该“无效证明”包括需要处理的Patricia树节点的子集 APPLY(S[i-1],TX[i]) -> S[i]。节点将能够使用那些Patricia节点来运行那部分计算,并看到S[i] 生成的与S[i]提供的不匹配。

另一种更复杂的攻击将涉及恶意矿工发布不完整的区块,因此甚至不存在确定区块是否有效的完整信息。解决方案是挑战-响应协议:验证节点以目标交易索引的形式发出“挑战”,并且轻节点在收到节点后将其视为不可信,直到另一个节点(无论是矿工还是另一个验证者)提供Patricia节点的子集作为有效性的证明。

结论 以太坊协议最初被认为是加密货币的升级版,通过高度通用的编程语言提供高级功能,例如区块链托管,提款限制,金融合同,赌博市场等。以太坊协议不会直接“支持”任何应用程序,但是图灵完备的编程语言的存在意味着理论上可以为任何交易类型或应用程序创建任意合约。然而,以太坊更有趣的是,以太坊协议已经远远超越了货币。关于分散文件存储,分散计算和分散预测市场的协议,以及其他数十种此类概念,通过首次添加经济层,可以极大地提高计算行业的效率,并极大地促进其他对等协议的发展。最后,还有大量与金钱完全无关的应用程序。

以太坊协议实现的任意状态转换功能的概念为平台提供了独特的潜力。以太坊不是旨在用于数据存储,赌博或金融中特定应用的封闭式,单一用途协议,而是以设计为开放式的,我们认为它非常适合用作基础在未来几年中,该协议层可用于大量的金融和非金融协议。

笔记和进一步阅读 笔记 经验丰富的读者可能会注意到,事实上,比特币地址是椭圆曲线公钥的哈希,而不是公钥本身。但是,实际上将公钥哈希称为公钥本身是完全合法的密码学术语。这是因为比特币的密码学可以被认为是一种自定义数字签名算法,其中公钥由ECC公开密钥的哈希组成,签名由与ECC签名串联的ECC公开密钥组成,并且验证算法涉及检查ECC针对作为公共密钥提供的ECC公开密钥哈希的签名中的pubkey,然后针对ECC公开密钥验证ECC签名。 从技术上讲,是前11个区块的中位数。 以太坊协议应该尽可能简单实用,但是可能有必要具有相当高的复杂度,例如规模扩展,内部化存储成本,带宽和I / O成本,安全性,隐私性,透明性等。在需要复杂性的地方,文档应尽可能清晰,简洁和最新,以便完全不在以太坊上学的人可以学习并成为专家。 请参阅《以太坊虚拟机黄皮书》(该手册可作为规范和从头开始构建以太坊客户端的参考),同时在以太坊Wiki中还有许多主题,例如分片开发,核心开发,dapp开发,研究,Casper研发和网络协议。为了进行研究和可能的未来实现,请访问ethresear.ch。 表示这种情况的另一种方法是抽象。在最新的路线图计划抽象执行,使执行引擎并不一定要遵循一个规范的规范,但是例如它可以为特定应用程序,以及一个碎片进行定制。(执行引擎的这种异质性未在路线图中明确说明。还有Vlad Zamfir概念化的异质分片。) 在内部,2和“ CHARLIE”都是数字,后者以big-endian base 256表示。数字可以至少为0,最大为2 256 -1。 进一步阅读 内在价值 智慧财产 智能合约

欢迎使用OKX交易所
回到顶部