Задача из Ethernaut - Magiс Number. Часть 1
Напомню, что эту задачу мы оставили на потом, так как нужно было разобраться с опкодом. Теперь мы понимаем его чуть лучше, и можно попробовать разобрать задачу.
P.S. Уже не сегодня, но мы порой будем возвращаться к опкоду в будущем, когда появится более интересный материал по этой теме.
Итак, целью задачи было написать код смарт контракта, чтобы он возвращал нам число "42", при этом уложившись в 10 байтов. Это можно сделать только с помощью опкода. Поехали.
Мы помним, что 1 опкод = 1 байту, а число 42 в hex = 0х2а.
Нам потребуется два набора байткода:
1. Байткод инициализации: тот, который подготовит смарт контракт и вернет runtime байткод.
2. Runtime байткод: тот, который используется после создания контракта, и где лежат все наши функции.
Посмотри на runtime сперва.
Для того, чтобы поместить что-то в память нам потребуется минимум три действия: сделать push данных, сделать push места, выполнить mstore, который принимает значение первых двух.
Кладем значение в память:
1. 0x60 - PUSH1 --> PUSH(0x2a) --> 0x602a
2. 0x60 - PUSH1 --> PUSH(0x80) --> 0x6080
3. 0x52 - MSTORE --> MSTORE --> 0x52
И возвращаем его из памяти:
1. 0x60 - PUSH1 --> PUSH(0x20) --> 0x6020
(размер значение в 32 байтах)
2. 0x60 - PUSH1 --> PUSH(0x80) --> 0x6080
3. 0xf3 - RETURN --> RETURN --> 0xf3
RETURN еще один новый для нас опкод, который принимает значения: слота памяти, где хранится значение, а также длину / размер данного значение.
В итоге runtime байткод будет выглядеть так:
602a60805260206080f3
Все "0х" мы удаляем, не забыли?
#evm #opcode
Post #494
269
- 👍 1