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