Я просто просматриваю первые несколько опкодов этого контракта: 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???
Что я делаю не так?
Существует разница между «Кодом создания контракта» (который включает в себя конструктор впереди) и развернутым байт-кодом. «Представление байт-кодов» показывает вам полный код создания контракта с конструктором впереди; «представление Opcodes» показывает вам только фактически развернутый код контракта. Конструктор запускается только один раз во время развертывания контракта, чтобы создать и настроить развернутый код; он вообще не отображается в развернутом байт-коде. Это не очевидно из пользовательского интерфейса Etherscan! Фактически развернутый код начинается с байта 0x01bf, насколько я могу судить (большой конструктор).
Вы можете убедиться в этом, обратившись к фактическому развернутому байт web3.eth.getCode('0xab7c74abc0c4d48d1bdad5dcb26153fc8780f83e');
-коду, результаты которого, как вы обнаружите, совпадают с представлением Opcodes на Etherscan.