编者按:近期,“以太坊君士坦丁堡分叉”成为区块链领域的热门话题,而作为以太坊的计划替代品,真正的“硬粮”——ETH2.0也将逐渐被揭晓。抛开对无聊术语定义的解释,James Prestwich 讨论了当前的以太坊路线图。同时,他也持开放的态度,在这些具体讨论中设想了以太坊后期可能的发展方向。文章来自Medium,以下为整理全文。
作者|詹姆斯·普雷斯维奇
编译|袁惠腾
编辑|卢晓明
什么是ETH2.0? ETH2.0 是以太坊的计划替代品。未来几年,ETH2.0开发者计划全面融入当前以太坊共识系统和状态。由于其范围如此广泛,我们也无法准确传达ETH2.0 将包含或不包含哪些内容。事实上,我们已经建立了一些实用的操作规范,并且还有大量的团队努力致力于开发早期实施。 ETH2.0开发者暂时计划包括分片技术(Sharding)、Casper协议、状态租赁(State Rent)以及以太坊虚拟机EVM升级项目eWASM。
今日,ETH2.0初始客户端已上线测试,轻量级ETH2.0测试网预计将在三个月内(2019年第一季度)上线。首先,ETH2.0会将以太币映射到以太坊链上,但ETH2.0设计者最终计划改变这一点,让ETH2.0成为主链,以太坊1.X成为其管理下的支链。情况。
这对工程师意味着什么?如果您是专业的Solidity 程序员或Dapp 开发人员,并且是部署ETH2.0 智能合约的“铁杆粉丝”。然后,您可能需要进行大量的更新迭代。 ETH2.0是以太坊的完全替代品,它将推翻我们在编写智能合约时所做的许多假设。它计划的多年分阶段推出感觉不太像升级周期,而更像是产品发布周期。我们为ETH1.X 编写的工具和智能合约可能需要重新发明。幸运的是,我们有几年的时间来构建这个生态系统。
为了帮助推动这一进程,我将讨论当前的路线图并提出一些工程影响。
分阶段推出目前,分片路线图(ETH2.0路线图的两倍)列出了七个阶段。只有第0 阶段有明确的规范并定期更新。第一阶段的规范远没有那么严格、准确,并且可能处于被动开发状态。从第一阶段开始,路线图变成了目标列表,而不再是技术文档。
例如,在第2 阶段,路线图链接到ethresear.ch 的频率是链接到Github 的三倍。由于任何未来的步骤都更像是推测而不是工程,因此我们的具体讨论仅限于阶段0、1 和2。这些具体讨论中还包括后期阶段可能方向的几个粗略轮廓。
阶段0:信标链阶段0引入“信标链”,(Odaily星球日报注:信标链是一条全新的区块链,在新以太坊中占据核心地位。这条链的功能之一是让验证者参与质押系统并取代矿工的角色,成为链的构建者。另一个功能是存储分片状态的索引)。 ETH2.0设计者希望信标链能够成为ETH2.0生态系统的核心,成为其他分片的安全和验证的源泉。信标链部署后,将使用PoW/PoS混合机制Casper theFriendly Finality Gadget(Casper FFG)进行权益证明。
显然,像信标链这样的早期迭代被设计得尽可能简单,这就是为什么阶段0 不支持智能合约、账户、资产转移或包括任何分片。同时,基于信标链的以太坊无法进行链上转账,这意味着用户无法将其存入交易所。
BETH:新以太坊作为一种新的资产类型,Beacon ETH(BETH)仅由Beacon 链上的Staker(持币者或用户)使用。 BETH可以通过以下两种方式创建。
作为验证信标链(以及第一阶段后的分片)的奖励;
任何ETH1.X 用户都可以通过ETH1.X 合约购买1 ETH 的BETH,合约称之为“充值”。
工程师可能会注意到合同中没有提及撤消功能。这是由于阶段0,用户无法从信标链中提取BETH。也就是说,一旦用户将其存储在ETH1.X验证人注册合约中,ETH1.X以太币就会被销毁。信标链验证者将观察合约并将充值信息提交给信标链,信标链将向充值用户发行新的BETH。
因此,在ETH发送到验证注册合约后不久,用户就会收到信标链公布的相应数量的BETH。在此过程中,充值可以暂时审核,但根据Casper协议,无法永久审核。
直到第二阶段,以太币才可以在信标链上转移。在我看来,在ETH1.X 完全融入分片生态系统之前,没有办法将BETH 移回ETH1.X。鉴于第0 阶段尚未完成,并且不存在可靠、明确的第1 阶段规范,可以合理地假设BETH 至少需要两年时间才能成为独立的不可转让资产类型。当第二阶段完成后,分片转移对于BETH来说自然会“水到渠成”,但对于ETH则不然,这不会造成不可逆转的经济困难。
过去,一些像BETH这样的低功能代币项目都是通过借条(IOU)在交易所进行交易的。例如,在Tezos 众筹期间,它推出了HitBit 和BitMEX XTZ 期货市场。因此,如果对BETH有需求,我们应该努力构建一个支持托管BETH交易和质押的交易所生态系统。不过,用户可能对BETH目前的需求存在疑问。由于ETH 与BETH 的单向挂钩导致BETH 的价格上限为1 ETH,因此BETH 并不是一个优秀的投资标的。换句话说,BETH永远不会比ETH更值钱,甚至可能还不如ETH。
阶段0+:在信标链上质押,用户可以质押32 BETH存款成为验证者。在阶段0,验证者只需要管理信标链;从第一阶段开始,验证人除了管理信标链外,还将管理1024条分片链。信标链和各分片链将使用Casper FFG 完成区块生成。 FFG 是一种权益证明算法,用于对链上的不良行为进行没收(即减少权益)。
细心的读者会在分片路线图的“以太坊3.0”部分中发现FFG 的表弟Casper CBC。尽管对FFG(当然还有CBC)的详细解释超出了本文的范围。如果有兴趣,可以阅读以太坊创始人Vitalik Buterin 对混合PoW/FFG 的解释,以及他关于最小化还原条件和FFG 的论文。
用户(质押者)需要做什么?分片的目的是在节点之间分割(Split)分片状态信息,而不要求任何节点同时拥有网络的全貌。基于此,验证者不会验证所有分片。相反,信标链将协调其他分片的验证,所有验证者将执行信标链的验证。
经过固定时间(64 个区块或大约6.4 分钟)后,信标链将“洗牌”验证者并将它们随机分配到分片。分配给分片的验证者组称为委员会,其中包括128 名委员会成员。在第0阶段,委员会机制意味着信标链需要大约每6分钟选择可用的验证者,然后在接下来的6分钟内形成完整的委员会;在第一阶段,信标链将由1024 个分片指定一个验证者委员会。指定的过程极其复杂,涉及多阶段随机数生成过程和可验证的延迟函数,阻止操纵委员会选择过程的尝试。
委员会将负责保护其分片的安全性、活动性和完整性,并且还需要确认(Attest)信标链上的分片状态。它存在的重要性不言而喻,因此ETH2.0将随机进行委员会的选举和委员会成员的频繁轮换。同时,这是信标链了解分片状态的唯一途径,反之亦然。
从所有验证者池中随机选择验证者可以最大限度地减少委员会作为一个整体撒谎或作弊的可能性。委员会轮换还可以减少不良委员会可能造成的损害。换句话说,意图不纯的验证者或试图实现利润最大化的验证者很难利用委员会作为攻击网络任何部分的工具。退一步来说,如果验证者获得了分片委员会的控制权,它就无法控制超过64 个区块。
PoS 证明有哪些影响?虽然记录了ETH1 之间的哲学差异。这些差异确实会直接影响工程师。例如,PoW链支持无状态简化支付验证(SPV)和非交互式工作证明(NIPoPoW)远程状态跟踪,但PoS禁止任何低状态通信。主观性阻止了对证明的状态查看。
换句话说,远程状态权益证明将包含与PoW 无状态SPV 验证大致相同的数据量,但需要预先验证整个PoS 历史记录。相比之下,无状态SPV 验证不需要额外的信息进行验证。这意味着在主观权益证明环境中,跨分片或跨链应用程序减少了功能,但增加了开销。
第一阶段:分片第一阶段是就分片链的内容达成共识,而不是其意义。换句话说,这是分片结构的“试运行”,而不是尝试使用分片进行扩展。信标链将分片链视为没有结构或意义的简单比特集合。分片链还没有账户、资产或智能合约。分片验证器由信标链为每个时间段(Epoch)的分片随机选择。它仅就每个块的内容达成一致。分片中出现什么信息并不重要,只要所有委员会成员达成共识并且分片上的信标链定期更新即可。
通过称为交联的过程,分片验证器可以验证分片的内容和状态。简而言之,委员会必须在信标链中包含有关分片的可验证信息(例如根哈希)。在第2 阶段或更高阶段,交叉链接将支持跨分片通信。一旦信标链从多个委员会收到给定交叉链接准确性的证据,信标链就可以相信该交叉链接是分片的真实表示,而无需验证整个分片。如果委员会对交叉链接的有效性存在分歧,即很明显其中一个委员会是错误的,那么验证者应该削减它。
这是所有分片安全的根源,即验证者的不当行为最终会被信标链发现并受到惩罚。
第一阶段没有什么特别有趣的地方。从根本上来说,这只是用于交叉链接的引导阶段,也可以说是分片参考信标链的对称机制。设计者似乎对工作机制充满信心,围绕这些机制的开放性问题主要围绕规范和政策实施。鉴于第0 阶段花了一年多的时间才达到合理的规范水平,第1 阶段的估计也是如此。
有趣的是,第0 阶段的实施与规范的开发同时进行。尽管——目前距离测试网络还不到三个月,但Phase 0规范将定期修订。时间线的预估也意味着未来ETH2.0阶段的开发时间将会存在巨大差异。乐观者告诉我6个月就足够了,但在我看来,在看到第0阶段进入测试后,第1阶段将需要12到18个月的开发周期。
第二阶段:智能合约最终,第二阶段将导致一个类似于我们熟悉的以太坊的系统。随着第二阶段的发布,分片链从简单的数据容器转变为结构化的链状态。此时,新的以太坊BETH 将可转让,并且将重新引入智能合约。每个分片将管理一个基于eWASM 的虚拟机(我们称之为“EVM2”)。
在此阶段,EVM2 将支持熟悉的账户、合约、状态和其他抽象。然而,大量的幕后更改可能会破坏大多数现有工具。幸运的是,eWASM 技术团队已经为Solc 编译器、以太坊的开发和测试框架Truffle、Ganache 做了一些基础工作。在第2 阶段测试网络之前或期间,我们可以看到移植支持EVM2 的最常用工具。
State Rent 可能会被纳入第二阶段,这也给当前的Solidity 编程语言工程师带来了一些有趣的挑战。状态租赁不是无限期地存储代码和数据,而是要求合约开发者和用户在一段时间内为EVM2 存储付费。通过确保随着时间的推移将未使用的信息与状态分离来防止状态膨胀,最终实现了让用户支付状态成本而不是整个节点的目标。人们为此提出了不同的模型和“百家争鸣”,但仍然没有明确的结论。
随着一些以太坊升级计划的推进以及知名以太坊核心开发商的强烈建议,国家租赁可能是不同路线图中唯一重叠的部分。因此,我强烈建议规划对当前部署的合约支持状态租赁,并设计未来将状态租赁转移给用户的模型。虽然我们还不知道国家租赁的具体设计,但我们现在能做的是制定具体的成本计划。
此外,我们不知道第二阶段将在哪里结束,该阶段仍处于研究的早期阶段,并且包括几个未解决的主要问题。鉴于非正式的规范和开发流程,以及将第2 阶段扩展到第1 阶段。在2020 年之前启动第2 阶段似乎并不合理。也就是说,尽管ETH2.0可能会在今年推出,但预计ETH2.0版本至少要到2020年才能支持资产转移或智能合约。
第三阶段:链外状态存储现在,为了更好地讨论智能合约,我们将几乎完全跳过第三阶段。
第三阶段通过将尽可能多的状态移至链外来最小化链上状态。存储在链上时,不需要存储整个状态,只需要存储部分状态信息和聚合器(聚合器是代表长数据列表的短数据;默克尔树是聚合器的一种)。用户将负责在链下存储完整的状态。
当用户与状态交互时,他们会在交易中包含当前状态的证明。这样,运行验证节点的资源需求就会相对较低。已经出现了许多具有不同功能和性能特征的聚合器设计,但尚未做出具体选择。现阶段,我们将停止使用链上通信进行用户协调,因为链上不再能够保证数据可用性。在第三阶段,维护和获取链下状态将成为限制DApp设计的关键因素之一。
第四阶段:分片智能合约然而,一个无法克服的问题仍然存在。尽管ETH2.0合约与以太坊合约一样强大,但它们必然绑定到一个分片,永远无法与另一分片上的合约直接交互。这是分片的直接结果,分片的目的是在不直接了解其他分片的情况下在分片之间分割状态。扩展是通过分割状态并尽可能减少验证者的工作量来实现的。
直接的互动需要直接的知识储备。根据设计,分片不直接了解其他分片。它仅通过与信标链的跨链通信来了解其他分片。因此,当用户想要跨分片交互时,必须等待信标链。具体来说,这意味着如果在分片A 上部署了SafeMath 模块,则分片B 上的用户必须等待访问,或者在分片B 上部署新的SafeMath 模块。
像SafeMath 这样的简单实用程序将部署到每个分片,即1024 个分片上将部署1024 个SafeMath。但像Maker 或Compound 这样的市场又如何呢? #DeFi 对可组合金融的承诺可能会变得难以跨越分片边界。
CDP 激活和DAI 收集之间的长时间延迟可能会导致难以承受的财务损失。如果市场发生变化并且CDP 在用户收到DAI 之前被清算,会发生什么?在实践中,这可能意味着用户需要在包含智能合约的每个分片上拥有一个帐户,但跨分片结构是没有用的。 Maker 和0x 只有部署在同一个分片上才能交互,并且0x 用户也需要在该分片上拥有一定数量的资产。
基本权衡:同步或扩展ETH2.0 版本的设计者不知道跨分片通信系统最终会是什么样子。通过阅读许多提案,系统可能会在即时反馈和可预测性之间做出基本的权衡。分片的本质没有改变,任何用户都必须等待跨分片通信。但是,我们可以将事务的本地和远程执行阶段紧密或松散地耦合到每个分片。
紧耦合优先考虑等待。在分片进行通信之前,事务不会执行任何操作。相反,我们可以通过现在执行部分和稍后执行部分来松散耦合事务。事务在本地分片上执行,跨分片通信后在远程分片上执行。
松耦合提供了更好的用户体验。用户可以立即看到他们的交易正在本地执行,并知道将来某个时候将发生远程执行。但无论是福还是祸,用户必须等待才能了解松散耦合事务的远程阶段的结果。紧耦合事务比松耦合事务更可预测。同时,由于远程状态不会在本地和远程执行阶段之间转换,因此用户更清楚结果。但紧密耦合要求用户等待才能看到任何结果。
关于ETH2.0通信模型的信息非常少。我们知道,该模型必须提供跨分片合约调用,而代价是几乎所有的扩展优势。如果你停止阅读这里我不会责怪你,因为第四阶段只存在思维导图和一些模糊的链接。这种情况的一个不明显的后果是,ETH2.0 在第4 阶段之前不会为复杂的智能合约系统提供显着的扩展优势。以前,希望与其他合约交互的智能合约必须与分片共存,并且受到速度和可扩展性的限制那个碎片的。与ETH1.X 相比,分片最多只能获得一个很小的常数因子加速。这意味着在第4 阶段发布之前(2025 年左右),由于其优势不大,没有理由迁移智能合约代码或用户。
同时,为了更好地理解工程师和DApp用户之间的权衡,我研究了社区或开发者建议的一些模型。在我看来,这些模型都不会被采用,但我相信它们有助于理解所涉及的权衡。重要提示:以下所有内容均为推测。
基本模型:收据和证明所有形式的跨链通信都依赖于信标链。由于信标链能够检索所有分片的状态,并且每个分片都会影响信标链的状态,因此它被用作分片链生态系统中的核心。从某种意义上讲,信息从一条链到另一条链必须通过信标链传输。考虑到这需要信标链自己处理每笔交易,完全不可能达到扩容效果,所以不期望发送完整的信息。
相反,当分片A 上的用户或合约想要与分片B 交互时,分片A 会生成包含该交互消息的“收据”。分片A 在其块头中提交其所有收据,信标链等待A 的确认完成,然后再提交到分片A 的块头(包括收据的提交)。分片B 还必须等待信标的最终确认,然后才能提交信标块头。
该阶段完成后,新的交易可以提交到分片B,包括收据和证明。证明显示收据包含在分片A 中,分片A 包含在信标中,信标包含在分片B 中。这样,分片B 上的用户或合约就可以信任从分片A 发送的消息。分片B 想要发送回复(或返回值、错误),需要反向重复整个过程:分片B 发出回执,最终返回到分片A。
不难看出这个过程需要花费很多时间。四个通信步骤中的每一个都需要几分钟才能完成。不幸的是,我们无法完全避免等待。如果我们想确定远程状态,那么每一步我们都必须等待最终结果。往返通信的最佳情况是四个最终确认周期。换句话说,由于用户可以在分片A 看到分片B 的数据之前看到分片B 的数据,因此用户在三个确认周期后就会获得信心。使用ETH2.0 的6.4 分钟Epoch 长度,用户需要等待19 分钟才能看到结果,26 分钟才能得到链上结果。
具体收据:分片之间的代币迁移ERC20 代币的多功能性使其在当今的以太坊中无处不在。不过,ETH2.0也给Token带来了一些逻辑问题。由于智能合约管理所有代币余额,因此智能合约仅存在于单个分片上。因此,分片A 中的代币在分片B 上根本不存在。但通过一些智能的跨分片通信,我们可以在多个分片上部署相同的Token,并允许分片之间进行Token转移,从而有效地在Token合约之间建立双向挂钩。
解决方案非常简单。
在部署代币(我们称之为“酷跨分片代币”或“CCT”)时,我们将在ERC20 ——MigrateSend 和MigrateReceive 函数的基础上添加两个小的附加函数。使用MigrateSend 销毁令牌并生成收据,其中将包括销毁的令牌和收到的分片。然后,通过调用MigrateSend 销毁一个分片上的令牌,然后在另一分片上调用MigrateReceive 以有效传输令牌。
我们需要在每个分片上重新部署我们的代币合约,但这似乎是值得的。迁移是单向的,需要至少两次最终确认跨分片通信。因此,我们调用MigrateSend 后大约需要10 分钟才能在接收分片上使用“CCT”。
拉取收据是跨分片传递信息的常见方式。我们可以将任何链上信息放入收据中,甚至是整个智能合约。 Yanking 是一项通过将合约的代码存储包含在收据中来实现跨分片合约迁移的提案。合约将从分片A 中删除(Yanked),然后在收据到达后重新部署到分片B 上。合约一旦进入分片B,就可以直接与分片B合约进行通信,并与分片B的状态进行交互。同时,合约甚至可以被Yanked回分片A。
这将允许任何一个智能合约与任何其他智能合约进行通信(在跨分片等待时间之后)。但由于收据包含整个合同及其所有存储,因此移动大型或用户密集型合同的成本可能会很高。当收据在运输途中时,合同将完全无法使用。它已从分片A 中提取,但尚未到达分片B。这意味着在它到达分片B 之前,所有其他用户都无法使用该合约。同时,只有已经在分片B 上的用户才能与其交互。因此,Yank 最适合用户较少的小型智能合约。它支持紧密耦合的执行,但不是通用的解决方案。
碎片配对让我们转向一些更有创意的构建想法。
收据旨在实现异步(松散耦合)通信。但我们可能还需要同步通信。为此,我们必须更具创造力。通过简单的设计,分片配对可以实现紧密耦合的执行,同时尽可能地减少麻烦。
分片配对是一个简单的解决方案。正如文章第三段中提到的,我们在每个高度将分片混合成同步对。每次一个分片与另一个分片配对时,任一分片的用户都可以跨两个分片执行紧密耦合的状态更新。如果分片A 和B 在高度7 处配对,则A 和B 的所有验证者都必须知道A 和B 的完整状态,并且分片必须一起前进或根本不前进。
在该模型中,如果A和B之间需要进行跨链交易,则需要等待A和B被随机配对。但Vitalik 描述了100 个分片案例。有1024 个分片,我们预计需要512 个区块,因此大约需要一个小时。但由于配对是随机的,因此可能需要更长或更短。正如Vitalik 所说,当您想要与多个分片交互时,这不能很好地扩展。
分片区域这是分片配对的更广泛版本。
每个时间段(Epoch),我们将分片划分为由多个分片组成的若干“区域”。区域内的分片必须同步,因此需要一起更新其本地状态。通过同步这样做,区域可以保证分片之间的自由移动以及与区域内任何合约的直接交互,但与区域外的任何分片进行通信没有任何优势。
此外,由于该区域要求验证者了解该区域中所有分片的状态,因此这将抵消分片的许多扩展优势。如果一个区域由16 个分片组成,我们会牺牲大约15/16 (94%) 的扩展优势,并且只能获得整个网络15/1024 (1%) 的紧密耦合执行。
阻碍跨分片(和跨链)通信的一个不明显的特性是,用户可以比所涉及的链更快地获得对消息的信任。 Alice 从分片A 向分片B 发送5 BETH,她知道资产发送后会立即到达。 Bob 看到正在发送的交易,并且知道一旦将BETH 发送到分片A 进行确认,BETH 将到达分片B。然而,分片B 及其合约必须等待几分钟,以便信标链完成对分片A 的确认。这意味着在分片A 上花费资金后,钱包可以快速接收并在分片B 上花费这些资金。换句话说,由于Bob 确信Alice 已经发送了足够的ETH,因此他将从分片B 上的Alice 钱包收到可执行的IOU(IOU)。如果分片B 存在足够多的用户愿意观察分片A 并接受标准化的IOU,则ETH 上分片A 发送后不久可能会在分片B 上花费。
然而,当应用于智能合约时,该解决方案变得极其复杂,因为状态永远不可替代。不可能实现有状态的IOU,因此它们不适合通用交互。我们应该把负担看作松耦合的用户体验改进,让松耦合模拟紧耦合,快速执行某些操作
交易。
共识和状态分离更复杂和更让人感兴趣的一种方案是将共识过程与状态更新过程分离。
只有在执行区块中包含的所有状态更新后,以太坊矿工和完整节点才接受区块。事实并非如此。相反,其可以先接受区块,而后进行状态更新。在这种情况下,我们不会像在以太坊中那样就系统状态达成共识,而是会对所有分片中所有交易的总历史(或“总顺序”)达成共识。
这种解决方案意味着每个分片都可以快速添加区块,而无需知道任何其他分片的状态,这就是利用分片进行扩容的原理。但在所有分片完成之前,交易对分片状态和整个网络的影响将会被隐匿。换句话说,状态的最终确认落后于分片内容的最终确认。
从用户的角度来看,我们会立即提交交易,且知道该交易已被包含在内。但用户必须等待一定时间来确定该交易的结果。随着分片的最终确定,我们逐渐获得有关状态的更多信息,但在所有分片达到最终确认之前,用户并不能完全确定。与产权负担相似,在某些情况下,用户可以提前确认交易的结果并相应地采取行动。
小结ETH2.0 将是与以太坊完全不同的系统,二者将并行存在多年并具有不同的特征集。在不久的将来,预计会出现从 ETH 到 BETH 的单向挂钩。如果你经营交易所或托管服务,可以考虑 BETH 在链上实现转移之前支持用户进行 BETH 托管交易和押注。从长远来看,还需要考虑智能合约如何在有无跨分片通信的情况下适应分片。
最重要的是要密切关注研发过程。ETH2.0 是一个复杂且不断发展的系统,所有 DApp 工程师都需要清楚地了解 ETH2.0 计划和进度。