V神最新发文:Rollups有望成为以太坊扩容的基石
汇总(Rollups)在以太坊社区中风靡一时,并有望在可预见的未来成为以太坊的关键可扩展性解决方案。但是,这项技术究竟是什么?您能从中得到什么期望?您将如何使用它?这篇文章将尝试回答其中一些关键问题。
背景:什么是Layer 1和Layer 2扩容?
扩展区块链生态系统有两种方法。首先,您可以使区块链本身具有更高的交易能力。这种技术的主要挑战在于,具有“更大区块”的区块链本来就更难以验证,并且可能变得更加中心化。为了避免此类风险,开发人员可以提高客户端软件的效率,或者更可持续地使用分片(sharding)之类的技术,以使构建和验证链的工作分散在多个节点上。目前,被称为“ eth2”的工作正在为以太坊构建这种升级。
其次,您可以更改使用区块链的方式。用户不再将所有活动直接放在区块链上,而是通过“二层(Layer2)”协议在链下执行大量活动。在链上有一个智能合约,该合约只有两个任务:处理存款和提款,以及核实证明链下发生的所有事情都遵循合约规则。进行这些证明的方法有多种,但是它们都具有以下特性:在链上验证证明比在链下进行原始计算便宜得多。
状态通道vs Plasma vs Rollups
Layer 2扩容的三种主要类型是状态通道,Plasma和汇总(Rollups)。它们是三种不同的范式,具有不同的优势和劣势,在这一点上,我们相当有信心所有Layer 2扩容都大致可归为这三类(尽管存在命名争议,例如参见“ validium”)。
状态通道如何运作?
另请参阅:https://www.jeffcoleman.ca/state-channels和statechannels.org
想象一下,爱丽丝(Alice)正在向鲍勃(Bob)提供网络连接服务,而鲍勃(Bob)向她每兆字节支付0.001美元。爱丽丝(Alice)和鲍勃(Bob)使用以下Layer2方案,而不是每次付款都进行交易。
首先,鲍勃将1美元(或一些ETH或稳定币等价物)放入智能合约中。为了向Alice支付第一笔款项,Bob签署了一张“票”(一条链上消息),上面写着“ $ 0.001”,然后将其发送给Alice。要进行第二次付款,Bob将在另一张票上写上“ $ 0.002”,并将其发送给Alice。依此类推,可以根据需要进行多次付款。当爱丽丝(Alice)和鲍勃(Bob)完成交易后,爱丽丝(Alice)可以发布价值最高的票证,用她自己的另一个签名包裹起来。智能合约将验证Alice和Bob的签名,向Alice支付鲍勃票上的金额,并将剩余的钱退还给Bob。如果Alice不愿意关闭通道(由于恶意或技术故障),则Bob可以启动撤回期限(例如7天);如果Alice在这段时间内不提供“票”,那么Bob的钱将会全部返还。
该技术功能强大:可以对其进行调整,以处理双向支付,智能合约关系(例如,Alice和Bob在通道内签订金融合约)和组成(如果Alice和Bob拥有开放通道,Bob和Charile也拥有),Alice可以不信任地与Charile互动)。但是通道可以做什么将会受到限制。不能使用通道将资金从链下发送给尚未参与通道的人。通道不能用于表示没有明确逻辑所有者的对象(例如Uniswap)。而且通道,特别是如果用来做比简单的定期付款更复杂的事情的通道,需要锁定大量资金。
Plasma如何工作?
另请参阅:最初Plasma白皮书和Plasma Cash。
要存入资产,用户需将资产发送到管理Plasma链的智能合约。Plasma链为该资产分配一个新的唯一ID(例如537)。每个Plasma链都有一个操作者(可以是一个中心化的参与者,或者是一个多重签名,或者是更复杂的东西,例如PoS或DPoS)。每隔一个间隔(可能是15秒,一个小时,或介于两者之间的任何时间),操作者都会生成一个“批次(batch)”,其中包括着他们已从链下收到的所有Plasma交易。他们生成一个Merkle树,其中在树中的每个索引X处都有一个转移资产ID X的事务(如果存在这样的事务),否则这个Merkle树的叶子为零。他们发布这个树的Merkle根进行链接。他们还将每个索引X的Merkle分支发送给该资产的当前所有者。要提取资产,用户需要发布最近一笔交易的Merkle分支,并将资产发送给他们。合约将开始一个质询期,在此期间,任何人都可以通过证明(i)发送方在发送资产时不拥有这个资产,或(ii)在以后的某个时间他们还将这些资产发送给了其他人,来尝试使用其他Merkle分支机构使取款无效。如果在7天内(例如)没有人证明这个提款是欺诈性的,则用户可以完成提取资产。
Plasma提供比通道更强大的属性:您可以将资产发送给从未参与系统的参与者,并且资本要求低得多。但这是有代价的:在“正常操作”期间,通道不需要任何数据就可以在链上进行传输,但是Plasma要求每条链定期发布一个哈希。此外,Plasma传输不是即时的:您必须等待时间间隔结束并等待区块被发布。
此外,Plasma和通道共有一个共同的弱点:为什么它们安全的博弈论依赖于这样的思想,即由两个系统控制的每个对象都具有一定的逻辑“所有者”。如果该所有者不关心其资产,则可能导致涉及该资产的“无效”结果。这对于许多应用都没关系,但是对于其他许多应用(例如Uniswap)却是一个破坏交易的因素。即使在无需所有者同意的情况下可以更改对象状态的系统(例如基于帐户的系统,在无需他人同意的情况下您可以增加某人的地址余额)也不适用于Plasma。这一切都意味着在任何实际的Plasma或通道部署中都需要大量的“特定于应用的推理”,并且不可能制作仅模拟整个以太坊环境(或“ EVM”)的Plasma或通道系统。为解决此问题,我们走向了Rollups。
汇总(Rollups)
另请参阅:关于optimistic rollups和ZK rollups。
Plasma和通道是“完整”的二层(Layer 2)方案,因为它们试图将数据和计算都移到链下。但是,围绕数据可用性的基本博弈论问题意味着,不可能对所有应用都安全地做到这一点。Plasma和通道通过依赖所有者的明确概念来解决此问题,但这会阻止它们走向完全普及。另一方面,汇总是“混合”二层方案。汇总将计算(和状态存储)移到链下,但每个事务在链上保留一些数据。为了提高效率,他们使用了许多花哨的压缩技巧来尽可能地用计算替换数据。结果是系统的可扩展性仍然受到基础区块链的数据带宽的限制,但是但是以一个非常有利比率:以太坊基础层ERC20代币传输成本约为45000gas,而汇总中的ERC20代币传输占用16个字节的链上空间,成本不到300gas。
数据属于链上这一事实很关键(注意:将数据“放在IPFS上”是行不通的,因为IPFS不能就是否有任何给定的数据可用达成共识;数据必须放在区块链上)。将数据放在链上并对此达成共识,任何人都可以根据需要在本地处理汇总中的所有操作,从而允许他们检测欺诈,发起提款或亲自开始生成交易批次。缺乏数据可用性问题意味着恶意或离线操作者能够造成伤害更少(例如,它们不会造成1周的延迟),从而为有权发布批次的人员开放了更大的设计空间,并使汇总工作变得非常容易推理一下。最重要的是,缺乏数据可用性问题意味着不再需要将资产映射到所有者,这是导致以太坊社区对汇总感到比以前的二层扩展更令人兴奋的关键原因:完全通用,甚至可以在汇总中运行EVM,从而使现有的以太坊应用几乎无需编写任何新代码即可迁移到汇总。
好的,那么汇总如何工作?
链上有一个智能合约,它维护状态根:汇总状态的Merkle根(意思是,“余额”内的帐户余额,合约代码等)。
任何人都可以发布批次(batch),这是一种以高度压缩形式的交易集合,包含了先前的状态根和新的状态根(处理交易后的Merkle根)。合约检查批处理中的先前状态根是否与其当前状态根相匹配;如果是这样,它将状态根切换到新的状态根。
为了支持存款和提款,我们增加了使输入或输出处于汇总状态“之外”的交易的功能。如果批次具有来自外部的输入,则提交该批次的事务也需要将这些资产转移到汇总合约中。如果某个批次有外部输出,则在处理该批次时,智能合约会启动这些提款。
就是这样!除了一个主要细节:如何知道批次中的后状态根(post-state root)是正确的?如果某人可以提交具有任何后状态根的批次而没有任何后果,那么他们可以将汇总中的所有币转移给自己。这个问题很关键,因为有两个非常不同的解决方案系列,而这两个解决方案系列促成了两种风格的汇总(Rollups)。
Optimistic rollups vs ZK rollups
汇总的两种类型是:
Optimistic rollups,使用欺诈证明:汇总合约会跟踪其整个状态根历史以及每个批次的哈希。 如果有人发现某个批次的后状态根不正确,则可以向链上发布一个证明,以证明该批次的计算不正确。 合约将验证该证明,并还原该批次(batch)及其之后的所有批次。
ZK rollups,使用有效性证明:每个批次都包含一个称为ZK-SNARK的加密证明(例如,使用PLONK协议),这证明后状态根是执行批次的正确结果。 无论计算量有多大,都可以在链上非常迅速地验证证明。
两种汇总类型之间存在复杂的权衡:
总的来说,我个人认为,在短期内,对于通用EVM计算而言,Optimistic Rollup可能会胜出,而对于简单付款,交易和其他特定于应用的用例,ZK Rollup可能会胜出。 随着ZK-SNARK技术的改进,在中长期而言,ZK Rollup将在所有用例中胜出。
剖析何为欺诈证明
Optimistic Rollup的安全性取决于以下想法:如果有人将无效的批次发布到汇总中,则任何检测到欺诈的人都可以发布欺诈证明,以向合约证明该批次无效并应该还原。
声称某批次无效的欺诈证明将包含上图中绿色部分数据:该批次本身(可以对照存储在链上的哈希值进行检查)以及Merkle树的各个部分,它们仅需要证明已读取和//或按批次修改的特定的帐户即可。可以从绿色的节点中重建黄色的树中节点,因此无需提供。此数据足以执行批处理并计算后状态(post-state)根(请注意,这与无状态客户端验证单个区块的方式完全相同)。如果批次中计算出的后状态根与提供的后状态根不同,则说明该批次是欺诈性的。
可以保证,如果一个批次的构造不正确,并且所有先前的批次都正确构造,则可以创建一个欺诈证明,证明该批次的构造不正确。请注意有关先前批次的声明:如果有多个无效批次发布到汇总中,那么最好尝试证明最早的无效批次。当然,还可以保证,如果正确构造了一个批次,则永远不可能创建表明该批次无效的欺诈证明。
压缩如何实现?
一个简单的以太坊交易(发送ETH)需要约110个字节。 但是,汇总上的ETH传输仅占用〜12个字节:
其中一部分只是简单的高级编码:以太坊的RLP在每个值的长度上每个值浪费1个字节。 但是,还有一些非常聪明的压缩技巧正在进行:
Nonce:该参数的目的是防止重放。 如果帐户的当前随机数为5,则该帐户的下一个交易记录必须带有5随机数,但是一旦处理了该交易,该帐户中的随机数将增加为6,因此无法再次处理该交易。 在汇总中,我们可以完全省略随机数,因为我们只是从预状态中恢复了随机数。 如果有人尝试使用较早的随机数重播事务,则签名将无法验证,因为将根据包含新的较高随机数的数据检查签名。
Gasprice:我们可以允许用户以固定价格范围的gas价格进行支付,例如选择2的16次连续幂。 或者,我们可以将每个批次的费用定为固定水平,或者甚至将gas付款完全移到汇总协议之外,并让交易者向批次创建者支付费用以通过通道将其包括在内。
gas:我们可以类似地将总gas选择为2的连续次幂。 另外,我们也可以只在批次级别设置gas限制。
To:我们可以用一个index替换这个20字节地址(例如,如果地址是添加到树中的第4527个地址,我们只需使用index 4527对其进行引用即可。我们会在状态中添加一个子树来存储index到地址的映射)。
Value:我们可以用科学记数法存储value。 在大多数情况下,转帐只需要1-3个有效数字。
Signature:我们可以使用BLS聚合签名,该签名允许将许多签名聚合为单个〜32-96字节(取决于协议)的签名。 然后可以一次检查整个签名和发件人的签名集。 该表中的〜0.5表示一个事实,即一个汇总中可以包含多少个签名是有限制的,这仅仅是因为有必要在单个欺诈证明中验证签名。
ZK汇总特有的一个重要压缩技巧是,如果事务的一部分仅用于验证,而与计算状态更新无关,则可以将该部分留在链下。Optimistic Rollup中却不能这么做,因为如果以后需要在欺诈证明中检查数据,则仍需要将数据包含在链上,而在ZK Rollup中,SNARK证明批次的正确性已经证明了任何数据提供了验证所需的信息。一个重要的例子是隐私保护汇总:在Optimistic Rollup中,每笔交易中用于隐私的ZK-SNARK(大小〜500字节)需要上链,而在ZK Rollup中,覆盖整个批次的ZK-SNARK已经毫无疑问地证明了这个“内部” ZK-SNARK是有效的。
这些压缩技巧是汇总的可扩展性的关键。没有它们,汇总可能只会使基础链的扩展能力提高约10倍(尽管有一些特定的计算繁重的应用,即使简单的汇总也很强大),而采用压缩技巧时,对于几乎所有应用,扩展系数几乎可以超过100倍。
谁可以提交一个批次(batch)?
有很多学派可以在Optimistic Rollup或ZK Rollup中提交批次。通常,一般认为,要能够提交批次,用户必须存入一笔大笔存款。如果该用户曾经提交过欺诈性批次(例如,具有无效的状态根),则该存款将被部分销毁,并作为对欺诈证明者的奖励。除此之外,还有许多可能性:
完全无政府状态:任何人都可以随时提交批次。这是最简单的方法,但是有一些重要的缺点。特别地,存在一个风险,即多个参与者将生成并尝试同时提交批次,并且这些批次中只有一个可以被成功地包括在内。这导致在生成证明中浪费大佬工作,或在向链上发布批次时浪费gas费用。
中心化Sequencer:只有一个角色,即sequencer,可以提交批次(提款除外:通常的技术是用户可以先提交提款请求,然后如果sequencer在下一次个批次中不处理这个提款请求,那么用户可以自己提交一个单独操作批次)。这是最“有效”的方法,但它依赖于中心角色的活跃性。
Sequencer拍卖:举行拍卖(例如每天),以确定谁有权在第二天成为Sequencer。该技术的优点在于它筹集了可以由例如Rollup控制的DAO分配的资金(请参阅:MEV拍卖)。
从PoS集中随机选择:任何人都可以将ETH(或汇总的自身协议代币)存入到汇总合约中,并且从一批存放者中随机选择每一批次的Sequencer,被选择的概率与存入代币数量成正比。该技术的主要缺点是导致大量不必要的资本锁定。
DPoS投票:在拍卖中选择了一个Sequencer,但是如果它们的表现不佳,代币持有者可以投票将其踢出并进行新的拍卖来替换它们。
拆分批次和状态根供应
当前正在开发的一些汇总使用“拆分批次”范例,其中提交一批二层事务的动作和提交状态根的动作是分别完成的。这具有一些关键优势:
您可以允许许多Sequencer同时发布批次,以提高抗审查能力,而不必担心某些批次将是无效的,因为其他批处理已首先被包含在内。
如果状态根是欺诈性的,则无需还原整个批次。您可以只还原状态根,然后等待某人为同一批次提供新的状态根。这为交易发送者提供了更好的保证,即他们的交易将不会被还原。
因此,总而言之,有一个相当复杂的技术生态正在尝试在涉及效率,简单性,抗审查性和其他目标的复杂权衡之间取得平衡。现在说这些想法的最佳组合还为时过早。时间会证明一切。
汇总会给您带来多少扩展?
在现有的以太坊链上,gas限制为1,250万,交易中每个字节的数据花费16 gas。这意味着,如果一个区块只包含一个批次(比如使用ZK Rollup,在验证验证上花费了500k gas),则该批次可以拥有(1200万/ 16)= 750,000字节的数据。 如上所示,ETH传输的汇总每个用户操作仅需要12个字节,这意味着该批处理最多可包含62,500个事务。 在平均13秒钟的区块时间上,这相当于〜4807 TPS(相比之下,直接在以太坊上进行ETH传输的费用为1,250万/ 21000/13〜= 45 TPS)。
这是其他一些示例用例的图表:
按照(L1 gas成本)/(汇总字节数* 16)* 1200万/ 1250万计算的可实现最大扩展性。
现在,值得注意的是,由于某些原因,这些数字过于乐观。最重要的是,一个区块几乎永远不会只包含一个批次,至少是因为有并且将会有多个汇总。第二,存款和取款将继续存在。第三,短期内使用率较低,因此固定成本将占主导地位。但是,即使考虑到这些因素,仍有望实现超过100倍的扩展性。
现在,如果我们想超过〜1000-4000 TPS(取决于特定的使用情况)怎么办?这里是eth2数据分片的来源。分片提议每12秒开放一个16 MB的空间,可以填充任何数据,并且该系统保证就该数据的可用性达成共识。汇总可以使用此数据空间。每秒约1398KB是现有以太坊链的每秒约60 KB的23倍,并且从长远来看,数据容量有望进一步增长。因此,使用eth2分片数据的汇总可以共同处理多达10万个TPS,将来甚至还会更多。
Rollup中有哪些尚未解决的挑战?
Rollup的基本概念现在已得到很好的理解,我们可以肯定它们在根本上是可行且安全的,并且已经将多个rollup部署到了主网上,但仍有很多rollup设计领域尚未得到很好的探索,为了充分利用以太坊的可扩展性,将以太坊生态系统的大部分完全整合到rollup中会遇到很多挑战。一些关键挑战包括:
用户和生态系统扩大——-很少有应用使用Rollup,用户不熟悉Rollup,并且很少有钱包开始集成Rollup。商家和慈善机构尚未接受其付款。
交叉Rollup事务——将资产和数据(例如oracle输出)从一个Rollup有效地移动到另一Rollup中,而不会花费通过基础层的费用。
审计激励——如何最大程度地提高至少一个诚实节点实际上将完全验证Optimistic Rollup的机会,以便在出现问题时发布欺诈证明?对于小规模Rollup(不超过几百个TPS),这不是一个重要的问题,可以简单地依靠利他主义,但是对于大型汇总,则需要对此进行更明确的推理。
探索Plasma和Rollup之间的设计空间——是否有将某些状态更新相关数据放到链上的技术,但不是全部数据,还有什么有用的方法可以用呢?
最大化预确认的安全性——许多Rollup提供了“预确认(pre-confirmation)”的概念以实现更快的UX,其中sequencer立即提供一个承诺,即下一个批次中将包含一个事务,如果Sequencer食言,则其存款会被摧毁。但是该方案的经济安全性受到限制,因为它可能同时对许多参与者做出许诺。这种机制可以改善吗?
提高对不存在的Sequencer的响应速度——如果Rollup的Sequencer突然掉线,则以最大的速度和成本从该状况中快速恢复是很有价值的,既可以快速廉价地批量退出到另一个Rollup,也可以替换这个Sequencer。
高效的ZK-VM——生成ZK-SNARK证明,证明通用EVM代码(或现有智能合约可以编译到的一些不同VM)已正确执行,并具有给定的结果。
结论
汇总(Rollup)是一种强大的新的二层扩容范例,在短期和中期的未来(以及可能也是长期的)中,有望成为以太坊扩容的基石。他们看到了以太坊社区的极大热情,因为与以前尝试进行二层层扩展不同,Rollup可以支持通用EVM代码,从而允许现有应用轻松迁移。他们通过做出一个关键的妥协来做到这一点:不尝试完全转向链下,而是在链上每个事务中保留少量数据。
汇总有很多种,在设计空间中有很多选择:使用欺诈证明的Optimistic Rollup,还有使用有效性证明的ZK Rollup(也称为ZK-SNARK)。Sequencer(可以将事务批次发布到链上的用户)可以是中心化执行者,也可以是所有人都可以担任的,也可以是两者之间的许多其他选择。汇总仍是一项早期技术,并且开发仍在继续快速发展,但汇总功能已经可以正常工作,并且其中一些(尤其是Loopring,ZKSync和DeversiFi)已经运行了几个月。希望在未来的几年中,会有更多激动人心的工作出现在汇总空间中。
Scan QR code with WeChat