我需要将字节码反汇编为跨不同 EVM 版本的操作码,以使其与编译期间使用的 EVM 版本无关?
作为第二个最佳选择 - 是否有反汇编程序,允许您指定要使用的 EVM 版本? 我在网上做了很多研究,但没有发现类似的东西。 我目前正在使用 evmdasm: https://github.com/ethereum/evmdasm
但它已经很长时间没有更新了,所以,作为问题的一个例子 - 随着上海的发布,以及
PUSH0
的引入,对于用上海EVM版本编译的合约,我有操作码UNKNOWN_0x5f
(基本上无法识别的操作码 0x5f),而使用 Paris 版本编译的合约中的相同操作将看起来像 PUSH1 0x00
。
统一示例:
推入 0,堆栈到合约中,使用
paris
evm 版本进行编译,看起来像 PUSH1 0x00
。shanghai
evm 版本编译相同的合约,它将看起来像 PUSH0
。decompiled_code.replace('PUSH0', 'PUSH1 0x00')
投向巴黎实施。
换句话说:
decompile(x_shanghai_compiled) == decompile(x_paris_deployed) == decompile(x_other_evm_compiled)
您可以尝试Dedaub反汇编器;非常好,维护得很好。
对于任何有兴趣的人。我找到了一个现有的包,它允许您在反汇编过程中选择要使用的 evm 版本:
https://github.com/crytic/pyevmasm
此软件包还包含测试中 EVM 版本的良好变更日志,您可以在可能的地方使用它来进行统一:)