如何通过压缩 calldata 数据,降低 rollup 上的 gas 费用?

David Mihal热度: 15590

calldata 已经从在以太坊主网上最便宜的资源,变成了以太坊 rollup 上最昂贵的资源。

原文标题:Crunching the Calldata

原文作者:David Mihal

原文来源:L2fees.info

编译:DeFi 之道

自 2020 年以来,以太坊的扩展路线图一直以“rollup”为导向:独立的执行环境,使用证明(零知识证明或 Optimistic 的欺诈证明)来继承以太坊的安全性。

经过多年的发展,rollup 终于被部署并获得了采用。旗舰网络 Arbitrum 的 optimistic rollup 已经上线近一年的时间,目前有价值超过 27 亿美元的资产存入到了桥中,而 Optimism 也紧随其后。像 Loopring 和 dYdX 这样针对特定应用的零知识 rollup 也已经被大量采用,许多竞争性的通用零知识 rollup 也将在未来几个月的时间内推出。

尽管 rollup 领域的规模正在迅速扩大,但一些人表示担心部署 rollup 的第二层网络上的费用仍然太高。

数据有些人认为以太坊的第二层网络费用太高,因为每一个字节的 rollup 数据使用 16 个 gas。为了降低费用,gas 本可以减少到 3。这应该是一个很大的好处,费用降低 5 倍。然而,从长远来看,这可能意味着区块大小成为了一个新的网络制约因素。

事实上,Arbitrum 和 Optimism 的交易费用仍然大大高于 Solana 和 Polygon 等“低费用”区块链。

那么,到底是什么阻碍了这些 rollup 的进一步发展呢?

了解 rollup 经济

为了理解交易费用,我们首先需要对区块链交易产生的各种成本进行深入的分解。

执行

这是网络中所有节点执行交易并验证结果有效所需的成本(例如:你实际上拥有你试图转移的代币)。

存储/状态

这是用新值更新区块链“数据库”的成本(例如:在代币转移后,发送方的代币余额将会减少,而接收方的代币余额将会增加)。

数据可用性

为了确保区块链保持无信任和可被所有人验证,区块链必须确保所有关于交易的相关数据与所有网络参与者公开共享。

从本质上讲,这就是保证世界上每个人都能看到你的交易。如果没有这种保证,各种攻击都是可能发生的(被称为数据扣留攻击)。

正如我们将看到的那样,数据可用性是当今区块链的关键瓶颈之一。

rollup:将执行转移到链下

rollup 的主要进展来自于将区块链的执行和存储数据转移到“链下”的能力,即将相关的数据移到一组有限的节点上。与网络中的每个以太坊节点都需要执行所有交易并存储每次更新不同的是,我们只需将此任务委托给 rollup 的运营商。

等等,也许你可能会问,让我们去信任一小群运营商?这不是中心化吗?

这是一个很好的问题!

rollup 的目的是使用各种证明类型来继承与以太坊相同的安全性。Optimistic rollup 允许一个诚实的实体提交一个“欺诈证明”,并通过汇报行为不端的排序器来赢得奖励,而 ZKrollup 使用零知识证明(其实是一种花哨的密码学)来证明第二层网络已经正确更新。

数据可用性的权衡

将执行从主链上移开可以大大降低执行和状态存储的成本。然而,rollup 仍然必须将他们的数据发布到第一层区块链上,以确保数据的可用性。

从本质上讲,rollup 支付廉价的第二层执行和存储成本,但它仍然必须支付第一层主网的费用来发布他们的数据。

这些信息可以在 ArbiScan 区块浏览器中任何交易的“Advanced TxInfo(高级交易信息)”标签上看到。交易费用被分解为发布到第一层主网的 calldata 费用,第二层网络上使用的计算,以及第二层网络上的存储。而在几乎所有的交易中,第一层主网上的 calldata 将是费用的主要驱动因素。

简单地说:将数据发布到第一层主网是 rollup 费用的主要瓶颈。

数据可用性的未来

虽然数据可用性是现如今 rollup 的瓶颈,但预计随着时间的推移,这一点将得到缓解。

