我一直在寻找有关以太坊如何处理跳转和跳转目的地的信息。从各种博客和黄皮书我发现如下:
所采用的操作数JUMP
和所采用的两个操作数中的第一个是设置为JUMPI
的值PC
(假设第一个堆栈值!= 0 在的情况下JUMPI
)。
但是,查看此合约的创建代码(作为操作码),前几个操作码/值是:
PUSH1 0x60
PUSH1 0x40
MSTORE
CALLDATASIZE
ISZERO
PUSH2 0x00f8
JUMPI
据我了解,这意味着如果将值推入堆栈ISZERO
!= 0 然后PC
将更改为0x00f8
asJUMPI
从堆栈中获取两个,检查第二个是否为 0,如果不是,则设置PC
为其第一个操作数的值。
我遇到的问题是0x00f8
十进制是248
. 合同中的第 248 位似乎是MSTORE
而不是 a JUMPDEST
,这将导致合同无法执行,因为JUMP*
只能指向有效的JUMPDEST
.
大概合同不会故意跳转到无效的目的地?
如果有人能解释如何解决跳转和跳转目的地,我将不胜感激。