作者:0xSamo;来源:LXDAO
01 前言
EIP-4844 作为 The Merge 之后以太坊最大的升级,吸引了全网足够多的目光。这次升级引入的 Blob 临时存储空间,相当于在为以太坊这列火车增加了侧挂车厢,在不影响火车原有运行状态的前提下,提供了更便宜的数据可用性空间。
Optimism、StarkNet、Arbitrum 等 Layer 2 网络都在短时间内支持了 EIP-4844,并获得了显著的降费效果,以下是 LXDAO 国库在 Optimism 上为贡献者发工资的交易,前后的 Gas 费竟然相差了 100 倍。
但在惊喜的同时,我们发现 StarkNet 作为 ZK Rollup 的代表,居然也获得了惊人的降费效果,从以前 Gas 消耗动不动就超过 1$ 的水平,也下降到了 0.01$ 。
想了解更详细的技术原理,欢迎大家进入 MyFirstLayer2 学习。
02 为什么 StarkNet 的降费令人感到惊讶?
OP Rollup 与 ZK Rollup 对一层存储空间需求的不同
因为 OP Rollup 和 ZK Rollup 对 DA 费用(Data Availability:数据可用性,包含对数据的存储和分发服务,以便让第三方取得希望获取的数据)的依赖程度不同。
OP Rollup 会将近期交易的所有细节,包括用户签名等信息,打包压缩后全部上传到一层网络。它不需要在一层网络进行太多的验算任务,几乎所有的成本都在使用一层网络的存储空间之上。
ZK Rollup 相比之下,对数据拥有更高的压缩率。比如它可以抛弃用户签名数据,依靠零知识证明来确保交易合法;并且不需要打包所有交易细节,只需将状态的变化打包上传。
举个例子,在二层网络上,有 100 个用户在 USDC / USDT 交易对进行了交易,每次交易用户以及 Swap 合约里的 USDC、USDC两种余额都会发生变化。对 OP Rollup 来说,就是 100 条交易、200个账户的 400 次余额变动;而对 ZK Rollup 来说,涉及用户余额变化部分的差异不大,但对 Swap 合约来说,它的 USDC、USDT 余额共计 200 次的变化就可以压缩为 2 次最终余额的变化,大大减小了数据体积。
ZK Rollup 验证 ZK Proof 消耗的额外 Gas
了解了两者区别之后,大家的第一印象也许是 ZK Rollup 的 Gas 费会普遍比低,但实操过的同学们应该都知道,诸如 StarkNet、ZkSync 等 ZK Rollup 的 L2,其费用往往是显著高于 OP Rollup 的,特别是 StarkNet 的 STARK 技术路线比其他 SNARK 路线的 ZK Proof 体积更大,在各 L2 转账费用的排名里常常处于垫底位置。
2023年某时刻各 L2 费用表格
ZK Rollup 没有一上线就将 OP Rollup 打得满地找牙的原因很简单,是因为它虽然对交易数据有更高的压缩率,节省了向一层传输数据的费用,但它需要在一层网络上验证零知识证明的合法性,增加了计算的费用。
而 Blob 只能降低存储部分的费用,对计算部分是没有任何帮助的,因此 ZK Rollup 能在 EIP-4844 上获得的好处是更少的,所以看到 StarkNet 从排名倒数的“后进生”进步到与全班第一名第二名同一水平线上,很难不让人惊掉下巴。
03 StarkNet 费用的探索
不得不说 ZK Rollup 的机制要远比 OP Rollup 的复杂,比如通过 Optimism: Batcher 合约在升级前后向主网打包数据的费用中,任何人都完全能理解为什么它的交易费用下降了两个数量级。
了解更多:
升级前最后一笔旧 Batch:
https://etherscan.io/tx/0x8d8a21aeb64a62c66bc1848c2f37c4ca266edc5d122dd287270bc6aa2c24f445
升级后第一笔新 Batch(包含 Blob 费用共 0.0011 ETH):
https://etherscan.io/tx/0xa3e36193ab5ca4e6e98848640b1896def4c419ce203e7bd8e876dd2d5eb77e6c
6 个 Blob 的费用(合计 0.00078 ETH):
https://blobscan.com/tx/0xaec6d2e65705632f869c02b9baf063822153e058c0da75723733b78b99242f35
但在探索 StarkNet Gas 费用的过程中,笔者却经历了相当大的困难,甚至遇到了多次剧情反转,这个探索的过程本身也极具启发性,让我们一起随着文章来重温一遍。
消失的 L1DA
因为有了探索 Optimism 降费秘密的经验,我们很自然就想到,只需找到当初 StarkNet 向主网提交数据的合约就可以了,这种重要合约肯定一度在 Etherscan 的 Gas 消耗榜榜上有名,应该是不难找的,还没适配 Blob 的 Scroll 至今还名列前茅挂在耀眼的顶端呢。
当我们搜索 StarkNet 关键词之后,会找到 Operator、Core Contract、Memory Page Fact Registry 3个相关合约,但第三个看起来和存储空间相关的合约,在接近两年前就已经停止使用了。
于是我们只能看到 Operator 在不断和 Core Contract 交互,不断地更新最新的状态。
并且如果我们翻到适配 Blob 的前后,发现 Operator 的 Update State 交易确实进行了升级,但都仅仅是指向另一个数据包的哈希。甚至于后来的 updateStateKzgDA ,消耗的 Gas 反而变多了,这完全不能解释 StarkNet 降费的原因。
后来的这个更新,仅仅是一个 KZG 多项式承诺,用于证明 Blob 里的数据和它对应的 Batch 的数据包是对应的,也只是一个“状态根(State Root)”。这个状态根对应着记录着二层网络所有合约所有状态的“小账本”,这个小账本理论上也是存在于一层网络上的。
那么问题来了,为啥只剩个根?那厚厚的小账本上哪儿去了呢?
第一次挫败后的分析
虽然第一次探索不太成功,但我们仍然能得到一些推论和猜想。看过 MyFirstLayer2 的小伙伴一定知道 Rollup 探讨的核心问题就是 DA 问题(数据可用性),而它们采用的方案都是将关键数据上传到主网来解决数据可用性的问题,让所有人都能轻松访问到需要的数据。
OP Rollup 其实是简单粗暴地把每一条交易都压缩打包上传一层网络,那么其他人就可以通过解压之后,Replay 每一条交易来获取到二层小账本的全貌,以检验交易是否被正确执行。
ZK Rollup 则不需要上传全部交易细节,只需上传 State Diff(每个批次状态变化的部分)即可,由零知识证明来确保所有交易已经在二层被正确执行。而其他人则可以通过 Replay 多次状态变化的结果,来还原二层小账本的全貌。
而且我们知道 Blob 里的数据对一层来说只是一串二进制文本,一层只保护 Blob 里数据的准确性而不验证其合法性,一层的智能合约也无法读取并验证 Blob 里的内容,因此如果仍由一层来验证 ZK Proof,那 ZK Proof 本身肯定不能放在 Blob 里,所以 StarkNet 能够有一定的降费效果,一定是把每个批次的 State diff 放到 Blob 中了。
所以我们下面的任务显然就是搞清楚,StarkNet 到底把 State diff 放在哪里了?过去是放在哪儿的,现在究竟是不是放 Blob 里面了。
此外,只能找到一个状态根的现实也不禁让人怀疑,是不是很早以前 StarkNet 就悄悄把向主网上传状态变化的数据,改为由自己的 DAC (数据可用性委员会)负责了,如果真的是这样,那之前StarkNet 高昂的收费就完全没有道理,只能解释为……
相关链接:
https://layer2.myfirst.io/zh#2.4-rollup
SHARP 系统
所幸和 @0xYandhii 讨论之后迎来了新的曙光,StarkNet 在通用型主网上线之前,第一个产品其实是 StarkEX,包括去中心化衍生品交易所 DYDX 也是那个时期的产物。在主网上线之后,原先的产品没有被放弃,而是转而与主网共享一个验证系统。
即 SHARP: Shared Proving and Verifying System 系统,然后我们就找到了 SHARP Blockchain Writer、Starkware: SHARP Verifier 等相关合约。
打开区块浏览器查询相关交易,可以发现 SHARP Blockchain Writer 进行了以下4类操作:
Verify Merkle:验证默克尔树
Verify FRI:Fast Reed-Solomon Interactive Oracle Proof of Proximity,用于确保提交的数据或计算结果遵循特定的规则或约束,而不需要揭示数据本身的内容。
Register Continuous Memory Page:在一个周期内上传一百多次,注册连续的内存空间,疑似是向一层网络写入数据的部分。
Verify Proof And Register:一个周期一次,快则十分钟,慢则一两个小时,应该是攒够足够多的交易进行一个批次的验证。
不难看出 1、2、4 个步骤是与零知识证明相关的步骤,而第 3 个步骤注册内存空间显然是向一层网络写入数据的步骤,是最有可能存放 State diff 的地方。
合理推测是那三个验证步骤的费用在 Blob 升级前后没有显著变化,而第 3 个步骤的费用,应该能解释 StarkNet 前后两个数量级的降费效果。
于是笔者继续翻区块浏览器,在 EIP-4844 前倒数第二个旧版本、倒数第一个版本,已经升级后的最新版本 3 个时期各取一个验证周期,统计 4 个步骤消耗的 Gas 如何。
结果如下,令人挠头。
内存费用有下降一半,但从其在一整轮 ZK Proof 验证过程中的费用占比来说,这个 DA 下降的水平说明不了任何问题。
探索走到这里几乎就到了山穷水尽的一部,笔者感觉自己就像三体世界里坐在大型粒子对撞机前的物理学家,每个脑细胞都在尖叫着:This doesn't make sense ! 我甚至去 StarkNet 社区发了一篇帖子询问,但也许是因为问题涉及太过复杂,英文社区也迟迟没有人回应。
相关链接:
SHARP Blockchain Writer:
https://etherscan.io/address/0x16d5783a96ab20c9157d7933ac236646b29589a4
Starkware: SHARP Verifier:
https://etherscan.io/address/0x47312450b3ac8b5b8e247a6bb6d523e7605bdb60
SHARP 系统 GasUsed 探索
至此,我们还剩最后一个小 Trick ,之前下载的交易数据 csv 里面,只有 Gas 费消耗的 ETH ,没有 Gaslimit 等信息,所以无法排除 Gas 单价波动对统计的影响。于是笔者写了脚本将之前涉及的每一笔交易实际消耗的 GasUsed(Gaslimit 里被使用掉的部分)统计了出来。
终于,曙光出现!可以看到在升级之前,注册内存空间的交易其实是 2 笔一组发送的,一笔 Gas 是最低的 5 万,而另一笔一般在 30 万左右。
而升级之后,则几乎所有的注册内存交易都变成了 5 万的低消耗交易。
上一次的奇怪结论很可能是我们取的样本太少,正好那一次升级后的验证周期里,赶上了大段的主网 Gas 暴涨的时期,使得维持时间比较久的上百次 Register Continuous Memory Page 交易都花了更高的 Gas,使得统计出来的结果产生了偏差。
按照这个思路我们重新整理了 3 个时刻的 GasUsed 数据,这回合理了许多。至此可以证实 Memory Page 确实在升级之后体积显著缩小,这应该就是存放 State Diff 状态变化数据的地方,而升级之后这部分数据则转移至了 Blob。
并且后续我们在 l2beat.com 上找到了 StarkNet 的技术示意图,可以发现 State diff 确实如我们所料,是存放在 Memory Page 中的。
那么最终,我们根据 GasUsed 的数量计算(以目前随机抽取的较小样本量来宽泛估计),实际对 StarkNet 来说 L1DA 的费用大概有 4 - 10 倍的缩小空间,略低于一个数量级。这也符合理论推演:在 EIP-4844 升级中,ZK Rollup 获得的好处并不如 OP Rollup 那么多。
04 总结
经过以上的探索,我们终于理清了 StarNet 降费的原因和程度,其结论还是有点耐人寻味的。
L1DA 费用大降,但解释不了两个数量级的下降
可以明确 StarNet 之前是把每一批次状态变化的数据写入一层网络的,现在则是将这部分数据放在了 Blob 中,因此在注册内存空间的行为中可以获得略小于一个数量级的降费效果。
但 StarkNet 从之前倒数第一第二的水平,跻身到与 OP 系尖子生们一个水平的降费效果,从相对进步程度来说甚至吊打了全体 OP Rollup,这么显然是不可能的。
那么唯一合理的解释就是——之前确实“心黑”收太高了。在 STRK 代币发行之前,StarkNet的所有开发,社区激励都需要资金,除了烧投资人的钱之外,设置更高的 L2 L1 Gas 差价可能是他们维系开发的方式之一,才造成了此前 StarNet 令人尴尬的 Gas 费局面。
而现在 STRK 代币发行为他们带来了足够的流动资金和生态激励手段,也就是时候让 Gas 回到合理的水平了,趁着这波 Blob 升级把绑在脚上的沙袋一起拆下,其展现出的降费效果确实惊艳了许多人。
ZK 的 OP 化
OP Rollup 在升级之后,将原本存储在以太坊主网 Calldata 里的数据转移到临时储存区之后,其实牺牲了一点点的安全性。
在此前,Calldata 空间的数据是永久储存的,意味着任何人都能从以太坊主网里获取足够的数据,来还原 OP L2 上当前的所有状态。
但升级之后,Blob 的数据将会过期,如果全网没有任何一个实体保存过去的 Blob 数据,那 OP L2 的历史交易记录有可能会丢失。虽然当前最新的二层网络状态仍然能被保护——因为 Blob 的保存期限超过 OP 的 7-14 天挑战期,所以每个 Blob 在即将过期之前,它所对应的二层状态仍然是可信的,这最新的十几天的交易记录滚动地维护着 OP L2 的安全性。
ZK Rollup 如果希望享受 Blob 带来的好处,同样需要把重要的二层状态数据,从永久的 Calldata 空间转移到 Blob 空间里去。这意味着在一段时间后,我们也不再能像以前一样,依靠一层网络提供的数据来 Replay 二层的状态。
也许这将成为一种新常态,今后所有的二层网络,都依靠 Blob 维护最新状态的安全,而每一条 L2 也需要自己另外想办法解决历史交易数据的可用性,如此在安全和效率之间取得更好的平衡。
OP 与 ZK 的融合趋势
过去,第一代的 OP Rollup 率先上线,而第一代的 ZK Rollup 上线后没有带来更具竞争力的 Gas 费。到后续 OP Stack、Polygon SDK 出现带来的模块化风潮,OP Stack 甚至计划在将来引入 ZK 技术来降低挑战期。
这无疑都指向一个事实:OP 与 ZK 两种技术路线并不是你死我活的竞争,他们会互相借鉴,有融合的趋势,只不过这一次是“高贵”的 ZK 向“简单粗暴”的 OP 学习的一次。
很难想象二层网络的技术在短短两三年之间演化到如此的地步,也许这就是区块链世界的魅力吧。