以太坊字节码和代码块分析
代码分块是将字节码拆分成更小块的策略,有助于减小见证大小。但只有在执行期间访问的字节码相对较少时,这种方法才有效。本分析探索字节和块的访问模式,以评估代码分块的实用性。
方法论
包含数据收集和分析代码的完整仓库可以在此处找到。
分析
[后续内容保持不变,只翻译文字部分]平均字节访问比率
- 原始:22.8%
- 包含代码大小:54.0%(+31.2%)
- 包含代码复制:31.5%(+8.7%)
平均代码块访问比率
- 原始:29.6%
- 包含代码大小:57.8%(+28.2%)
- 包含代码复制:37.6%(+8.0%)
在包含代码访问指令后,我们确实看到访问比率有适度增加。然而,这主要是由于代码大小操作码。如前所述,在账户字段中添加代码大小将使代码复制操作码成为访问整个字节码的唯一指令。由于代码复制指令的数量明显较少,整体访问比率较低。
代码分块是否是可行的解决方案?
参考EIP-2926,代码分块的主要目的是减少见证大小,因为当前的现状要求在代码证明中使用整个字节码。
我们的分析表明,并非合约字节码中的所有字节都被使用。事实上,只有相对较小的字节和代码块被使用。基于当前的访问模式,如果我们实施代码分块,将显著减少代码见证中实际使用的字节数。
在EIP2926中,在账户字段中添加代码大小将有效地使代码复制操作码成为唯一需要访问整个字节码的指令。此外,根据我们的发现,代码复制操作码的数量明显少于代码大小。因此,基于当前的访问模式,我们将进一步减少平均代码见证大小。
我们可以进行的另一项探索是确定最佳代码块大小。在EIP-2926中,使用31字节的代码块。我们可能需要探索更小的代码块大小,如16字节,以最大化每个代码块利用的字节数。然而,这会带来额外的哈希开销。因此,我们需要通过实验不同的代码块大小来找到最佳平衡。





