Я искал информацию о том, как Ethereum справляется с прыжками и пунктами назначения прыжков. Из различных блогов и желтой бумаги я нашел следующее:
Операнд, принимаемый JUMP
, и первый из двух операндов, принимаемых JUMPI
, являются значением, на которое установлено PC
(предположим, что первое значение стека != 0 в случае JUMPI
).
Однако, глядя на код создания этого контракта (как коды операций), первые несколько кодов операций/значений:
PUSH1 0x60
PUSH1 0x40
MSTORE
CALLDATASIZE
ISZERO
PUSH2 0x00f8
JUMPI
Насколько я понимаю, это означает, что если значение, помещенное в стек с помощью ISZERO
!= 0, тогда PC
изменится на 0x00f8
, поскольку JUMPI
берет два из стека, проверяет, равен ли второй 0, и если нет, устанавливает PC
в значение своего первого операнд.
У меня проблема в том, что 0x00f8
в десятичном виде равно 248
. 248-я позиция в контракте выглядит как MSTORE
, а не JUMPDEST
, что может привести к сбою выполнения контракта, поскольку JUMP*
может указывать только на действительное JUMPDEST
.
Предположительно, контракты не переходят к недействительным адресатам намеренно?
Если бы кто-нибудь мог объяснить, как разрешаются прыжки и места назначения прыжков, я был бы очень признателен.