以此为基础进行展开:如果我们在任意边界分割字节码,PUSH操作码及未来引入的其它多字节操作码的操作数可能会被接收到块的客户端误以为是JUMPDEST(0x5b)。如下所示,一个拥有完整代码的客户端可以得知JUMP是无效的(由于0x5b是PUSH1的一个操作数)并停止执行。然而,一个接收到块6和块8但没有接收块7的客户端将跳转到位置41,从而以不同的方式对合约进行解析。我们将在后文简要地提及能够避免该问题并支持任意边界的方案。
为了解决这个问题,Martin Holst Swende 建议在每个块上添加一个元数据,指定头部的多少个字节为PUSH的操作数。然后,验证程序可以在进行 JUMPDEST 分析期间跳过这些字节。Alexey正探索的另一条路径为禁止EVM中的动态跳转(至少对于希望默克尔化代码的合约而言),让我们能在部署时一次过静态地对跳转进行分析而不是在每次代码执行期间。Alex Beregszaszi 提出使用合约控制流图能够更好地指引默克尔化。同时,Christian Reitweissner 提出一个执行证明方案,其中默克尔化 DAG 是由合约的控制流图所创建。我不能客观地评价他在这篇文章中的思路,同时希望他能够在未来进行更多的说明。
结果或许会表明不同的分割算法在效率上仅有微不足道的提升。在这种情况下,最简单的算法将成为最明智的选择。好消息是,我们至少有一个在早期数据上似乎可以显著地减少无状态区块中传输代码量的算法。
本文特地对 EVM 字节码的默克尔化进行了讨论,但其总体思路并不局限于 EVM。事实上,其它 EWASM 团队正同时对默克尔化 WASM 代码进行实验,其面临着自身的一系列挑战。这主要是因为 WASM 代码由多个部分组成并在执行前有着严格的校验,这意味着重构的字节码必须通过校验。请持续关注这方面的进展。
致谢:非常感谢 EWASM 团队的 Guillaume Ballet,Alex Beregszaszi 和 Casey Detrio 对本文的审阅和反馈。
原文链接:
https://medium.com/ewasm/evm-bytecode-merklization-2a8366ab0c90
参考链接:
[1]https://ethereum-magicians.org/t/protocol-changes-to-bound-witness-size/3885
[2]https://ethresear.ch/t/the-stateless-client-concept/172
[3]https://blog.ethereum.org/2019/12/30/eth1x-files-state-of-stateless-ethereum/
[4]https://medium.com/@akhounov/data-from-the-ethereum-stateless-prototype-8c69479c8abc
[5]https://github.com/ledgerwatch/turbo-geth
[6]https://github.com/mandrigin/ethereum-mainnet-bin-tries-data
[7]https://en.wikipedia.org/wiki/Basic_block
[8]https://github.com/ethereum/evmone/blob/master/docs/efficient_gas_calculation_algorithm.md#basic-instruction-blocks
[9]https://github.com/ledgerwatch/turbo-geth/blob/master/docs/programmers_guide/guide.md
[10]https://github.com/ewasm/biturbo/pull/64
[11]https://medium.com/@mandrigin/stateless-ethereum-binary-tries-experiment-b2c035497768
本文首发于微信公众号:Unitimes。文章内容属作者个人观点,不代表和讯网立场。投资者据此操作,风险请自担。
此文由 中国比特币交易钱包 编辑,未经允许不得转载!:首页 > 比特币新闻 » 引介 | EVM 字节码的默克尔化