2

这是我的整个程序。其背后的原因是以太坊上的程序越大,加载它的成本就越高(因为每字节的gas成本非常高)。

CALLER
CALLDATASIZE
ISZERO
PUSH1 0x07
JUMPI
PUSH3 0x5b6000
SSTORE

所以我要跳进去PUSH3 0x5b6000,但如果我们拆解0x5b6000,那就意味着

JUMPDEST
PUSH1 0x00

因此,由于 evm 操作码编码是完全可变长度的(并且所有指令在 PUSHxx 旁边都是一个字节长)并且我正在跳转到 a JUMPDEST,为什么这个事务会失败?

黄皮书的什么地方规定,去aJUMPDEST不是有效跳转目的地的唯一要求?

4

1 回答 1

2

我不确定最初提出这个问题时可以使用哪个版本的黄皮书,但这里是伊斯坦布尔版本第 13 页的摘录:

9.4.3。跳转目的地有效性。我们之前使用 D 作为函数来确定给定正在运行的代码的有效跳转目标集。我们将其定义为 JUMPDEST 指令占用的代码中的任何位置。

所有这些位置都必须位于有效的指令边界上,而不是位于 PUSH 操作的数据部分,并且必须出现在代码的显式定义部分中(而不是出现在其后面的隐式定义的 STOP 操作中)。

这是实现分析的代码的 geth源位置

于 2021-09-19T03:22:03.993 回答