[]通过 EVM 代码默克尔化缩减见证数据大小( 三 )


在测试原型中 , 我们将合约代码拆分为 basic block;而可选的代码拆分算法当然有很多 , 有的简单有的复杂 。 最简单的一种就是拆分为固定大小的 chunk(比如 , 32 bytes/chunk) , 从目前来看 , 这种方法只会有 push 和 jumpdest 分析的问题 。 更进一步地说 , 如果我们任意设置字节码的最小值 , 则客户端在收到 chunk 之后 , 可能会因为 PUSH 操作或任何多字节码的操作 , 而碰上 JUMPDEST ( 0x5b ) 报错的情况 。 如下图所示 , 有完整代码的客户端会发现这里的 jump 操作是非法的 , 因为 0x5b 属于 PUSH1 的操作数 , 执行到这里应该终止 。 但如果客户端只收到 chunks #6 和 #8 , 而没有收到 #7, 则他会跳到位置 41 继续执行 , 就产生了对同一份合约代码的不同解释 。 后面我们会扼要地说明怎么在任意设置字节码的情况下 , 避免这种错误 。
[]通过 EVM 代码默克尔化缩减见证数据大小
本文插图

为了解决这个问题 , Martin Holst Swende 建议向每个 chunk 添加一个元数据 , 该元数据记录了有多少个 chunk 的首字节是 push 操作;然后 , 验证者就能在 jumpdest 分析过程中跳过那些字节 。 Alexey 正在探索的另一种方法是 “不允许在 EVM 中进行动态跳转操作”(至少 , 不允许使用代码默克尔化的合约进行跳转操作) , 这使我们只需在部署合约时做一次静态的跳转分析 , 而不需要在每次执行代码时进行 。 Alex Beregszaszi建议使用合约控制流程图 , 以更好地规范默克尔化流程;与之类似 , Christian Reitweissner 提出了一种执行证明方法 , 从合约的控制流程图创建默克尔 DAG(有向无环图) 。 我不会在本文中评价这些想法 , 希望之后能披露更多信息 。
最终结果可能表明 , 不同的 chunk 拆分算法之间的效率提升可以忽略不计 , 这么一来选择的算法就越简单越好 。 而好消息是 , 基于早期数据实验 , 我们至少有一种算法可以显著减少无状态区块中需要传输的代码量 。
本文着重讨论如何默克尔化 EVM 字节码 , 但总体思路并不局限于 EVM。 实际上 ,Ewasm 团队的其他成员也在尝试默克尔化 Wasm 代码 , 也遇到了相应的挑战 。 这些挑战主要是因为 Wasm 代码由多个部分组成 , 并且在执行之前需要经过严格的验证——这意味着重构的字节码也必须通过验证 。
敬请期待后续更多信息!
【[]通过 EVM 代码默克尔化缩减见证数据大小】原文链接:https://medium.com/ewasm/evm-bytecode-merklization-2a8366ab0c90


推荐阅读