交易字节数的压缩的方式主要包括使用效率更高的编码方式、缩减交易占用字节数、减少需要上传的数据等。 图 2-2 交易压缩,来源:Vitalik 博客,https://vitalik.ca/general/2021/01/05/rollup.html 图 2-2 是 Vitalik 归纳的交易在以太坊一层和在 Rollup 上占用的字节数。虽然各团队在最终实现时与 Vitalik 归纳的并不完全相同,但思路是一致的,因此我们在本文中仍然引用 Vitalik 的归纳。 首先,在二层的交易中,Nonce 可以在交易中被省略;Gas 相关的 Gasprice 和 Gas 也不必出现在每笔二层交易中;To 和 From 地址不需要使用以太坊的地址,而是使用其在状态树中的索引 (如图 2-3 所示,二层的账户可以由一棵 Merkle 树来组织);Value 可以使用科学技术法存储节省位数;对于签名,可以将一个批次中的交易签名进行聚合,降低每个交易的签名存储消耗。同时,这些交易数据会被存储在链上 gas 成本比较低的字段 Calldata 中。 值得说明的是,上传的一层的数据不仅仅是上述的交易内容,还会包含批次交易发生前后的状态根 (图 2-3 中的 State Root),以及用于证明 (或用于备查) 状态转换合法性的数据。ZK Rollup 系的技术能比 Optimistic Rollup 系技术取得更好的压缩效果,一个重要的原因就是 ZK 需要上传的交易数据比 Op 少,Op 为了方便验证者挑战需要上传一些中间状态信息,但 ZK 只需要针对批次的交易上传证明信息。 图 2-3 状态树,来源:火币研究院 除了压缩交易占用字节数以外,Rollup 中交易的计算量也会比直接在一层上执行要少,因为交易不必在一层上重新执行,只需要验证二层运营者提交的状态转换是否正确。对于 ZK 来说,主要来自于验证状态转换证明 (零知识证明) 是否合法;而对于 Op 来说,主要来自于欺诈交易的挑战消耗。 目前,经过压缩后,在理论上,ZK 系技术能带来的吞吐量提升在 100 倍上下,而 Op 在 30 倍左右。 如何将二层的状态转换同步到一层?上一小节在讲交易压缩时提到二层运营者除了提交交易信息外,还会提交批次交易发生前后的状态根。这个状态根与以太坊一层的状态树的状态根类似,是账户状态的归集。 如图 2-3 所示,Rollup 的状态可以用 Merkle 树来组织,叶子节点为账户状态,中间节点存放层层向上进行哈希计算的信息,根节点是最终的哈希值,是二层所有账户状态的摘要。 如图 2-4 所示,是批次交易发生前后的状态转移示意图。二层的交易会改变交易相关的账户的状态,引起叶子节点的信息变动,最终导致根哈希值的变动。二层的运营者会在本地维护二层账户的状态树,记录批次交易发生前后的根哈希值,在上传批次交易时将此二哈希值一并上传。 (责任编辑:admin) |