Почему байт-код не совпадает с кодом операции на Etherscan?

Я просто просматриваю первые несколько опкодов этого контракта: https://etherscan.io/address/0xab7c74abc0c4d48d1bdad5dcb26153fc8780f83e#code .

Какие (согласно просмотру кодов операций):

PUSH1 0x60
PUSH1 0x40
MSTORE
CALLDATASIZE
ISZERO
PUSH2 0x00f8

Основываясь на том, какие OPCODES доступны для Ethereum EVM? , я бы ожидал, что байт-код будет 0x6060604052156100f8....

Но байт-код: 0x60606040526002610108..., который я читаю как

0x60 0x60      ;; PUSH1 0x60 
0x60 0x40      ;; PUSH1 0x40
0x52           ;; MSTORE
0x60 0x02      ;; PUSH1 0x02???
0x61 0x01 x08  ;; PUSH2 0x01 0x08???

Что я делаю не так?

Ответы (1)

Существует разница между «Кодом создания контракта» (который включает в себя конструктор впереди) и развернутым байт-кодом. «Представление байт-кодов» показывает вам полный код создания контракта с конструктором впереди; «представление Opcodes» показывает вам только фактически развернутый код контракта. Конструктор запускается только один раз во время развертывания контракта, чтобы создать и настроить развернутый код; он вообще не отображается в развернутом байт-коде. Это не очевидно из пользовательского интерфейса Etherscan! Фактически развернутый код начинается с байта 0x01bf, насколько я могу судить (большой конструктор).

Вы можете убедиться в этом, обратившись к фактическому развернутому байт web3.eth.getCode('0xab7c74abc0c4d48d1bdad5dcb26153fc8780f83e');-коду, результаты которого, как вы обнаружите, совпадают с представлением Opcodes на Etherscan.