Warum ändert sich der Init-Code eines Kontrakts für Solidity > 0.4.5?

Ich habe einen einfachen leeren Vertrag:

contract test {
}

Dass ich auf Remix mit verschiedenen Versionen kompiliere. Mir fällt auf, dass die kompilierte Ausgabe mit späteren Compiler-Versionen immer komplexer wird:

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 

Wenn ich mir nur den Init-Code anschaue (alles, was dem zweiten vorangeht PUSH1 0x60 PUSH1 0x40 MSTORE), sehe ich eine Zunahme der Komplexität. Dies scheint wichtig, da jeder dafür Benzin bezahlt, und ich würde gerne verstehen, warum dies notwendig ist.

EDIT: Ich gehe davon aus, dass der Abschnitt CALLVALUE ISZERO PUSH1 0xE JUMPIein bedingter Sprung zum ersten ist JUMPDEST, 0xEwenn keine Ether mitgeschickt wurden, sonst stoßen wir auf einen , der zwei (?) Auf dem Stapel REVERTzu erfordern scheint . 0x0Aber dann wird es komisch mit den beiden JUMPDEST, die aufeinander folgen und einer Menge Dinge, die um die herum auf den Stapel geschoben werden CODECOPY.

Antworten (1)

Eine Quelle für den Overhead, den Sie entdeckt haben, ist der hinzugefügte Schwarm-Hash (32 Bytes) am Ende des Bytecodes. Siehe auch hier