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