以太坊的升级,如 Proto-Danksharding 和最终的完全 Danksharding 将大大降低向以太坊发布数据的成本。此外,像 Celestia 这样的项目旨在提供专门用于提供廉价数据的独立链。

从长远来看,像 Danksharding 和 Celestia 这样的系统将使数据的可用性变得廉价和丰富,并将瓶颈转移回执行层上。然而,这些解决方案还需要时间来达到成熟。Celestia 距离他们的主网发布还有几个月的时间,而在以太坊能够增加像 Proto-Danksharding 这样的数据可用性升级之前,可能还需要一年多的时间。

calldata 压缩

数据压缩是一个比计算机本身还要古老的领域!莫尔斯电码发明于 1838 年,它是已知最早的数据压缩例子。然而,计算机的使用加速了科学家对数据压缩的研究,像哈夫曼编码这样的算法在 20 世纪 50 年代就已经被发明出来。

鉴于 rollup 的执行成本低廉,但其数据可用性的成本非常昂贵,一些团队一直在将数据压缩算法整合到他们的协议中,这并不奇怪。Optimism 已经将 Zlib 压缩算法整合到他们的 rollup 中(阅读‌更多关于他们的算法选择过程),而 Arbitrum 即将推出的 Nitro 升级版则使用了 brotli 压缩算法。

注意:这个实验可能是在 Nitro 发布之前匆忙进行的,以便在未压缩的 Arbitrum Calldata 上进行实验 🙂

数据压缩算法当然是有用的工具,它有助于降低这些 calldata 成本。然而,压缩区块链交易是一项非常艰巨的任务:数据压缩的作用是寻找共同的模式并缩短它们的数据量。然而,由于交易中充满了地址、哈希值和签名,对于这些压缩算法来说,它们本质上是“随机数据”。

计算数据成本的真正降低将来自于开发人员更好的关注于如何将他们应用程序中的 calldata 最小化。2020-2021 年的天价 gas 费用迫使开发人员优化他们的代码,以尽量减少执行和状态存储。

数据我最喜欢的反直觉优化之一,它总共节省了 6 个 gas 费用

随着我们过渡到第二层网络的世界,其中 calldata 从最便宜的资源变成最昂贵的资源,因此开发人员必须再次学习这些新的优化方法。

实验:我们能把一个简单的代币传输压缩到什么程度

现在让我们在 Arbitrum 上做一个实验:我们可以将一个简单的代币传输所需的 calldata 压缩到什么程度?这些优化能在多大程度上降低交易费用?

我们也建立了一个简单的用户界面,所以你可以自己尝试这个实验。

(注意,你的钱包必须有 Arbitrum Dai,Arbitrum USDC,Arbitrum 测试网的 Dai,或 Arbitrum 测试网的 UNI)

实验设计和对照案例

为了运行我们的实验,我们将建立一个简单的智能合约,将交易发送者的代币转移到任何一个给定的地址上。

这个样本智能合约确实要求用户在发送我们的实际测试交易之前,先发送一个 approve ()交易。由于这个限制,不太可能有用户真正想使用这个系统进行代币转移。然而,本实验中使用的节省成本的技术可以应用于其他合约(例如,优化的 Uniswap 路由器)。

为了开始这个实验,我们将发送一个“control(对照)”交易以获得一个基准成本。这个交易调用一个简单的 Solidity 函数,发送代币的地址、接收者的地址和要转移的代币数量。

我们的测试交易使用了 576051 个 ArbiGas(Arbitum 上的 gas 费用),总费用为 0.43 美元。

数据对照案例中的 calldata

简单的 calldata 压缩

接下来我们可以看一下基于对照案例的 calldata,在这其中我们可以把很多不必要的数据剥离出来。

首先,让我们删除所有的零,这些零只是作为填充数据来添加的。零比非零字节更便宜,但它们仍然会产生成本,所以先让我们删除它们。

在开头还有一个 4 个字节的函数签名,它是我们试图调用哪个 Solidity 函数的标识符。我们可以删除这个数据,让我们的代码简单地推断出我们要采取的行动。

这两个优化让我们把字节码从 100 个字节减少到了 43 个字节。我们的测试交易使用了 494485(较对照案例减少了 14%)个 ArbiGas,成本为 0.37 美元。

