链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。

基于中本聪区块链比特币1.0之后,天才少年Vitalik Buterin(V神)在2013年年末发布了以太坊白皮书,其实他以前在比特社区是一名活跃分子,更是文章的供稿者,对比特币的见解和不足独到而专业。区块链以太坊2.0是一个运行智能合约的去中心化平台,平台上的运用按照程序设定运行,不存在停机、审查、欺诈、第三方人为干预的可能,智能合约开发者可以使用官方提供的模块进行开发以太坊区块链协议的应用。今天给大家全文翻译以太坊白皮书,共大家参考研究,全文如下:

比特币及现有概念简介

历史

分散数字货币的概念,以及财产登记等替代应用,已经存在了几十年了。上世纪80年代和90年代的匿名电子现金协议,主要依赖于一种名为Chaumian盲的密码原语,提供了一种高度隐私的货币,但这些协议由于依赖于一个集中的中介,在很大程度上未能获得支持。1998年, Wei Dai的 b-money成为第一个提出通过解决计算难题和分散协商一致来创造资金的建议,但该提案对于如何实际执行分散协商一致意见的细节很少。2005年,哈尔·芬尼提出了一个概念可重复使用的工作证明一种系统,它使用来自b-money的想法和adam back的计算困难的哈希函数题来创建一个加密货币的概念,但是由于要依赖可信的计算作为后端,它又一次没有达到理想的目标。2009年,中本聪(Satoshi Nakamoto)首次在实践中实施了一种分散的货币,将通过公钥加密管理所有权的既定原语与追踪谁拥有硬币的协商一致算法(称为“工作证明”)结合起来。

工作证明背后的机制是空间上的一个突破,因为它同时解决了两个问题。首先,它提供了一个简单和适度有效的协商一致算法,允许网络中的节点共同商定一组比特币分类账状态的规范更新。第二,它提供了一种允许自由进入协商一致进程的机制,解决了决定由谁来影响协商一致的政治问题,同时也防止了Sybil的攻击。这样做的办法是用经济障碍取代正式的参与障碍,例如要求在特定名单上登记为唯一实体-一个节点在协商一致投票过程中的权重与该节点所带来的计算能力成正比。从那时起,人们提出了另一种方法,称为桩的证明,计算节点的权重与其货币持有量成正比,而不是计算资源;关于这两种方法的相对优点的讨论超出了本文的范围,但应当指出,这两种方法都可以用作加密货币的主要计算方法。

比特币作为一个STATE过渡系统

从技术角度看,比特币等加密货币的分类账可以看作是一个状态转换系统,其中存在一个“状态”,它由所有现有比特币的所有权状态和接受状态和事务的“状态转换函数”组成,并输出一个新的状态。例如,在标准银行系统中,状态是资产负债表,事务是将X从A转移到B的请求,状态转换函数将A的帐户中的值减少X从A转移到B的请求,状态转换函数将A的帐户中的值减少X从A转移到B的请求,状态转换函数将A的帐户中的值减少X并将B帐户中的值增加X。如果A的帐户首先小于X。如果A的帐户首先小于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。

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

中的每一个输入TX:

如果引用的UTXO不在S,返回一个错误。

如果提供的签名与UTXO的所有者不匹配,则返回一个错误。

如果所有输入UTXO的面值之和小于所有输出UTXO的值和,则返回一个错误。

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

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

采掘

如果我们能够访问可靠的集中式服务,那么这个系统的实现就很简单;它可以使用集中式服务器的硬盘驱动器来跟踪状态,只需按照描述的方式进行编码即可。然而,有了比特币,我们正试图建立一个分散的货币体系,因此我们需要将国家过渡制度与共识体系结合起来,以确保每个人都同意交易的顺序。比特币的分散协商一致过程要求网络中的节点不断尝试生成称为“块”的交易包。网络的目的是每十分钟产生大约一个块,每个块包含一个时间戳,一个现在,一个引用(即。)上一个块的散列和自上一个块以来发生的所有事务的列表。随着时间的推移,这创造了一个持续不断增长的“区块链”,它不断更新以代表比特币分类账的最新状态。

在此范例中,用于检查块是否有效的算法如下:

检查块引用的前一个块是否存在且是否有效。

检查块的时间戳是否大于前一个块的时间戳,检查块上的工作证明是否有效。

放任S[0]是前一个块末尾的状态。

假设TX是块的事务列表n交易。为所有人i在……里面…n-1,集S[i+1] = APPLY(S[i],TX[i])如果任何应用程序返回错误,退出并返回false。

返回true,并注册S[n]就像这个街区尽头的以个块。

本质上,块中的每个事务必须提供一个有效的状态转换,从执行事务之前的规范状态转换到某种新的状态。请注意,状态不是以任何方式在块中编码的;它纯粹是一个要由验证节点记住的抽象,只能(安全地)计算任何块的状态,方法是从起始状态开始并依次应用每个块中的每个事务。另外,请注意,矿工将事务包含到块中的顺序很重要;如果一个块中有两个事务A和B,使得B花费由A创建的UTXO,则如果A位于B之前,则该块将是有效的。

上述清单中没有在其他系统中找到的一个有效条件是“工作证明”的要求。精确的条件是,每个块的双sha 256散列必须小于动态调整的目标,而在撰写本文时该目标约为2。187…这样做的目的是使块创建在计算上“很难”,从而防止Sybil攻击者重新构建有利于他们的整个区块链。由于SHA 256被设计为一个完全不可预测的伪随机函数,因此创建有效块的唯一方法是简单地尝试和错误,反复递增当前值,并查看新哈希是否匹配。

目前的目标是2187,网络必须使平均269在找到有效块之前尝试;一般来说,目标每2016块由网络重新校准,这样网络中的某个节点平均每十分钟就产生一个新的块。为了补偿矿工的这一计算工作,每个区块的矿工有权包括一笔交易,让自己从不知道的地方得到12.5 BTC。此外,如果任何交易的投入总额高于其产出,则差额也作为“交易费”交给矿商。顺便说一句,这也是BTC发行的唯一机制;创世状态根本不含硬币。

为了更好地理解挖掘的目的,让我们检查一下在发生恶意攻击者时会发生什么。由于比特币的底层密码系统众所周知是安全的,攻击者将攻击比特币系统中没有直接受到加密保护的一个部分:交易顺序。攻击者的策略很简单:

向商家发送100 btc以换取某种产品(最好是快速交付的数字商品)。

等待产品的交付

生成另一个事务,将相同的100 btc发送给自己。

试着说服网络,他对自己的交易是第一位的。

一旦第(1)步发生,几分钟后,一些矿工将把交易包括在一个块中,例如区块编号270。大约一个小时后,又有五个块被添加到该块之后的链中,每个块都间接地指向事务,从而“确认”了它。此时,商家将接受付款作为最后确定和交付产品;因为我们假设这是一个数字商品,交货是即时的。现在,攻击者创建另一个事务,将100 BTC发送给自己。如果攻击者简单地将其释放到野外,则事务将不会被处理;矿工将尝试运行。APPLY(S,TX)注意到TX使用不再处于状态的UTXO。因此,攻击者创建块链的“叉”,首先是挖掘块270的另一个版本,指向作为父块的同一块269,但以新事务代替旧事务。因为块数据是不同的,这需要重新做工作的证明。此外,攻击者的新版本的块270具有不同的哈希,因此原始块271至275不“指向”它;因此,原始链和攻击者的新链是完全独立的。规则是,在叉子中,最长的区块链被认为是事实,因此合法的矿工将在275链上工作,而攻击者单独处理270链。为了让攻击者使他的区块链最长,他需要比网络其他部分加起来有更多的计算能力才能赶上(因此,“51%攻击”)。

