以太坊五周年:一路打怪升级 从涅槃中苏醒
发表于2020-07-31 18:42:07
摘要: 原标题:以太坊五周年:一路打怪升级 从涅槃中苏醒 庆生 当区块链再一次走进普罗大众的视野,并得到科技巨头们前所未有的重视时,以太坊已经成为区
  原标题:以太坊五周年:一路打怪升级 从涅槃中苏醒
 
  庆生
 
  当区块链再一次走进普罗大众的视野,并得到科技巨头们前所未有的重视时,以太坊已经成为区块链领域无法被忽视的巨舰。在资本肆无忌惮野蛮增长的混沌时代,以太坊的开发者和社区始终小心翼翼地呵护着这艘小船,把稳方向,一路打怪升级成为一代巨舰。
 
  2020年7月30日,不仅是以太坊五周年的破壳日,同样令人颇具期待的是:数日之后,以太坊2.0的测试网将正式启动,标志着以太坊距离世界计算机跨越了一大步。截止目前,以太坊2.0测试网启动进度已完成超过92%。

 
  劫难
 
  以太坊从诞生至今,从未远离过质疑和嘲笑。作为一台承载逻辑极度复杂的世界信任机器,以太坊曾经遭遇过大量的攻击和运行挑战。最 的莫过于2016年发生的The DAO事件。
 
  2016年6月17日,以太坊创始人Vitalik在Reddit发布了一篇紧急警告,告知“DAO受到黑客攻击,请各交易平台马上暂停ETH/DAO交易及充值提现”。这场历时1个月的攻防战争最终以以太坊区块链被分裂为ETH(沿用“以太坊”一名)和ETC(以太经典)告终。在经历The DAO事件以后,以太坊在很长一段时间内无法摆脱“中心化”的质疑,并受到来自其他外界社区的围攻。
 
  今天人们的欢庆,仿佛已然忘记昨日的教训。在未来,以太坊最大的敌人不是外部,恰恰来自于内部本身。确保航母每一个细致的模块都运作正常,远比抵御外敌要困难得多。
 
  分别
 
  以太坊诞生以后,创始团队成员逐渐把中心转移到更加宽广的领域,或致力于扩展以太坊的生态,或致力于探索新的技术,成为以太坊的竞争者。如今,除了Vitalik依然专注于以太坊的发展,其他创始人分别致力于以太坊社交框架Akasha(Mihai Alisie)、Jaxx钱包(已离职,Anthony Dilorio)、公有链Cardano(Charles Hoskinson)、Polkadot和Web3基金会(Gavin Wood)。
 
  待续
 
  2017年,Vitalik在他的个人网站https://vitalik.ca写了一篇回顾“以太坊是如何诞生”的文章。乘着以太坊五周年生日之际,我们不妨重新回顾一下这篇《以太坊协议的史前史》。
 
  本文摘自由Vitalik Buterin本人撰写,灵钛科技和独角时代翻译出版的《理·想:以太坊的区块链创世录》。同时诚挚感谢以太坊社区的每一位开发者、翻译者和布道者,只因有你,区块链的世界不再单调。
 
  以太坊协议的史前史
 
  (2017年9月14日)
 
  编者按:本文是维塔利克对以太坊协议发展历程的回忆,讲述了以太坊协议从构思到初次发布、迭代的故事。
 
  尽管当前以太坊协议背后的理念在这两年已经大致稳定下来了,但以太坊当前的构想和完整形式并非一朝一夕形成的。在以太坊区块链面世之后,其协议经历了一系列重大的演变和决策。本文旨在回顾以太坊协议从开始到发布的演变过程。至于Geth、cppethereum、pyethereum以及EthereumJ在协议实现的过程中所做的大量工作,以及关于以太坊生态系统的应用和商业历史,将不在本文讨论的范围内。
 
  同样不在讨论范围内的还有关于Casper以及分片研究的历史。毫无疑问,我们可以写更多的文章来讨论弗拉德(Vlad)、加文(Gavin)、我自己以及其他人曾经提出过并且被舍弃的各种观点,包括工作量证明的证明、轮辅式多链、超立方体、影子链(可以说是Plamsa的前身)、链纤维以及Casper的各种迭代版本,还有弗拉德提出的对在共识协议内参与者的激励机制及其性质进行推理的快速演变思想。这些观点背后的故事本身已经复杂到足以另写一篇文章。因此,暂时不讨论它们。
 
  先从最早的版本说起。这个版本最终成了以太坊,但在当时它甚至还不叫以太坊。我在2013年10月访问以色列的时候,花了很多时间与万事达币团队在一起,甚至还建议他们添加某些功能。再三思考过他们所做的事情以后,我向团队发送了一份提案,提议让他们的协议变得更加通用,并且能够在无需增加庞大而复杂的功能集的情况下支持更多类型的合约:
 
  需要注意的是,这一版本与以太坊后期更广阔的愿景大相径庭:它纯粹只专注于万事达币当时正在尝试突破的技术,即双方合约。在该合约中,A方和B方共同投入资金,随后双方可以根据合约中指定的某些公式将资金提取出来(例如,赌注内容为“如果X发生了,则把所有的资金都给A;反之,则把所有的资金都给B”)。实现这个合约的脚本语言不是图灵完备的。
 
  万事达币团队对此印象深刻,但是他们并没有兴趣放弃他们所做的一切事情去朝着这个方向发展,而我越发深信这是一个正确的选择。因此,大约在12月,第二个版本面世了:
 
  在这个版本中,你可以看到完成了大量重构的结果。这些结果很大一部分都是11月份我在旧金山的一次长途漫步时想到的。到那时,我意识到智能合约具有完全通用化的潜力。比起脚本语言只能简单地描述双方关系,合约本身就是完成成熟的账户,并且具有持有、发送和接收资产的能力,甚至可以维持 存储(在当时, 存储被称为“内存”,并且 的临时“内存”是256寄存器)。只不过语言从基于栈的虚拟机转变为更符合我意愿的基于寄存器的虚拟机。我对此几乎没有异议,除了它看起来似乎更加复杂。
 
  “以太(ether)”的字面意思是醚(即燃料,等同于gas)。在每一个计算步骤完成之后,一笔交易所调用的合约的余额将会减少一些。如果合约的资金耗尽,那么执行过程将会停止。请注意,这个接收者支付机制意味着合约本身必须要求发送者向该合约支付一笔费用。如果这笔费用没有到账,则立即退出执行。这一版本的协议分配了16个免费执行步骤的限额,从而允许合约拒绝不支付费用的交易。
 
  截至此时,以太坊协议还是完全由我一个人构建的。然而,从这时开始,新的参与者开始加入以太坊的阵营。到目前为止,在协议方面表现最突出的是加文,他在2013年12月通过about.me的私信开始与我联系。
 
  杰弗里·威尔克(Jeffrey Wilcke),Go客户端(当时被称为“ethereal”)的首席开发者,也在同一时期联系了我并开始编程。尽管他的贡献更多是在客户端开发而不是协议研究方面。
 
  加文的早期贡献由两个方面。首先,你可能注意到在初始设计中的合约调用模型是异步的:尽管合约A可以创建一笔内部交易给合约B(“内部交易”是以太坊的行话:最初它们仅被称作“交易”,随后又被称为“消息调用”或者“调用”)。在 笔交易的执行完全完成以前,内部交易的执行不会开始。这意味着交易不能使用内部交易作为从其他合约获取信息的途径;想从其他合约获取信息,只能使用EXTRO操作码(有点像你用来读取其他合约存储的SLOAD),但这个操作码随后在加文和其他人的支持下移除了。
 
  在实现我最初的规范时,加文很自然地同步实现了内部交易功能,他甚至没有意识到两者意图的偏差——也就是说,在加文的实现中,当一个合约调用另一个合约时,内部交易会立即得到执行。一旦该执行完成,虚拟机将返回创建内部交易的合约,并继续执行下一个操作码。对于我俩,这种方法似乎更加出色,因为我们决定把它作为规范的一部分。
 
  其次,是我和他之间的一次讨论(发生在旧金山的一次散步中,因此准确的细节将要永远地消失在历史的洪流中,但也有可能会存在于NSA的深层档案内的一两份副本中)引发了对交易费用模型的重构,从合约支付方式转向发送方支付方式,并且转换到燃料架构。比起最初在每个独立的交易步骤执行后立刻消耗一些以太币,在这一版本中,交易发起者支付一定的费用并被分配一定量的燃料(大致是一个计算步骤的计数器)。与此同时,计算步骤取决于燃料的限额。如果一笔交易花费了所有的燃料,那么这些燃料就被花费了,但整个执行过程将被还原。这似乎是最安全的做法,因为它移除了合约先前需要担心的所有部分执行攻击类型。当一笔交易执行完成时,任何未被使用的燃料所收取的费用将被退还。
 
  加文在很大程度上使以太坊的愿景发生了十分微妙的变化:从一个用于构建可编程货币的平台——平台拥有基于区块链的合约,合约能够持有数字资产并且按照预先设置的规则进行转账——到一个通用的计算平台。这种变化从以太坊的着重点和术语的细微变化开始,后来随着我们对Web 3集成(它将以太坊视为去中心化技术套件的一部分,另外两部分是耳语协议和蜂群协议,图1)的日益强调,这一影响也在不断地增强。

  图1

  2014年初前后,我们还根据其他人的建议作了一些修改。在安德鲁·米勒(Andrew Miller)等人提出回到基于栈的架构这一想法以后,我们最终还是回去了(图2)。

  图2

  查尔斯·霍斯金森(Charles Hoskinson)建议我们从比特币的SHA256转换为更新的SHA3(或者更准确地说,是keccak256)。尽管有过一段时间争议,但通过与加文、安德鲁以及其他人进行讨论,我们还是确立了栈中的值的大小应该被限制在32 Byte。而另一种替代方案——无限制整数——则仍在考虑当中,因为该方案存在一个问题,即我们很难计算出执行家加法、乘法以及其他操作到底需要多少燃料。

  回到2014年1月,我们最初想到的挖矿算法是一个叫匕首 (Dagger) 的东西:

  匕首是根据有向无环图 (Directed Acyclic Graph, DAG) 命名的。DAG是一种用在算法中的数学结构,其思想是每隔N个区块,就会有一个新的DAG由种子伪随机生成。并且,DAG的底层将会是一个需要用几十亿字节来存储的节点的集合。然而,在DAG中,生成任意一个独立的值只需要计算计算几千个条目。一次匕首计算包含在这种底层的数据集中的任意位置获得一定数量的值,然后将这些值一起进行哈希运算。这意味着存在一种快速的方式可以进行匕首计算——已经将数据存储在内存中,然后以一种缓慢但不会导致内存紧张的方式——重新从DAG中生成你需要从头开始获取的每一个值。

  这个算法的目的就是和当时流行的算法一样拥有相同的内存受限属性,就像Scrypt算法,但是仍然对轻客户端友好。矿工会使用快速的方法,所以他们的挖矿将受限于内存带宽 (理论上,消费者级别内存的优化程度已经足够高了,因此用ASIC对其进行进一步优化十分困难),但轻客户端可以使用内存宽松且缓慢的方式进行验证。快速方法可能只需几微秒,而慢速且内存宽松的方法可能需要几毫秒,所以这对轻客户端依然是可行的。

  从这里开始,这个算法伴随着以太坊的发展历程发生了几次变化。接下来的想法是自适应工作量证明。在这个方案中,工作量证明将会涉及执行被随机选出的以太坊合约,并且这里面包含了一个很巧妙的做法去抵抗ASIC:如果ASIC被开发出来了,那么竞争矿工就会有动机去创建并发布该ASIC不擅长执行的合约。没有一种ASIC能够用于通用计算,因为它仅仅是一个CPU。因此,我们可以利用这类对抗激励机制来实现本质上在执行通用计算的工作量证明。

  由于一个简单的原因,这个想法后来破碎了。这个原因是长程攻击。攻击者可以从区块 1 开始构建一条链,并且只用简单的合约对这条链进行填充。需要注意的是,攻击者可以为这种简单的合约设计出专门的硬件,从而使攻击链迅速赶超主链。所以......又回到了原点。

  下一个算法被称为“随机电路”,具体的描述可以查看其Google文件。这个算法是我和弗拉德·赞菲尔 (Vlad Zamfir) 提出的,并由马修·万普勒·多蒂 (Matthew Wampler-Doty) 和其他人进行分析。这个算法的思路是通过执行伪随机生成电路来模拟挖矿算法中的通用计算。这一次,没有任何确凿的证据表明基于这些原则的东西是行不通的。但我们在2014年接触的计算机硬件专家都对此表示非常悲观。马修·万普勒·多蒂提出了一种基于SAT解决方案的工作量证明,但最终也被拒绝了。

  最后,兜兜转转,我们还是提出了Dagger Hashimoto算法,有时简称为Dashimoto。这种算法借鉴了Hashimoto的很多想法。Hashimoto是萨帝厄斯·追亚 (Thaddeus Dryja) 提出的工作量证明机制,它开创了“I/O约束工作量证明”概念。在该机制中,挖矿速度的主要限制因素不是每秒钟哈希运算的速度,而是RAM每秒可访问的兆字节数。然而,Dagger Hashimoto将这种工作量证明机制与匕首算法中对轻客户端友好的DAG所生成的数据集结合了起来。经过我、马修、蒂姆和其他人多次调整以后,这些想法终于融入了我们现在称为“Ethash”的算法中。

  到2014年夏天,除了工作量证明大概需要到2015年初才能到达Ethash阶段,这个协议已经相当稳定,并且其半正式规范已经以加文的黄皮书形式面世了。

  2014年8月,我开发并引入了叔区块机制。该机制可以使以太坊的区块链具备更短的区块时间以及更高的处理能力,同时减少了中心化的风险。关于叔区块机制的介绍,可以参见PoC6。

  在与比特股团队讨论之后,我们考虑使用堆作为头等数据结构——尽管最后由于时间不够没有这样做,并且后来的安全审计和DoS攻击让我们明白:在当时安全地实现这一功能远比想象中更难。

  9月,我和加文计划对协议设计进行两处重大的变更。首先,除了状态树和交易树,每一个区块还将包含一颗收据树。收据树将包含由每一笔交易创建的日志的哈希以及中间的状态根。日志将会允许交易创建可以保存在区块链中的输出,并且可被轻客户端访问。然而,未来的状态计算无法访问这些日志。这种方法使得去中心化应用能够很容易地查询时间,如代币转账、购买、正在被创建和被撮合的交易所订单,以及正在进行的拍卖等。

  我们还考虑了其他想法,如把默克尔树从一笔交易的完整执行轨迹中抽取出来,以允许任意内容得到证明。在对简单性和完整性进行折中以后,我们选择了使用日志。

  其次就是预编译的想法。预编译解决了允许复杂的加密计算在EVM中可用而不必处理EVM开销的问题。我们还提出过许多关于本地合约的雄心勃勃的想法。在这些想法中,如果矿工拥有关于某些合于的更优的实施方法,那么他们就会投票下调这些合约的燃料价格。如此一来,那些大多数矿工都能快速执行的合约自然就拥有更低的燃料价格了。然而,所有这些想法都被拒绝了,因为我们无法提出一种在加密经济学角度足够安全的方式来实现它。攻击者总是可以创建一些合约来执行带有活动门的加密操作,然后将活动门分发给自己和他们的朋友,从而能够更快地执行这个合约。随后,攻击者投票下调燃料价格并利用这一点对网络进行DoS攻击。相反,我们选择了一个不那么雄心勃勃的方法,即在协议中简单地指定较小的预编译数量,用于哈希和签名方案等常用操作。

  加文也是最初支持开发协议抽象这一想法的关键人物。所谓协议抽象,就是将协议的众多部分,如以太币余额、交易签名算法、随机数等,作为合约迁移到协议本身中。其理论上的最终目标是要达到整个以太坊协议能够被描述为将函数调用加入到具有特定预初始化状态的虚拟机中的目标。我们没有足够的时间把这些想法都加入到最初的前沿版本中,不过预计这些原则将通过“君士坦丁堡”的一些变化、Casper合约和分片规范慢慢开始被整合。

  这些内容都在PoC 7 中实现了。在 PoC 7 之后,该协议并没有真正发生太大的变化,除了一些轻微但在某些情况下十分重要的变动。这些细节将会在通过安全审计后公布。

  到2015年初,尤塔·斯坦纳 (Jutta Steiner) 和其他人组织了发布前的安全审计,包括软件代码审计和学术审计。软件代码审计主要是在分别由加文和杰夫瑞主导的C++和Go语言实现上。尽管我的Pyethereum实现也进行了一次简单的审计。在这两次学术审计中,一次由尤塔·埃雅尔 (Ittay Eyal) (因提出“自私挖矿”而成名) 负责进行的,另一次由安德鲁·米勒和Least Authority的其他成员进行。埃雅尔的审计导致了一个轻微的协议变更,即链的总难度值不会包含叔区块。由Least Authority负责的审计更侧重于智能合约、燃料经济学以及帕特里夏树。这次审计也导致了几处的协议变更。其中,比较小的一处变更是使用sha3(addr) 和 sha3(key) 作为树的键值,而不是直接使用地址和键值。这将使得攻击者更难对树发起最坏攻击。

  我们讨论的另一个重要的问题是燃料限制投票机制。那时候,我们已经对关于比特币区块大小的争论缺乏进展感到担忧,并希望在以太坊中拥有一个灵活的设计:该设计能够根据需要随时间调整。但面临的挑战是, 的限制是什么?我最初的想法是制定一个动态的限制,该限制是实际燃料使用量的长期指数移动平均值的1.5倍。因此,从长远来看,平均区块都会被占用2/3的容量。然而,安德鲁证明了这种限制在某些方面是可以被利用的——具体来说就是,想要提高限制的矿工仅需要把消耗大量燃料却只花费很少处理时间的交易都包含在他们自己的区块中,从而创建出满载区块且不会亏损成本。因此,至少从最终的结果来看,这个机制的安全模型相当于只是让矿工对燃料限制进行投票。

  我们没能提出一个更好的燃料限制策略,安德鲁推荐的方案是让矿工明确地对燃料限制进行投票,而且默认的投票策略是1.5倍的EMA。其原因在于,我们还没有想出设置最大燃料限制的正确方法,并且任何具体方法失败的风险都似乎远远高于矿工滥用投票权的风险。因此,不妨简单地让矿工对燃料限制进行投票,并接受燃料限制过高或过低的风险,从而换取灵活性以及矿工联合起来根据需要快速调整燃料限制高低的好处。

  在我和加文、杰夫进行了一场迷你黑客松之后,PoC 9终于在3月份推出了。其旨在成为概念证明的最终版本。我们将一个叫作“奥林匹克”的测试网运行了4个月。该测试网用的是将要用在主网中的协议。与此同时,我们还建立了以太坊的长期计划。维纳·古普塔 (Vinay Gupta) 写了一篇文章——《以太坊的发布过程》。这篇文章描述了以太坊主网开发的4个阶段,并相应给出了如今大家耳熟能详的名字:“前沿”、“家园”、“大都会”和“宁静”。

  “奥林匹克”测试网运行了4个月。前2个月,我们在各种实施版本中发现了很多漏洞,也发生了共识失败等其他问题。不过在6月前后,网络已经显著稳定下来了。到了7月,我们决定冻结代码;7月30日以太坊主网正式发布。

  来自以太坊基金会的庆生

  以太坊5岁啦!

投稿:lukejiwang@163.com
Copyright © 2002-2020 鹿财经网