数据减少数据后的 calldata

确定性的“helper(助手)”合约

现在我们的大部分数据是由 calldata 中的两个地址组成的:一个是我们要转移的代币的地址,另一个是转移的接收者。

然而,我们可以想象大多数用户都在转移同样的几个代币(WETH,Dai,USDC)。我们可以从我们的 calldata 中删除整个代币地址的一个方法是为该代币部署一个特殊的“助手”合约。我们现在把我们的交易发送给这个助手,它完全避免了包括代币地址的需要。

有了“助手”合约,我们把数据字节码减少到了 23 个字节。我们的测试交易使用了 457546(比对照案例减少了 21%)ArbiGas,花费 0.34 美元。

数据助手合约 calldata

地址查询表(Address lookup-table)

我们的最后一个阶段使用了一个“助手合约”,它从我们的 calldata 中删除了一个地址,然而在我们的 calldata 中仍然有一个其他地址。

那么,当前是否有另一种技术可以更稳定地用于“压缩”地址呢?

值得庆幸的是,Arbitrum 有一个内置的合约,叫做“地址查询表”,我们可以用它来缩短我们的 calldata。

这个合约本质上是一个“电话簿”,它可以将 20 字节的以太坊地址映射为简单的整数。你可以想象一下,你的朋友有一本传统的电话簿:与其把你的整个电话号码读给他们听,不如你直接告诉他:“我加的电话是电话簿第 200 页的第 4 个电话号码”,然后让他们查找你的号码。

所以我们可以做的是制定一个合约,接受一个“地址索引”来代替完整的地址,并在内部查询完整的地址。

通过替换“代币”和“接收方”的地址,我们可以将 calldata 减少到 9 个字节。在这样的情况下,我们的测试交易使用了 428347(比对照案例减少 26%)ArbiGas,成本为 0.32 美元。

数据地址查询表 calldata

现在让我们把前面全部的压缩过程结合起来!

最后,让我们把我们所有的技术都结合起来。

  • 移除填充数字和函数选择器
  • 使用确定性的助手合约来移除常见的地址
  • 使用 Arbitrum 地址表来缩短其他地址

通过将所有这些操作加在一起,我们的 calldata 大小现在只有 6 个字节!最后的测试交易使用了 426529(也比对照案例减少了 26%,比之前的测试案例略低),成本为 0.32 美元。

数据结合所有案例后的 calldata

数据calldata 压缩后 gas 费用的降低情况

其他技术:有损压缩

我们所涉及的所有压缩技术都是“无损压缩”的例子,即压缩后的输出包含与原始输入相同的所有数据。

但就像照片和视频文件使用“有损压缩”算法来删除不必要的信息一样,我们也可以在大多数情况下删除不必要的数据。

这方面的主要例子是缩短数字以去除不必要的精度。例如,ERC-20 代币通常保持 18 位小数的精度,但大多数用户通常只关心小数点后 4 位。因此我们可以建立一个合约,默认接受小数点后 8 位的数字并乘以 10^10,并为需要更多精度的用户提供一个辅助功能。

同样,日期通常表示为“1970 年 1 月 1 日以来的秒数”(也被称为 Unix 时间)。那么合约可以通过接受时间为分钟、小时或天来减少这个整数的大小,并可以设置他们自己的“纪元”,例如,2015 年 1 月 1 日。

结论

总结:calldata 已经从在以太坊主网上最便宜的资源,变成了以太坊 rollup 上最昂贵的资源。像 Proto-Danksharding 和 Celestia 这样的数据可用性技术最终会缓解这一瓶颈,但两者都没有推出,而且数据可用性变得廉价和丰富可能还需要几年时间。

因此,区块链开发者需要注意他们交易所需的 calldata 数据量,因为这些数据对终端用户的交易费用有着重大的影响。

这篇文章概述了一些可用于减少 calldata 数据量的技术,然而我预计随着“专注于优化的开发者”将注意力转向到第二层网络,会有更多的技术出现。

责任编辑:Felix

声明:本文为入驻“MarsBit 专栏”作者作品,不代表MarsBit官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况,及遵守所在国家和地区的相关法律法规。