梅克尔树

左:只需在梅克尔树中显示少量的节点就可以证明分支的有效性。

右:任何试图改变梅克尔树的任何部分,最终都会导致链上某个地方的不一致。

比特币的一个重要的可扩展性特点是该块存储在一个多层次的数据结构中。块的“散列”实际上只是块头的散列,这是一个大约200字节的数据段,包含时间戳、现在、前一个块哈希和一个名为梅克尔树的数据结构的根散列,该数据结构存储了块中的所有事务。梅克尔树是二叉树的一种类型,它由一组包含底层数据的具有大量叶节点的节点、一组中间节点组成,其中每个节点是其两个子节点的散列,最后是由两个子节点的散列组成的单个根节点,表示树的“顶部”。梅克尔树的目的是允许块中的数据被分段地传递:节点只能从一个源下载一个块的头,从另一个源下载与其相关的树的一小部分,并且仍然可以确保所有数据都是正确的。这样做的原因是哈希向上传播:如果恶意用户试图在假事务中交换到梅克尔树的底部,此更改将导致上面节点发生更改,然后在该节点上发生更改,最后更改树根,从而更改块的散列,从而导致协议将其注册为一个完全不同的块(几乎可以肯定是无效的工作证明)。

梅克尔树协议可以说是长期可持续发展的关键。比特币网络中的一个“完整节点”负责存储和处理所有块,截至2014年4月,它在比特币网络中占据了大约15 GB的磁盘空间,并且每月增长超过1千兆字节。目前,这是可行的一些台式机,而不是手机,以后只有企业和爱好者才能参与。称为“简化支付验证”(SPV)的协议允许另一类节点存在,称为“轻型节点”,它下载块头,验证块头的工作证明,然后只下载与它们相关的事务的“分支”。这使得轻节点可以在安全的有力保证下,确定任何比特币交易的状态,以及它们当前的余额,同时只下载整个区块链的一小部分。

可供选择的BlockChain应用程序

采用底层区块链概念并将其应用于其他概念的想法也有着悠久的历史。1998年,Nick Szabo提出了拥有权的财产所有权的安全一份文件描述了“复制数据库技术的新进展”将如何允许一个基于区块链的系统来存储谁拥有什么土地的登记册,从而创建了一个包括定居、不利占有和格鲁吉亚土地税等概念在内的复杂框架。然而,不幸的是,当时没有有效的复制数据库系统,因此该协议从未在实践中得到实施。然而,2009年之后,比特币的分散协商一致意见一经形成,许多替代应用就开始迅速出现。

币命名-2010年创建,币命名最好描述为一个分散的名称注册数据库。在分散协议如Tor、比特币和BitMessage中,需要有某种方式来识别帐户,以便其他人可以与它们进行交互,但在所有现有解决方案中,唯一可用的标识符是伪随机散列。1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy…理想的情况下,一个人希望能够有一个帐户的名字,如“乔治”。然而,问题是,如果一个人可以创建一个名为“george”的帐户,那么其他人也可以使用相同的过程为自己注册“george”并模仿它们。唯一的解决方案是第一个文件模式,第一个寄存器成功,第二个寄存器失败-这个问题非常适合比特币协商一致协议。命名是使用这种思想实现名称注册系统的最古老和最成功的方法。

染色币-染色币(这里有人翻译成彩色硬币,是错误的,染色币是一种所有权和转让的技术)是作为一种协议,允许人们创建自己的数字货币-或者,在比特币区块链上,一种只有一个单位的货币-数字令牌-的重要情况下。在有色硬币协议中,一种通过向特定比特币UTXO公开分配颜色来“发行”一种新货币,该协议递归地定义其他UTXO的颜色与创建它们的事务所使用的输入的颜色相同(在混合颜色输入的情况下适用一些特殊规则)。这允许用户维护仅包含特定颜色的UTXO的钱包,并将其发送到与普通比特币非常类似的位置,通过块链回溯以确定它们接收到的任何UTXO的颜色。

元硬币-元货币的思想是要有一种生活在比特币之上的协议,使用比特币交易来存储元货币交易,但具有不同的状态转换功能,APPLY’…由于元现金协议不能阻止无效的元现金交易出现在比特币区块链中,因此添加了一条规则,即如果APPLY’(S,TX)返回一个错误,协议默认为APPLY’(S,TX) = S…这为创建任意加密货币协议提供了一种简单的机制,可能具有无法在比特币内部实现的高级功能,但开发成本非常低,因为比特币协议已经处理了挖掘和联网的复杂性。元账户已被用于执行某些类别的金融合同、名称登记和分散的交换。

因此,一般来说,有两种方法来建立一个共识协议:建立一个独立的网络和建立一个基于比特币的协议。前一种方法虽然在币命名这样的应用程序中相当成功,但很难实现;每个单独的实现都需要引导独立的块链,以及构建和测试所有必要的状态转换和网络代码。此外,我们预测,分散协商一致技术的应用集将遵循幂律分布,其中绝大多数应用程序太小,无法保证自己的区块链,我们注意到存在大量分散应用程序,特别是分散的自治组织,它们需要相互交互。

另一方面,基于比特币的方法存在一个缺陷,即它没有继承比特币的简化支付验证功能。SPV适用于比特币,因为它可以使用区块链深度作为有效性的代理;在某种程度上,一旦交易的祖先走得足够远,就可以肯定地说,他们是国家的合法一部分。另一方面,基于块链的元协议不能强迫区块链不包括在它们自己的协议上下文中无效的事务。因此,一个完全安全的SPV元协议实现需要一直向后扫描到比特币块链的开始,以确定某些事务是否有效。目前,所有基于比特币的元协议的“轻量级”实现都依赖于可信的服务器来提供数据,这可以说是一种高度次优的结果,尤其是当加密货币的主要目的之一是消除对信任的需求时。

脚本编写

即使没有任何扩展,比特币协议实际上也为“智能合同”概念的薄弱版本提供了便利。比特币中的UTXO不仅可以由公钥拥有,还可以由使用简单的基于堆栈的编程语言表示的更复杂的脚本所拥有。在这个范例中,UTXO必须提供满足脚本的数据的事务开销。实际上,甚至基本的公钥所有权机制也是通过脚本实现的:脚本以一个椭圆曲线签名作为输入,根据事务和拥有UTXO的地址验证它,如果验证成功返回1,否则返回0。其他更复杂的脚本存在于各种附加用例中。例如,可以构造一个脚本,它需要从给定的三个私钥中的两个签名来验证(“multisig”),这是一个对公司帐户、安全储蓄帐户和一些商家托管情况有用的设置。脚本也可以用来支付解决计算问题的赏金,甚至可以构造一个脚本,上面写着“如果你能提供SPV证据证明你发送了这个面额的Dogecoin交易给我”,你甚至可以构造一个类似于“这个比特币UTXO是你的”的脚本,实质上是允许分散的跨加密货币交换。

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

缺乏完备性也就是说,虽然比特币脚本语言支持的计算子集很大,但它几乎不支持一切。缺少的主要类别是循环。这样做是为了避免事务验证过程中的无限循环;理论上,这对于脚本程序员来说是一个可以克服的障碍,因为任何循环都可以通过使用if语句多次重复底层代码来模拟,但是它确实导致脚本的空间效率非常低。例如,实现另一种椭圆曲线签名算法可能需要256个重复乘法轮,所有这些都单独包含在代码中。

