Почему код инициализации контракта меняется для Solidity > 0.4.5?

У меня есть простой пустой контракт:

contract test {
}

Который я компилирую на Remix, используя разные версии. Я заметил, что скомпилированный вывод становится все более и более сложным с более поздними версиями компилятора:

0.4.4:  PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0xC DUP1 PUSH1 0x10 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x8 JUMP JUMPDEST PUSH1 0x2 JUMP 
0.4.5:  PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x0 JUMPI JUMPDEST PUSH1 0x9 DUP1 PUSH1 0x15 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE JUMPDEST PUSH1 0x0 JUMP
0.4.9:  PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH1 0xB JUMPI INVALID JUMPDEST JUMPDEST PUSH1 0x33 DUP1 PUSH1 0x19 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE JUMPDEST INVALID STOP LOG1 PUSH6 0x627A7A723058 SHA3 0xbb DELEGATECALL AND SWAP3 PUSH31 0x9A9ED68B77570A6681F22466F197FC4F1257401228E4A4722BDE9A00290000  
0.4.12: PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH1 0xE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST JUMPDEST PUSH1 0x36 DUP1 PUSH1 0x1C PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE JUMPDEST PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xed SWAP6 0x4f CALLDATASIZE 0xc2 0xee 0xd1 PUSH17 0xCCD896EFE39A5BCBD2F6A71C61439DD674 0xad MSTORE8 SWAP3 0x26 PUSH8 0x6C8D002900000000
0.4.13: PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH1 0xE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST JUMPDEST PUSH1 0x36 DUP1 PUSH1 0x1C PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE JUMPDEST PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH21 0x1D73368737655E9A09C3993DB87B5BCD07A9C28FC7 0xe3 JUMPI LT 0xdf 0xae SWAP9 PUSH23 0xF56780029000000000000000000000000000000000000 

Только глядя на код инициализации (все, что предшествует второму PUSH1 0x60 PUSH1 0x40 MSTORE), я вижу увеличение сложности. Это кажется важным, так как за это все платят за газ, и я хотел бы понять, почему это необходимо.

РЕДАКТИРОВАТЬ: я предполагаю, что этот раздел CALLVALUE ISZERO PUSH1 0xE JUMPIявляется условным переходом к первому JUMPDEST, 0xEесли эфир не был отправлен, иначе мы столкнемся с тем, REVERTчто, кажется, требует двух 0x0(?) в стеке. Но потом становится странно, когда два JUMPDESTследуют друг за другом, и множество вещей, которые помещаются в стек вокруг CODECOPY.

Ответы (1)

Одним из источников служебных данных, которые вы обнаружили, является добавленный хэш роя (32 байта) в конце байт-кода. Смотрите также здесь