¿Por qué el código de bytes no coincide con los códigos de operación en Etherscan?

Estoy revisando los primeros códigos de operación de este contrato: https://etherscan.io/address/0xab7c74abc0c4d48d1bdad5dcb26153fc8780f83e#code .

Que son (según la vista de códigos de operación):

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

¿En base a qué OPCODES están disponibles para Ethereum EVM? , espero que el código de bytes sea 0x6060604052156100f8....

Pero el bytecode es: 0x60606040526002610108..., que estoy leyendo como

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

¿Qué estoy haciendo mal?

Respuestas (1)

Hay una diferencia entre el "Código de creación de contrato" (que incluye el constructor al frente) y el código de bytes implementado. La "vista Bytecodes" le muestra el código completo de creación del contrato con el constructor al frente; la "vista de códigos de operación" le muestra solo el código de contrato implementado real. El constructor solo se ejecuta una vez en el momento de la implementación del contrato para crear y configurar el código implementado; no aparece en absoluto en el código de bytes implementado. ¡Esto no es obvio desde la interfaz de usuario de Etherscan! El código realmente implementado comienza en el byte 0x01bf por lo que puedo decir (gran constructor).

Puede verificar esto accediendo al código de bytes implementado real cuya web3.eth.getCode('0xab7c74abc0c4d48d1bdad5dcb26153fc8780f83e');salida encontrará que coincide con la vista Opcodes en Etherscan.