价值盲目-UTXO脚本无法对可以提取的金额提供细粒度控制。例如,甲骨文合同的一个强大的用例是套期保值合同,其中A和B投入了价值1000美元的BTC,30天后脚本将价值1000美元的BTC发送给A,其余的发送给B。这将需要一个甲骨文来确定1 BTC的美元价值,但即便如此,在信任和基础设施需求方面,与现在可获得的完全集中的解决方案相比,这仍是一个巨大的改进。然而,由于UTXO是全部或无意义的,实现这一目标的唯一途径是通过非常低效的攻击,即拥有许多不同教派的UTXO(例如。一个UTXO为2k对于每k到30)和有O选择哪个UTXO发送给A和哪个到B。

区块缺乏-aUTXO既可以用也可以不用没有机会进行多阶段的合同或脚本来保留任何其他内部状态。这使得很难达成多级期权合同、分散交换提议或两阶段密码承诺协议(对于安全的计算赏金来说是必要的)。这也意味着UTXO只能用于构建简单的一次性契约,而不能用于构建更复杂的“有状态”契约,比如分散的组织,并且使得元协议难以实现。二元状态与价值盲目性相结合,也意味着另一个重要的应用-退出限制-是不可能的.

分块盲目-UTXO对块链数据(如现在、时间戳和以前的块哈希)是盲的。这严重限制了博彩和其他几个类别的应用程序,因为它剥夺了脚本语言潜在价值的随机性来源。

因此,我们看到了三种在加密货币之上构建高级应用程序的方法:构建一个新的区块链,在比特币上使用脚本,以及在比特币之上构建一个元协议。构建一个新的区块链允许无限自由地构建一个特性集,但代价是开发时间、引导工作和安全性。使用脚本很容易实现和标准化,但它的能力非常有限,而元协议虽然容易,但在可伸缩性方面存在缺陷。我们打算建立一个可供选择的框架,提供更大的开发轻松收益以及更强大的轻量级客户端属性,同时允许应用程序共享经济环境和区块链安全。

以太坊

以太坊的目的是创建一种构建分散应用程序的替代协议,提供一套不同的折衷方案,我们认为这些协议对于大量分散应用程序非常有用,特别强调快速开发时间、小型和很少使用的应用程序的安全性以及不同应用程序非常有效地进行交互的能力的情况。以太坊通过构建本质上是最抽象的基础层来实现这一点:一个带有内置图灵完整编程语言的区块链,允许任何人编写智能契约和分散应用程序,在这些应用程序中,他们可以为所有权、事务格式和状态转换函数创建自己的任意规则。命名的基本版本可以用两行代码编写,其他协议(如货币和声誉系统)可以在20以下构建。智能合同,即包含价值的密码“盒子”,只有在满足特定条件的情况下才能解锁,也可以建立在平台之上,由于图灵的完整性、价值意识、区块链意识和状态的增加,比特币脚本提供的能力要大得多。

原理

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

简约:以太坊协议应该尽可能简单,即使代价是一些数据存储或时间效率低下。FN。三理想情况下,一个普通的程序员应该能够遵循并实现整个规范,FN。四从而充分认识到密码货币所带来的前所未有的民主化潜力,并进一步实现了以太坊作为一种向所有人开放的协议的愿景。任何增加复杂性的优化都不应该包括在内,除非该优化提供了非常大的好处。

普遍性:以太的设计哲学的一个基本部分是,以太没有“特征”。FN。五相反,以太坊提供了一种内部图灵完整的脚本语言,程序员可以使用它来构造任何可以通过数学定义的智能契约或事务类型。想发明你自己的金融衍生产品吗?有了以太,你可以。想制造自己的货币吗?把它设为以太合同。想要建立一个全面的守护进程或天网吗?你可能需要几千个连锁合同,并确保慷慨地喂养他们,这样做,但没有什么能阻止你与以太在你的指尖。

模块化*“以太协议”的部分应尽可能模块化和可分离。在开发过程中,我们的目标是创建一个程序,如果在一个地方进行一个小的协议修改,那么应用程序栈将继续工作,而无需进行任何进一步的修改。诸如ethash之类的创新(见黄纸附录或Wiki文章)、改良的Patricia树(黄纸, 维基)和RLP(yp, 维基)应该并且是作为独立的、功能完整的库实现的。这是因为,即使这些特性在以太坊中使用,即使以太坊不需要某些特性,这些特性在其他协议中也是可用的。应该最大限度地开发,以使整个加密货币生态系统受益,而不仅仅是它本身。

敏捷性“以太协议”的细节不是一成不变的。虽然我们将非常明智地修改高级别结构,例如使用切分路线图,抽象执行,仅以协商一致的方式提供数据。稍后在开发过程中进行的计算测试可能会导致我们发现某些修改,例如对协议体系结构或EIT虚拟机(EVM)的修改,将大大提高可伸缩性或安全性。如果有任何这样的机会,我们将加以利用。

非歧视和非审查*议定书不应试图积极限制或阻止特定类别的使用。议定书中的所有管制机制都应设计成直接管制危害,而不是试图反对具体的不良应用。一个程序员甚至可以运行一个无限循环脚本,只要他们愿意继续支付每个计算步骤的事务费。

以太帐户

在以太坊中,状态由称为“Account”的对象组成,每个帐户都有一个20字节的地址,状态转换是在帐户之间直接传输值和信息。以太坊帐户包含四个字段:

目前这个,用于确保每个事务只能处理一次的计数器。

帐户活期币平衡

账户合同代码

账户储物

“以太”是“以太”的主要内部密码燃料,用于支付交易费用。一般而言,有两类帐户:外部拥有账户,由私钥控制,以及合同账户由他们的合同代码控制。外部拥有的帐户没有代码,您可以通过创建和签署事务从外部拥有的帐户发送消息;在合同帐户中,每次合同帐户收到其代码激活的消息时,都允许它读取和写入内部存储,并发送其他消息或依次创建合同。

请注意,不应将以太坊中的“Contracts”视为应该“实现”或“遵守”的东西;相反,它们更像是生活在以太坊执行环境中的“自主代理”,在被消息或事务“戳”时总是执行特定的代码段,并直接控制自己的以太平衡和自己的键/值存储,以跟踪持久变量。

消息和事务

术语“Transaction”在以太坊中用于指已签名的数据包,该数据包存储从外部拥有的帐户发送的消息。交易包括:

消息的接收方

标识发件人的签名

从发送方转移到收件人的以太币数量。

可选数据字段

一个区块链值,表示允许事务执行所采取的最大计算步骤数。

A GASPRICE值,表示发送方按计算步骤支付的费用。

前三个是任何加密货币中预期的标准字段。默认情况下,数据字段没有功能,但是虚拟机有一个操作码,合同可以用来访问数据;例如,如果合同作为块链域注册服务运行,那么它可能希望将传递给它的数据解释为包含两个“字段”,第一个字段是要注册的域,第二个字段是要注册到的IP地址。契约将从消息数据中读取这些值,并将它们适当地放在存储中。

这个STARTGAS和GASPRICE字段对于以太坊的反拒绝服务模型来说是至关重要的。为了防止代码中意外或敌对的无限循环或其他计算浪费,每个事务都需要对它可以使用的代码执行的计算步骤设置一个限制。计算的基本单位是“GAS”;通常,计算步骤花费1 GAS,但是一些操作花费更高的气体量,因为它们在计算上更昂贵,或者增加了必须作为状态一部分存储的数据量。事务数据中的每个字节也要收取5 GAS的费用。收费系统的目的是要求攻击者按比例支付所消耗的每一个资源,包括计算、带宽和存储;因此,任何导致网络消耗更多这些资源的事务都必须具有与增量大致成比例的煤气费。

