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