[appendix] [[evm_opcodes]] == Ethereum EVM Opcodes and Gas Consumption ((("EVM (Ethereum Virtual Machine)","opcodes and gas consumption")))((("gas","EVM opcodes and gas consumption")))This appendix is based on the consolidation work done by the people of https://github.com/trailofbits/evm-opcodes as a reference for Ethereum VM (EVM) opcodes and instruction information licensed under the http://bit.ly/2zfrv0b[Apache License 2.0]. [[evm_opcodes_table]] [cols=",,,,",options="header",] .EVM opcodes and gas cost |======================================================================================================================================================================================================= |Opcode |Name |Description |Extra info |Gas |`0x00` |+STOP+ |Halts execution |- |0 |`0x01` |+ADD+ |Addition operation |- |3 |`0x02` |+MUL+ |Multiplication operation |- |5 |`0x03` |+SUB+ |Subtraction operation |- |3 |`0x04` |+DIV+ |Integer division operation |- |5 |`0x05` |+SDIV+ |Signed integer division operation (truncated) |- |5 |`0x06` |+MOD+ |Modulo remainder operation |- |5 |`0x07` |+SMOD+ |Signed modulo remainder operation |- |5 |`0x08` |+ADDMOD+ |Modulo addition operation |- |8 |`0x09` |+MULMOD+ |Modulo multiplication operation |- |8 |`0x0a` |+EXP+ |Exponential operation |- |10*** |`0x0b` |+SIGNEXTEND+ |Extend length of two's complement signed integer |- |5 |`0x0c` - `0x0f` |Unused |Unused |- | |`0x10` |+LT+ |Less-than comparison |- |3 |`0x11` |+GT+ |Greater-than comparison |- |3 |`0x12` |+SLT+ |Signed less-than comparison |- |3 |`0x13` |+SGT+ |Signed greater-than comparison |- |3 |`0x14` |+EQ+ |Equality comparison |- |3 |`0x15` |+ISZERO+ |Simple NOT operator |- |3 |`0x16` |+AND+ |Bitwise AND operation |- |3 |`0x17` |+OR+ |Bitwise OR operation |- |3 |`0x18` |+XOR+ |Bitwise XOR operation |- |3 |`0x19` |+NOT+ |Bitwise NOT operation |- |3 |`0x1a` |+BYTE+ |Retrieve single byte from word |- |3 |`0x1b` - `0x1f` |Unused |Unused |- | |`0x20` |+SHA3+ |Compute Keccak-256 hash |- |30 |`0x21` - `0x2f` |Unused |Unused |- | |`0x30` |+ADDRESS+ |Get address of currently executing account |- |2 |`0x31` |+BALANCE+ |Get balance of the given account |- |400 |`0x32` |+ORIGIN+ |Get execution origination address |- |2 |`0x33` |+CALLER+ |Get caller address |- |2 |`0x34` |+CALLVALUE+ |Get deposited value by the instruction/transaction responsible for this execution |- |2 |`0x35` |+CALLDATALOAD+ |Get input data of current environment |- |3 |`0x36` |+CALLDATASIZE+ |Get size of input data in current environment |- |2 |`0x37` |+CALLDATACOPY+ |Copy input data in current environment to memory |- |3 |`0x38` |+CODESIZE+ |Get size of code running in current environment |- |2 |`0x39` |+CODECOPY+ |Copy code running in current environment to memory |- |3 |`0x3a` |+GASPRICE+ |Get price of gas in current environment |- |2 |`0x3b` |+EXTCODESIZE+ |Get size of an account's code |- |700 |`0x3c` |+EXTCODECOPY+ |Copy an account's code to memory |- |700 |`0x3d` |+RETURNDATASIZE+ |Pushes the size of the return data buffer onto the stack |http://bit.ly/2zaBcNe[EIP-211] |2 |`0x3e` |+RETURNDATACOPY+ |Copies data from the return data buffer to memory |http://bit.ly/2zaBcNe[EIP-211] |3 |`0x3f` |Unused |- |- | |`0x40` |+BLOCKHASH+ |Get the hash of one of the 256 most recent complete blocks |- |20 |`0x41` |+COINBASE+ |Get the block's beneficiary address |- |2 |`0x42` |+TIMESTAMP+ |Get the block's timestamp |- |2 |`0x43` |+NUMBER+ |Get the block's number |- |2 |`0x44` |+DIFFICULTY+ |Get the block's difficulty |- |2 |`0x45` |+GASLIMIT+ |Get the block's gas limit |- |2 |`0x46` - `0x4f` |Unused |- |- | |`0x50` |+POP+ |Remove word from stack |- |2 |`0x51` |+MLOAD+ |Load word from memory |- |3 |`0x52` |+MSTORE+ |Save word to memory |- |3* |`0x53` |+MSTORE8+ |Save byte to memory |- |3 |`0x54` |+SLOAD+ |Load word from storage |- |200 |`0x55` |+SSTORE+ |Save word to storage |- |0* |`0x56` |+JUMP+ |Alter the program counter |- |8 |`0x57` |+JUMPI+ |Conditionally alter the program counter |- |10 |`0x58` |+GETPC+ |Get the value of the program counter prior to the increment |- |2 |`0x59` |+MSIZE+ |Get the size of active memory in bytes |- |2 |`0x5a` |+GAS+ |Get the amount of available gas, including the corresponding reduction in the amount of available gas |- |2 |`0x5b` |+JUMPDEST+ |Mark a valid destination for jumps |- |1 |`0x5c` - `0x5f` |Unused |- |- | |`0x60` |+PUSH1+ |Place 1-byte item on stack |- |3 |`0x61` |+PUSH2+ |Place 2-byte item on stack |- |3 |`0x62` |+PUSH3+ |Place 3-byte item on stack |- |3 |`0x63` |+PUSH4+ |Place 4-byte item on stack |- |3 |`0x64` |+PUSH5+ |Place 5-byte item on stack |- |3 |`0x65` |+PUSH6+ |Place 6-byte item on stack |- |3 |`0x66` |+PUSH7+ |Place 7-byte item on stack |- |3 |`0x67` |+PUSH8+ |Place 8-byte item on stack |- |3 |`0x68` |+PUSH9+ |Place 9-byte item on stack |- |3 |`0x69` |+PUSH10+ |Place 10-byte item on stack |- |3 |`0x6a` |+PUSH11+ |Place 11-byte item on stack |- |3 |`0x6b` |+PUSH12+ |Place 12-byte item on stack |- |3 |`0x6c` |+PUSH13+ |Place 13-byte item on stack |- |3 |`0x6d` |+PUSH14+ |Place 14-byte item on stack |- |3 |`0x6e` |+PUSH15+ |Place 15-byte item on stack |- |3 |`0x6f` |+PUSH16+ |Place 16-byte item on stack |- |3 |`0x70` |+PUSH17+ |Place 17-byte item on stack |- |3 |`0x71` |+PUSH18+ |Place 18-byte item on stack |- |3 |`0x72` |+PUSH19+ |Place 19-byte item on stack |- |3 |`0x73` |+PUSH20+ |Place 20-byte item on stack |- |3 |`0x74` |+PUSH21+ |Place 21-byte item on stack |- |3 |`0x75` |+PUSH22+ |Place 22-byte item on stack |- |3 |`0x76` |+PUSH23+ |Place 23-byte item on stack |- |3 |`0x77` |+PUSH24+ |Place 24-byte item on stack |- |3 |`0x78` |+PUSH25+ |Place 25-byte item on stack |- |3 |`0x79` |+PUSH26+ |Place 26-byte item on stack |- |3 |`0x7a` |+PUSH27+ |Place 27-byte item on stack |- |3 |`0x7b` |+PUSH28+ |Place 28-byte item on stack |- |3 |`0x7c` |+PUSH29+ |Place 29-byte item on stack |- |3 |`0x7d` |+PUSH30+ |Place 30-byte item on stack |- |3 |`0x7e` |+PUSH31+ |Place 31-byte item on stack |- |3 |`0x7f` |+PUSH32+ |Place 32-byte (full word) item on stack |- |3 |`0x80` |+DUP1+ |Duplicate 1st stack item |- |3 |`0x81` |+DUP2+ |Duplicate 2nd stack item |- |3 |`0x82` |+DUP3+ |Duplicate 3rd stack item |- |3 |`0x83` |+DUP4+ |Duplicate 4th stack item |- |3 |`0x84` |+DUP5+ |Duplicate 5th stack item |- |3 |`0x85` |+DUP6+ |Duplicate 6th stack item |- |3 |`0x86` |+DUP7+ |Duplicate 7th stack item |- |3 |`0x87` |+DUP8+ |Duplicate 8th stack item |- |3 |`0x88` |+DUP9+ |Duplicate 9th stack item |- |3 |`0x89` |+DUP10+ |Duplicate 10th stack item |- |3 |`0x8a` |+DUP11+ |Duplicate 11th stack item |- |3 |`0x8b` |+DUP12+ |Duplicate 12th stack item |- |3 |`0x8c` |+DUP13+ |Duplicate 13th stack item |- |3 |`0x8d` |+DUP14+ |Duplicate 14th stack item |- |3 |`0x8e` |+DUP15+ |Duplicate 15th stack item |- |3 |`0x8f` |+DUP16+ |Duplicate 16th stack item |- |3 |`0x90` |+SWAP1+ |Exchange 1st and 2nd stack items |- |3 |`0x91` |+SWAP2+ |Exchange 1st and 3rd stack items |- |3 |`0x92` |+SWAP3+ |Exchange 1st and 4th stack items |- |3 |`0x93` |+SWAP4+ |Exchange 1st and 5th stack items |- |3 |`0x94` |+SWAP5+ |Exchange 1st and 6th stack items |- |3 |`0x95` |+SWAP6+ |Exchange 1st and 7th stack items |- |3 |`0x96` |+SWAP7+ |Exchange 1st and 8th stack items |- |3 |`0x97` |+SWAP8+ |Exchange 1st and 9th stack items |- |3 |`0x98` |+SWAP9+ |Exchange 1st and 10th stack items |- |3 |`0x99` |+SWAP10+ |Exchange 1st and 11th stack items |- |3 |`0x9a` |+SWAP11+ |Exchange 1st and 12th stack items |- |3 |`0x9b` |+SWAP12+ |Exchange 1st and 13th stack items |- |3 |`0x9c` |+SWAP13+ |Exchange 1st and 14th stack items |- |3 |`0x9d` |SWAP14 |Exchange 1st and 15th stack items |- |3 |`0x9e` |+SWAP15+ |Exchange 1st and 16th stack items |- |3 |`0x9f` |+SWAP16+ |Exchange 1st and 17th stack items |- |3 |`0xa0` |+LOG0+ |Append log record with no topics |- |375 |`0xa1` |+LOG1+ |Append log record with one topic |- |750 |`0xa2` |+LOG2+ |Append log record with two topics |- |1125 |`0xa3` |+LOG3+ |Append log record with three topics |- |1500 |`0xa4` |+LOG4+ |Append log record with four topics |- |1875 |`0xa5` - `0xaf` |Unused |- |- | |`0xb0` |+JUMPTO+ |Tentative http://bit.ly/2Sx2Vkg[libevmasm has different numbers] | http://bit.ly/2CR77pu[EIP 615] | |`0xb1` |+JUMPIF+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xb2` |+JUMPSUB+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xb4` |+JUMPSUBV+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xb5` |+BEGINSUB+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xb6` |+BEGINDATA+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xb8` |+RETURNSUB+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xb9` |+PUTLOCAL+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xba` |+GETLOCA+ |Tentative |http://bit.ly/2CR77pu[EIP-615] | |`0xbb` - `0xe0` |Unused |- |- | |`0xe1` |+SLOADBYTES+ |Only referenced in +pyethereum+ |- |- |`0xe2` |+SSTOREBYTES+ |Only referenced in +pyethereum+ |- |- |`0xe3` |+SSIZE+ |Only referenced in +pyethereum+ |- |- |`0xe4` - `0xef` |Unused |- |- | |`0xf0` |+CREATE+ |Create a new account with associated code |- |32000 |`0xf1` |+CALL+ |Message-call into an account |- |Complicated |`0xf2` |+CALLCODE+ |Message-call into this account with alternative account's code |- |Complicated |`0xf3` |+RETURN+ |Halt execution returning output data |- |0 |`0xf4` |+DELEGATECALL+ |Message-call into this account with an alternative account's code, but persisting into this account with an alternative account's code |- |Complicated |`0xf5` |+CALLBLACKBOX+ |- |- |40 |`0xf6` - `0xf9` |Unused |- |- | |`0xfa` |+STATICCALL+ |Similar to +CALL+, but does not modify state |- |40 |`0xfb` |+CREATE2+ |Create a new account and set creation address to `sha3(sender + sha3(init code)) % 2**160` |- | |`0xfc` |+TXEXECGAS+ |Not in yellow paper FIXME |- |- |`0xfd` |+REVERT+ |Stop execution and revert state changes, without consuming all provided gas and providing a reason |- |0 |`0xfe` |+INVALID+ |Designated invalid instruction |- |0 |`0xff` |+SELFDESTRUCT+ |Halt execution and register account for later deletion |- |5000* |=======================================================================================================================================================================================================