通讯

合同能够向其他合同发送“信息”。消息是从未序列化过的虚拟对象,并且仅存在于以太坊执行环境中。一条信息包含:

消息的发送方(隐式)

消息的接收方

与消息一起传输的以太币的数量。

可选数据字段

一个区块链价值

从本质上说,一个消息就像一个事务,除了它是由一个合同而不是一个外部参与者产生的。当当前执行代码的契约执行CALL操作码,它生成并执行一条消息。与事务一样,邮件会导致收件人帐户运行其代码。因此,合同可以与外部行为者完全相同的方式与其他合同建立关系。

请注意,由交易或合同分配的气体余量适用于该交易和所有次执行所消耗的气体总量。例如,如果外部参与者A向B发送一个事务,其中有1000种气体,而B在向C发送消息之前消耗600种气体,而C的内部执行在返回之前消耗300种气体,则B可以在耗尽气体之前再消耗100种气体。

以太坊区块函数转移

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

检查交易是否格式良好,签名是有效的,并且该签名与发件人帐户中的当前值相匹配。如果没有,则返回一个错误。

计算交易费用STARTGAS * GASPRICE,并根据签名确定发送地址。从寄件人的帐户余额中减去费用,并增加寄件人的现值。如果没有足够的余额来消费,请返回一个错误。

初始化GAS = STARTGAS,然后每字节取出一定数量的气体来支付事务中的字节。

将事务值从发件人的帐户转移到接收帐户。如果接收帐户还不存在,请创建它。如果接收帐户是合同,则运行合同代码以完成或直到执行完为止。

如果由于发件人没有足够的钱或代码执行的气体用完而导致价值转移失败,则恢复除支付费用以外的所有状态更改,并将费用添加到矿工帐户。

否则,将所有剩余气体的费用退还给发件人,并将所支付的煤气费发送给矿工。

例如,假设合同的代码是:

if !self.storage[calldataload(0)]:

self.storage[calldataload(0)] = calldataload(32)

注意,实际上契约代码是用低级别的EVM代码编写的;为了清晰起见,这个示例是用我们的一种高级语言-毒蛇编写的,可以编译成EVM代码。假设契约的存储从空开始,事务以10以太值、2000年天然气、0.001以太币汽油价格和64字节数据发送,字节0-31表示数字。2和表示字符串的字节32-63。CHARLIE.FN。六在这种情况下,状态转换函数的过程如下:

检查事务是否有效且格式良好。

检查事务发送方是否至少有2000*0.001=2以太。如果是,那么从寄件人的帐户中减去2以太。

初始化GAS=2000;假设事务长170字节,字节费为5,减去850,剩下1150个GAS。

从发件人的帐户中再减去10个以太,并将其添加到合同的帐户中。

运行代码。在本例中,这很简单:它检查合同是否存储在索引处2时,注意到它不是,因此它在索引处设置了存储。2价值CHARLIE…假设这需要187个气体,那么剩余的气体量是1150-187=963。

将963*0.001=0.963以太添加回发送方帐户,并返回结果状态。

如果在交易的接收端没有合同,那么交易费用总额就等于提供的交易费用。GASPRICE乘以事务的长度(以字节为单位),以及在事务旁边发送的数据将是不相关的。

请注意,消息在恢复方面等效于事务:如果消息执行耗尽了GAS,则该消息的执行以及由该执行触发的所有其他执行将恢复,但父执行不需要恢复。这意味着一个合同调用另一个合同是“安全的”,就好像A用G气体调用B,那么A的执行就保证最多损失G气体。最后,请注意有一个操作码,CREATE,这就创建了一个契约;它的执行机制通常类似于CALL,除非执行的输出决定新创建的契约的代码。

代码执行

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

这个堆叠,是一种可以将值推送和弹出的先入先出的容器。

记忆,一个可无限扩展的字节数组。

合同的长期期限储物、钥匙/价值商店。与堆栈和内存不同,堆栈和内存在计算结束后重置,存储将长期保持。

代码还可以访问传入消息的值、发送方和数据以及块头数据,代码还可以返回数据的字节数组作为输出。

EVM代码的形式执行模型非常简单。当以太坊虚拟机运行时,它的全部计算状态可以由元组定义。(block_state, transaction, message, code, memory, stack, pc, gas),在哪里block_state包含所有帐户并包括余额和存储的全局状态。在每一轮执行开始时,通过接受pc-第四字节code(或0如果pc >= len(code)),每个指令都有自己的定义,说明它如何影响元组。例如,ADD从堆栈中弹出两个项,并将它们的和推入,减少gas增加1和增量pc增加1,以及SSTORE弹出堆栈中的前两项,并将第二项插入到由第一项指定的索引处的合同存储中。虽然有许多方法可以通过实时编译来优化以太坊虚拟机的执行,但可以在几百行代码中完成以太坊的基本实现。

区块链与采矿

以太坊区块链在许多方面与比特币区块链相似,尽管它确实有一些不同之处。与比特币在区块链结构方面的主要区别在于,与比特币不同(比特币只包含交易列表的副本),以太坊块包含事务列表和最近状态的副本。除此之外,还在块中存储了另外两个值,块号和难度。以太坊中的基本块验证算法如下:

检查前面引用的块是否存在且是否有效。

检查该块的时间戳是否大于所引用的前一个块的时间戳,并且在以后不到15分钟内。

检查区块号、难度、交易根、伯伯根和气体限值(各种低层次的具体概念)是否有效。

检查块上的工作证明是否有效。

放任S[0]是前一个块末尾的状态。

放任TX是块的事务列表,与n交易。为所有人i在……里面…n-1,集S[i+1] = APPLY(S[i],TX[i])…如果任何应用程序返回错误,或者在此之前块中消耗的气体总量超过GASLIMIT,返回一个错误。

放任S_FINAL成S[n],但加上付给矿工的整块报酬。

检查状态的梅克尔树根是否为S_FINAL等于块标头中提供的最终状态根。如果是,则该块有效;否则,该块无效。

乍一看,这种方法看起来效率很低,因为它需要用每个块存储整个状态,但实际上效率应该可以与比特币相媲美。原因是状态存储在树结构中,在每个块之后只需要更改树的一小部分。因此,一般来说,在两个相邻的块之间,树的绝大部分应该是相同的,因此数据可以使用指针存储一次和引用两次(即。(子树的散列)。为此,使用了一种称为“Patricia树”的特殊树,包括对梅克尔树概念的修改,该概念允许插入和删除节点,而不仅仅是有效地更改节点。此外,由于所有的状态信息都是最后一个块的一部分,所以没有必要存储整个区块链历史-如果可以将其应用于比特币,就可以计算出这种策略可以节省5到20倍的空间。

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

应用

一般来说,在以太坊顶部有三种类型的应用程序。第一类是金融应用程序,为用户提供更强大的管理和签订合同的方法。这包括子货币、金融衍生品、套期保值合同、储蓄钱包、遗嘱,甚至还有一些类别的全面就业合同。第二类是半金融应用,其中涉及资金,但也有一个沉重的非货币方面的工作正在进行;一个完美的例子是解决计算问题的自我执行奖金。最后,有些应用程序,如在线投票和分散治理,根本就不是财务问题。

令牌系统

区块链令牌系统有许多应用程序,从代表美元或黄金等资产的子货币到公司股票,代表智能财产的单个令牌,安全令人难忘的优惠券,甚至与传统价值完全无关的令牌系统,作为激励的点系统。令牌系统在以太坊中非常容易实现。需要理解的关键是,货币或令牌系统基本上是一个数据库,只有一个操作:从A中减去X单位并将X单位交给B,并规定:(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/美元的价值。最简单的方法是通过特定方维护的“数据输入”契约(例如。(纳斯达克(Nasdaq)的设计,使各方能够根据需要更新合同,并提供一个界面,允许其他合同向该合同发送信息,并得到提供价格的回复。

鉴于这一关键因素,套期保值合同看起来如下:

等待甲方输入1000币。

等待乙方输入1000币。

通过查询数据提要合同,在存储中记录1000币的美元值,假设这是$x。

30天后,允许A或B“重新激活”合同,以便将价值x美元的以太币(通过再次查询数据提要合同以获得新的价格)发送到A,其余的发送到B。

这样的合同在密码商业方面将有很大的潜力。关于密码货币的一个主要问题是,它是不稳定的;虽然许多用户和商人可能想要处理密码资产的安全和方便,但他们可能不希望面对这样的前景,即在一天之内损失他们资金价值的23%。到目前为止,最普遍提出的解决方案是发行者支持的资产;其想法是发行人创建一种子货币,他们有权发行和撤销货币单位,并向任何向其(脱机)提供特定基础资产单位(例如)的人提供一种货币单位。黄金,美元)。然后,发行人承诺向任何将密码资产的一个单位发还的人提供基础资产的一个单位。这种机制允许任何非加密资产被“提升”到加密资产,条件是发行者可以被信任。

然而,在实践中,发行人并不总是值得信赖的,在某些情况下,银行基础设施过于薄弱,或过于敌对,以致于此类服务无法存在。金融衍生品提供了另一种选择。在这里,不只是一个发行人提供资金来支持一项资产,而是一个分散的投机者市场,押注密码参考资产的价格(例如。会上升,扮演这个角色。与发行者不同的是,投机者没有选择在交易中违约,因为套期保值合约将他们的资金存放在代管中。请注意,这种方法并不是完全分散的,因为仍然需要一个可信的源来提供价格代码,尽管可以说,这在降低基础设施需求方面仍然是一个巨大的改进(与发行者不同,发布价格提要不需要许可证,很可能被归类为言论自由)和减少欺诈的可能性。

身份和声誉系统

最早的替代密码货币,币的命名,试图使用类似比特币的区块链来提供名称注册系统,用户可以在公共数据库中与其他数据一起注册自己的名字。引用的主要用例是dns系统,将诸如“bitcoin.org”之类的域名(或者,在命名的例子中,是“bitcoin.bit”)映射到一个IP地址。其他用例包括电子邮件认证和可能更先进的信誉系统。以下是在Etruum上提供类似命名的名称注册系统的基本合同:

def register(name, value):

if !self.storage[name]:

self.storage[name] = value

契约非常简单,所有这些都是以太坊网络中的一个数据库,可以添加,但不能修改或删除。任何人都可以注册一个具有某种价值的名称,然后注册就会永远保持不变。更复杂的名称登记合同还将有一个“功能条款”,允许其他合同对其进行查询,并为“所有者”(即“所有者”)提供一种机制。更改数据或传输所有权的名称的第一个寄存器。人们甚至可以在上面添加声誉和信任网络功能。

分散文件存储

在过去几年里,出现了许多流行的在线文件存储初创公司,其中最著名的是Dropbox,它们寻求允许用户上传硬盘的备份,并让服务商店进行备份,并允许用户以月费换取访问。但是,在这一点上,文件存储市场有时效率相对较低;粗略地看一下各种文件存储市场。现有解决方案显示,特别是在“不可思议的山谷”20-200 GB的水平上,无论是免费配额还是企业级折扣,主流文件存储成本的每月价格都是如此,以至于你在一个月内支付的硬盘成本超过了整个硬盘的成本。以太坊合同可以开发一个分散的文件存储生态系统,个人用户可以通过出租自己的硬盘来赚取少量的钱,而未使用的空间可以用来进一步降低文件存储的成本。

这种设备的关键支撑部分将是我们所称的“分散的Dropbox合同”。本合同的作用如下。首先,将所需的数据分割成块,对每个块进行加密以实现隐私,并从中构建一棵梅克尔树。然后,我们按照这样的规则订立合同:每N个块,契约将在梅克尔树中选择一个随机索引(使用以前的块散列,从合同代码中访问,作为随机性的来源),并将X以太交给第一个向交易提供简化支付验证的实体-就像在树中的特定索引处证明块的所有权一样。当用户想要重新下载他们的文件时,他们可以使用微支付通道协议(例如。支付1 Szabo/32 KB)来恢复该文件;最节省费用的方法是支付方在交易结束前不发布交易,而是在每32 KB之后用相同的一次替换为稍微有利可图的交易。

该协议的一个重要特征是,尽管人们似乎相信许多随机节点不会决定忘记文件,但通过秘密共享将文件分成多个片段,并通过查看每个节点的合同,可以将该风险降低到接近零。如果合同仍在支付款项,这就提供了一个密码证明,证明有人仍在保存该文件。

分散自治组织

“分权自治组织”的一般概念是一个虚拟实体,它有一定的成员或股东,这些成员或股东可能以67%的多数,有权使用实体的资金并修改其代码。成员们将集体决定该组织应如何分配其资金。分配DAO的资金的方法可以从赏金、薪水到更奇特的机制,比如内部货币来奖励工作。这在本质上复制了传统公司或非营利组织的法律装束,但只使用加密区块链技术来执行。到目前为止,关于DAOS的大部分讨论都围绕着“分散的自治公司”(DAC)的“资本主义”模式,这种模式包括分红股东和流通股;另一种可能被称为“分权自治社区”的选择,将让所有成员在决策中享有平等的份额,并要求67%的现有成员同意增减一名成员。这样,一个人只能有一个成员的要求就需要由该集团集体执行。

关于如何编写DAO代码的一般大纲如下。最简单的设计就是一段自我修改的代码,如果三分之二的成员同意修改,它就会改变。尽管代码在理论上是不可变的,但通过将代码块放在单独的契约中,并且具有存储在可修改存储中的可调用契约的地址,可以轻松地绕过这一问题,并具有事实上的可更改性。在这样一个DAO合同的简单实现中,将有三种事务类型,通过事务中提供的数据来区分:

[0,i,K,V]用索引注册提案i更改存储索引处的地址K重视V

[1,i]对提案投赞成票i

[2,i]最后确定提案i如果有足够的选票

然后,合同中的每一项都有条款。它将保存所有开放存储更改的记录,以及谁投票支持它们的列表。它还将有一份所有成员的名单。当任何存储更改都有三分之二的成员投票赞成时,最终事务就可以执行该更改。一个更复杂的骨架还可以为诸如发送事务、添加成员和删除成员等功能内置投票能力,甚至还可以提供以下功能:液态民主-投票制代表团任何人都可以指派某人为他们投票,而分配是传递性的,所以如果A分配B和B分配C,则C决定A的投票)。这种设计将使DAO作为一个分散的社区有机地发展,使人们最终能够将过滤成员的任务交给专家,尽管与“当前系统”的专家不同的是,随着时间的推移,个体社区成员改变了他们的组合,专家们可以很容易地进入或消失。

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

进一步应用

1.储蓄钱包…假设爱丽丝想要保证她的资金安全,但是担心她会输,或者有人会黑她的私钥。她与一家银行Bob签订了如下合同:

仅爱丽丝一人每天最多可提取1%的资金。

只有Bob每天最多可以提取1%的资金,但是Alice有能力用她的钥匙关闭这个能力进行交易。

爱丽丝和鲍勃一起可以收回任何东西。

正常情况下,每天1%对爱丽丝来说就足够了,如果爱丽丝想多取点钱,她可以联系鲍勃寻求帮助。如果爱丽丝的钥匙被黑了,她就跑去找鲍勃,把钱转移到一份新的合同上。如果她丢了钥匙,鲍勃最终会把钱拿出来的。如果鲍勃被证明是恶意的,那么她就可以关掉他退出的能力。

2.资金的对冲保险…人们可以轻松地达成金融衍生品合约,但可以使用天气数据,而不是任何价格指数。如果一个衣阿华州的农民购买了一种衍生产品,这种衍生产品是根据爱荷华州的降雨量反向支付的,那么如果发生干旱,农民就会自动收到钱,如果有足够的雨水,农民会很高兴,因为他们的庄稼会很好。这可以扩展到一般的自然灾害保险。

3.分散的数据输入…对于不同的金融合同,实际上可以通过一种名为谢林…SchellingCoin基本上是这样工作的:n个缔约方都将给定数据的值(如:1)投入到系统中。(ETH/美元价格),值被排序,第25和75百分位数之间的每个人都得到一个作为奖励的记号。每个人都有动机提供其他人都会提供的答案,而很多玩家能够现实地达成一致的唯一价值就是明显的违约:真相。这就创建了一个分散的协议,理论上可以提供任意数量的值,包括ETH/美元的价格、柏林的温度,甚至是特定的硬计算的结果。

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

5.云计算…EVM技术还可以用来创建一个可验证的计算环境,允许用户要求他人进行计算,然后可选择地要求证明在某些随机选择的检查点上进行的计算是正确的。这允许创建一个云计算市场,任何用户都可以使用他们的台式机、笔记本电脑或专用服务器参与其中,并且可以使用现场检查和安全存款来确保系统是可信的(即。节点无法盈利地欺骗)。虽然这样的系统可能不适用于所有的任务;例如,需要高级别进程间通信的任务不能很容易地在一个庞大的节点云中完成。然而,其他任务更容易并行化;像SETI@HOME、折叠@HOME和遗传算法这样的项目可以很容易地在这样的平台上实现。

6.点对点赌博…任何数目的点对点赌博协议,如Frank Stajano和Richard Clayton的赛博骰子,可以在以太坊块链上实现。最简单的赌博协议实际上只是下一个块哈希上的差异契约,可以从那里建立更高级的协议,以几乎零的费用创建没有欺骗能力的赌博服务。

7.预测市场…如果有一个甲骨文或SchellingCoin,预测市场也很容易实现,而预测市场连同SchellingCoin可能被证明是第一个主流应用程序。急躁作为分散组织的治理协议。

8.连锁分散市场,以身份和声誉体系为基础。

联合体与关注点

实现修改GHOST

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

正如Sompolinsky和Zohar所描述的那样,幽灵解决了网络安全损失的第一个问题,在计算哪个链是“最长”的链时,包含了陈旧的块;也就是说,不仅是块的父级和进一步的祖先,而且是块祖先的陈腐后代(用以太坊术语来说,“叔叔”)被添加到计算中,在计算中添加了哪个块有最大的工作支持证据。为了解决集中化偏见的第二个问题,我们超越了Sompolinsky和Zohar所描述的协议,并为Stales提供块奖励:一个陈旧块获得其基本奖励的87.5%,而包含陈旧块的侄子得到其余12.5%。然而,交易费不判给叔叔。

以太坊实现了一个简化版本的,它只下降了七个层次。具体来说,它的定义如下:

块必须指定父块,并且必须指定0或多个叔父。

包括在街区内的叔叔B必须具有下列属性:

它一定是k-第一代祖先B,在哪里2 <=>

它不可能是B

叔父必须是有效的块头,但不需要是以前验证过的块,甚至不需要是有效的块。

叔父必须与以前各区块中包括的所有叔父和在同一块中的所有其他叔父不同(非双重包含)。

为每一个叔叔U在块B.的矿工B获得一个额外的125%添加到它的Coinbase奖励,而U的矿工得到标准Coinbase奖励的93.75%。

这种有限版本的魂,其叔父只能包括7代人,被使用的原因有两个。首先,在计算给定块的叔父是否有效时,无限的魂会包含太多的复杂因素。第二,无限制的与补偿使用在以太消除地雷矿工在主链,而不是公共攻击者的链。

收费

由于在区块链中发布的每一项事务都要求网络需要下载和验证它的成本,因此需要某种监管机制,通常涉及交易费用,以防止滥用。比特币使用的默认方法是纯粹自愿收费,依靠矿商充当守门人,并设定动态最低收费标准。这种方式在比特币界得到了很好的接受,特别是因为它是“以市场为基础的”,允许矿商和交易发送者之间的供求决定价格。然而,这条推理的问题是,交易处理不是一个市场;虽然将交易处理理解为矿工向发送方提供的服务具有直观的吸引力,但实际上,矿工所包含的每一笔交易都需要由网络中的每个节点处理,因此交易处理的绝大部分费用由第三方承担,而不是由决定是否将其包括在内的采矿者承担。因此,公地悲剧问题很有可能发生。

然而,事实证明,在以市场为基础的机制中,当给定一个特别不准确的简化假设时,它会神奇地抵消自身的缺陷。论点如下。假设:

事务导致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的常量,但在进一步分析后可能会更改。

另一个抑制比特币大块大小的因素是:较大的块需要更长的传播时间,因此成为死板的可能性更高。在以太坊中,高消耗气体的块也可能需要更长的时间来传播,因为它们在物理上更大,也因为它们需要更长的时间来处理事务状态转换来验证。这种延迟抑制在比特币中是一个重要的考虑因素,但在以太坊中则是如此,因为有了协议;因此,依赖受管制的块限制提供了一个更稳定的基线。

图灵(英国数学家)的计算-完备性

一个重要的注意是以太坊虚拟机是以图灵的理论计算机完备性为基础;这意味着EVM代码可以编码任何可以想象的计算,包括无限循环。EVM代码允许以两种方式循环。首先,有一个JUMP指令,该指令允许程序跳回代码中的前一个位置,以及JUMPI指令执行条件跳转,允许执行如下语句while x <>

正如在状态转换部分中描述的那样,我们的解决方案的工作方式是要求事务设置它允许采取的最大计算步骤数,如果执行所需的计算时间较长,则恢复计算,但仍要支付费用。信息以同样的方式工作。为了展示解决方案背后的动机,请考虑以下示例:

攻击者创建一个运行无限循环的契约,然后将激活该循环的事务发送给矿工。矿工将处理事务,运行无限循环,并等待它耗尽气体。即使执行过程已经用光了,并且中途停止了,事务仍然是有效的,矿工仍然要求攻击者为每一个计算步骤收取费用。

攻击者创建一个非常长的无限循环,目的是迫使矿工在如此长的时间内继续计算,到计算完成时,还会出现更多的块,矿工将不可能将交易包括进来以索取费用。但是,攻击者将被要求提交一个STARTGAS限制执行所能采取的计算步骤的数量,因此矿工将提前知道计算将采取过多的步骤。

攻击者看到一个具有如下形式的代码的契约send(A,contract.storage[A]); contract.storage[A] = 0,并发送一个带有足够气体的事务,以运行第一步,而不是第二步(即。退出但不让余额下降)。合同作者不需要担心防止此类攻击,因为如果执行过程中途停止,他们就会被恢复。

金融合同的工作方式是取9个专有数据源的中位数,以便将风险降到最低。攻击者接管数据提要之一,该数据提要设计为可通过DAOS部分中描述的可变地址调用机制修改,并将其转换为运行无限循环,从而试图迫使从金融合同中索要资金的任何尝试耗尽汽油。然而,金融合同可以设定一个气体限制的信息,以防止这一问题。

图灵-完整性的替代方法是图灵-不完备(密码破译),其中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项合同的订立和执行可以很容易地纳入一项合同)。另一个有问题的问题是,消息的Address字段是一个变量,因此一般情况下,甚至不可能提前判断给定合同将调用哪些其他合同。因此,总而言之,我们有一个令人惊讶的结论:图灵-完整性令人惊讶地易于管理,而缺乏图灵完整性同样令人惊讶地难以管理,除非完全相同的控制到位-但在这种情况下,为什么不让协议是图灵-完整?

货币和发行

以太坊网络包括自己的内置货币Ether,其双重目的是提供初级流动性层,以便在各种类型的数字资产之间进行有效的交换,更重要的是提供支付交易费用的机制。为了方便和避免将来的争论(见当前比特币中的mbtc/ubtc/satoshi辩论),这些面额将预先贴上标签:

1:魏

1012*Szabo

1015芬尼

1018*以太币

这应被视为“美元”和“美分”或“BTC”和“Satoshi”概念的扩展版本。在不久的将来,我们预计“以太”将用于普通交易,“Finney”用于微型交易,“Szabo”和“weo”将用于关于收费和协议执行的技术讨论;其余的名称可能会在以后有用,此时不应包括在客户中。

发行模式如下:

以太将在货币销售中以每BTC 1000-2000个以太币的价格发行,这一机制旨在为以太坊组织提供资金并为发展支付费用,而Master硬币和NXT等其他平台已经成功地使用了这一机制。较早的买家将受益于更大的折扣。从出售中获得的BTC将完全用于支付开发商的工资和奖金,并投资于以太坊和加密货币生态系统中的各种盈利性和非营利项目。

销售总额(60102216 Eth)的0.099倍将分配给组织,以补偿早期贡献者,并在创世纪块之前支付ETH标价的费用。

销售总额的099倍将作为长期储备。

26倍,销售总额将分配给矿工每年永远在那个点之后。

5年后则成立

货币单位1.198X 1.458X 2.498X购买者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%。因此,在均衡状态下,更多的以太币会在销售中被购买,所以每一个单位都会再一次和以前一样有价值。该组织也将有1.198倍的BTC,这可以被认为是分成两部分:最初的BTC和额外的0.198x。因此,这种情况是完全等价对于捐赠,但有一个重要的区别:组织持有纯粹的BTC,因此没有激励支持以太单位的价值。

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

请注意,在未来,以太坊很可能会转向一种股权证明模型,将发行要求降低到每年0到0.05倍之间。如果以太组织失去资金或因任何其他原因而消失,我们将留下一个“社会契约”:任何人都有权创建未来的以太坊候选版本,唯一的条件是以太的数量最多必须等于。60102216 * (1.198 + 0.26 * n)哪里n是发生地块后的年数。创建者可以自由地聚集、出售或以其他方式分配pos驱动的供应扩张与最大允许供应扩张之间的部分或全部差异,以支付开发费用。不符合社会契约的候选升级可以被合理地分为兼容版本。

采矿集中化

比特币挖掘算法的工作原理是让矿工一次又一次地在稍微修改过的块标头版本上计算SHA 256,直到最终有一个节点的哈希值小于目标(目前大约为2)。192)。然而,这种挖掘算法容易受到两种集中化形式的影响。首先,采矿生态系统已由专用集成电路ASIC(应用专用集成电路)、专门为比特币挖掘的具体任务设计的计算机芯片,因此其效率提高了数千倍。这意味着比特币开采不再是高度分散和平等的追求,需要数百万美元的资本才能有效参与。其次,大多数比特币矿工实际上并不在本地执行块验证;相反,他们依赖于一个集中的挖掘池来提供块头。这个问题可以说更糟:截至本文撰写之时,前三大矿业池间接控制了比特币网络中大约50%的处理能力,不过,如果一个池或联盟试图进行51%的攻击,矿商可以切换到其他矿池,这一事实缓解了这一局面。

当前的目的是使用一种挖掘算法,其中要求矿工从状态中获取随机数据,从区块链中的最后N个块中计算一些随机选择的事务,并返回结果的散列。这有两个重要的好处。首先,以太坊契约可以包括任何类型的计算,因此以太坊 ASIC本质上是用于一般计算的ASIC。更好的CPU。其次,挖掘需要访问整个区块链,迫使矿工存储整个区块链,并至少能够验证每个事务。这就消除了对集中式采矿池的需求;虽然挖掘池仍然可以发挥晚间报酬分配的随机性这一合法作用,但这种功能可以由没有中央控制的对等池提供同样好的服务。

该模型未经测试,在使用合同执行作为挖掘算法时,在避免某些聪明的优化方面可能会遇到困难。然而,该算法的一个显著有趣的特性是,它允许任何人“毒害井”,方法是在专门设计来阻止某些ASIC的区块链中引入大量合同。ASIC制造商利用这种手段互相攻击的经济动机是存在的。因此,我们正在制定的解决办法最终是一种适应性的人类经济解决方案,而不是纯粹的技术解决办法。

可伸缩性

以太坊的一个共同关注点是可伸缩性问题。与比特币一样,以太坊也存在这样的缺陷,即每个事务都需要由网络中的每个节点处理。使用比特币,当前区块链的大小约为15 GB,以每小时约1MB的速度增长。如果比特币网络每秒处理Visa的2000事务,它将以每3秒1MB的速度增长(每小时1GB,每年8TB)。以太坊可能会遭遇类似的增长模式,更糟糕的是,以太坊区块链上将有许多应用程序,而不仅仅是比特币那样的一种货币,但以太坊完全节点只需要存储状态而不是整个区块链历史这一事实就改善了这一状况。

如此大的区块链大小的问题是集中化风险。如果区块链的大小增加到100 TB,那么可能的情况是只有极少数的大型企业将运行完整的节点,所有常规用户都使用轻型SPV节点。在这种情况下,出现了潜在的担忧,即整个节点可能会结合在一起,并且都同意以某种有利可图的方式进行欺骗(例如。改变街区奖励,给自己BTC)。光节点无法立即检测到这一点。当然,至少会有一个诚实的完整节点存在,几个小时后,有关欺诈的信息就会通过Reddit这样的渠道泄露出来,但到那时已经太晚了:这将取决于普通用户组织一项努力,将给定的区块列入黑名单,这是一个大规模且可能不可行的协调问题,规模类似于成功的51%攻击。就比特币而言,这是一个问题,但存在一个区块链修改。彼得·托德这将缓解这个问题。

在短期内,以太坊将使用两种额外的策略来解决这个问题。首先,由于基于块链的挖掘算法,至少每个矿工都将被迫成为一个完整的节点,从而在完整节点的数量上创建一个下限。第二,也是更重要的是,在处理每个事务之后,我们将在块链中包含一个中间状态树根。即使块验证是集中的,只要存在一个诚实的验证节点,集中化问题也可以通过验证协议来解决。如果矿工发布无效块,则该块必须格式化错误,或者状态。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节点的子集作为有效性的证明。

结语

以太坊协议最初被认为是加密货币的升级版本,通过一种高度通用的编程语言提供了诸如区块链托管、提取限制、金融合同、赌博市场等高级功能。以太坊协议不会直接支持任何应用程序,但是图灵全编程语言的存在意味着理论上可以为任何事务类型或应用程序创建任意契约。然而,更有趣的是,以太坊协议远远超出了货币的范围。关于分散文件存储、分散计算和分散预测市场的协议,以及其他几十个这样的概念,都有可能大大提高计算行业的效率,并通过第一次增加一个经济层,为其他对等协议提供巨大的推动力。最后,还有大量与金钱无关的应用程序。

由etal um协议实现的任意状态转换函数的概念提供了一个具有独特潜力的平台;它不是一个封闭的、单一用途的协议,而是用于数据存储、赌博或金融领域的一系列特定应用程序,它是通过设计实现的,我们认为它非常适合作为未来大量金融和非金融协议的基础层。

总结

一个老练的读者可能会注意到,事实上,比特币地址是椭圆曲线公钥的散列,而不是公钥本身。然而,事实上,将公共密钥哈希称为公钥本身是完全合法的密码术语。这是因为比特币的密码学可以被认为是一种自定义的数字签名算法,其中公钥由ECC公钥的哈希组成,签名由ECC公开密钥与ECC签名连接而成,验证算法包括根据作为公钥提供的ECC公钥哈希检查签名中的ECC公钥,然后根据ECC公钥验证ECC签名。

从技术上讲,前11个街区的中位数。

以太坊协议应该尽可能简单实用,但可能需要相当高的复杂性,例如规模,将存储、带宽和I/O的成本内部化,以便安全、隐私、透明等。在需要复杂的地方,文档应该尽可能清晰、简洁和最新,这样一个完全没有在以太坊接受教育的人就可以学习它并成为专家。

见黄皮书对于以太坊虚拟机(它作为规范和从零开始构建以太坊客户端的参考),同时也有许多主题在以太坊WIKI里,例如分片开发、核心开发、DAPP开发、研究、Casper研发和网络协议。为了进行研究和今后可能的实施,有道德的研究。

表达这一点的另一种方式是抽象。这个最新路线图正在计划抽象执行,允许执行引擎不一定必须遵循一个规范,但例如,它可以针对特定的应用程序以及碎片进行定制。(路线图中没有明确说明执行引擎的这种异质性。也有异构切分,VLADZamfir将其概念化。)

在内部,2和“Charlie”都是数字,后者处于大端基256表示中。数字至少可以是0,最多可以是2。256-1.

区块链技术之以太坊ETH白皮书相关推荐

  1. V神又在操心区块链技术落地,以太坊大涨!

    V神又在操心区块链技术落地,以太坊大涨! 12月1日,以太坊联合创始人 Joseph Lubin 连发20条推特,详细阐述了区块链技术和去中心化现状.在他认为,如今的以太坊社区比以往任何时候都更加健康 ...

  2. 【区块链 | ENS】以太坊(Ethereum)中的ENS已支持DNS,怎么使用DNS解析地址?

    上篇文章:[区块链 | Ens]以太坊(Ethereum)中的ENS是什么?如何购买ENS? 我们可以了解到什么是ENS,ENS该怎么购买,但它只支持.eth对应后缀域名,并不支持.com .cn . ...

  3. 头歌-信息安全技术-用Python实现自己的区块链、支持以太坊的云笔记服务器端开发、编写并测试用于保存云笔记的智能合约、支持以太坊的云笔记小程序开发基础

    头歌-信息安全技术-用Python实现自己的区块链.支持以太坊的云笔记服务器端开发.编写并测试用于保存云笔记的智能合约.支持以太坊的云笔记小程序开发基础 一.用Python实现自己的区块链 1.任务描 ...

  4. 区块链膨胀:以太坊客户如何解决存储问题

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. ​​​4,270个代币.27,358笔交易.数字小猫463,713. 以太坊最近举办了很多活动,虽然很多加密爱好者认为这 ...

  5. 基于比特币现金BCH二层网络能实现区块链2.0以太坊的智能化吗

    第0章 引言 现在市场上有不计其数的区块链项目,多如牛毛,各个项目都认为自己是最牛逼的,都声称自己能改变世界.区块链1点零,2点零,3点零,现在已经有项目喊自己是区块链5点零了.在这样下去,区块链25 ...

  6. 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 8.0 ETH挖矿难度的调整

    8.0 ETH挖矿难度的调整 比特币是每隔2016个区块来调整挖矿的难度,目标是维持出块时间平均在10分钟左右,以太坊是每个区块都有可能调整挖矿难度,调整的方法也比较复杂,而且还改过好几个版本,包括以 ...

  7. 深度对话 | 关于区块链,关于以太坊,V 神这次又说了啥?

    在编程.经济学.密码学.分布式系统.信息论和数学的交叉点上,Vitalik Buterin将自己在这些领域的见解组合成一个真实世界中非常成功的,旨在将传统互联网去中心化的"应用程序" ...

  8. 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 10.0 智能合约

    10.0 智能合约 10.1 简介 智能合约:运行在区块链系统上的一段代码,代码逻辑定义了合约内容. 智能合约的账户保存了合约当前的运行状态: balance:当前余额 nonce:交易次数 code ...

  9. 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 12.0 反思

    12.0 反思 1.智能合约的反思--智能合约真的智能吗?(Is smart contract really smart?) 首先我们必须了解智能合约里面并没有用到任何人工智能的技术,所以有人认为应该 ...

最新文章

  1. 初试CSS(二):选择器
  2. 反向 Dropout,韩松团队最新工作NetAug:提高Tiny神经网络性能的新训练方法
  3. vue实现两个数组的合并
  4. 电脑上同时安装了tensorflow和tensorflow-gpu,如何默认使用tensorflow-gpu
  5. 【Python】Python中的列表操作
  6. Action Framework- Table PPFSFMLRU
  7. Angular - - angular.element
  8. (9)<textarea>标签在mac环境下的问题
  9. 国风国潮吹到PPT设计,可编辑模板轻松掌握东方韵味
  10. Windows 命令模式下删除驱动
  11. php与ununtu通信,Ubuntu 20.04 LTS 已引入 PHP 7.4
  12. LC60 Permutation Sequence
  13. ServletContext的用法
  14. con和com开头单词规律_con和com的前缀区别。背单词时总是搞不清什么时候是con什么时候是com之后找到了不同之处,c...
  15. 笔记本电脑热点显示正在断开连接,一直无法开启热点,inetsh winsock reset 命令重置可以解决
  16. 阿里云数据库与传统数据库有何区别?
  17. XDOJ--P177累加和校验
  18. SpringMVC工作流程描述(简易版本)
  19. Grbl命令,配置,接口,慢跑,激光相关知识
  20. 计算机点阵,计算机问题24*24点阵字型码用()字节存 – 手机爱问

热门文章

  1. 【HTML】兴唐二十八节课之常用标签(不定期更新)
  2. Android-room的学习
  3. 小程序点击图片自动播放视频,停止上一个视频播放
  4. 程序员取悦女票的正确姿势---Tip1(iOS美容篇)
  5. LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)
  6. 真实记录疑似Linux病毒导致服务器 带宽跑满的解决过程
  7. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...
  8. Unity----Scene加载问题
  9. 匿名黑客Anonymous实施的8次最强攻击
  10. 企业为什么要使用基于Docker的PaaS/CaaS平台