Códigos de operação para a EVM
Visão geral
Esta é uma versão atualizada da página de referência da EVM em wolflo/evm-opcodes (abre em uma nova aba). Também extraída do yellow paper (abre em uma nova aba), do Jello Paper (abre em uma nova aba) e da implementação do geth (abre em uma nova aba). A intenção é que esta seja uma referência acessível, mas não é particularmente rigorosa. Se você quiser ter certeza da exatidão e estar ciente de todos os casos extremos, é aconselhável usar o Jello Paper ou uma implementação de cliente.
Procurando por uma referência interativa? Confira evm.codes (abre em uma nova aba).
Para operações com custos dinâmicos de gás, consulte gas.md (abre em uma nova aba).
💡 Dica rápida: Para visualizar as linhas inteiras, use [shift] + scroll para rolar horizontalmente no desktop.
| Pilha | Nome | Gás | Pilha Inicial | Pilha Resultante | Mem / Armazenamento | Notas |
|---|---|---|---|---|---|---|
| 00 | STOP | 0 | interrompe a execução | |||
| 01 | ADD | 3 | a, b | a + b | adição de (u)int256 módulo 2**256 | |
| 02 | MUL | 5 | a, b | a * b | multiplicação de (u)int256 módulo 2**256 | |
| 03 | SUB | 3 | a, b | a - b | subtração de (u)int256 módulo 2**256 | |
| 04 | DIV | 5 | a, b | a // b | divisão de uint256 | |
| 05 | SDIV | 5 | a, b | a // b | divisão de int256 | |
| 06 | MOD | 5 | a, b | a % b | módulo de uint256 | |
| 07 | SMOD | 5 | a, b | a % b | módulo de int256 | |
| 08 | ADDMOD | 8 | a, b, N | (a + b) % N | adição de (u)int256 módulo N | |
| 09 | MULMOD | 8 | a, b, N | (a * b) % N | multiplicação de (u)int256 módulo N | |
| 0A | EXP | A1 (abre em uma nova aba) | a, b | a ** b | exponenciação de uint256 módulo 2**256 | |
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | extensão de sinal (abre em uma nova aba) de x de (b+1) bytes para 32 bytes | |
| 0C-0F | inválido | |||||
| 10 | LT | 3 | a, b | a < b | uint256 menor que | |
| 11 | GT | 3 | a, b | a > b | uint256 maior que | |
| 12 | SLT | 3 | a, b | a < b | int256 menor que | |
| 13 | SGT | 3 | a, b | a > b | int256 maior que | |
| 14 | EQ | 3 | a, b | a == b | igualdade de (u)int256 | |
| 15 | ISZERO | 3 | a | a == 0 | (u)int256 é zero | |
| 16 | AND | 3 | a, b | a && b | AND bit a bit | |
| 17 | OR | 3 | a, b | a || b | OR bit a bit | |
| 18 | XOR | 3 | a, b | a ^ b | XOR bit a bit | |
| 19 | NOT | 3 | a | ~a | NOT bit a bit | |
| 1A | BYTE | 3 | i, x | (x >> (248 - i * 8)) && 0xFF | i-ésimo byte de (u)int256 x, a partir da esquerda | |
| 1B | SHL | 3 | shift, val | val << shift | deslocamento à esquerda | |
| 1C | SHR | 3 | shift, val | val >> shift | deslocamento lógico à direita | |
| 1D | SAR | 3 | shift, val | val >> shift | deslocamento aritmético à direita | |
| 1E-1F | inválido | |||||
| 20 | KECCAK256 | A2 (abre em uma nova aba) | ost, len | keccak256(mem[ost:ost+len-1]) | keccak256 | |
| 21-2F | inválido | |||||
| 30 | ADDRESS | 2 | . | address(this) | endereço do contrato em execução | |
| 31 | BALANCE | A5 (abre em uma nova aba) | addr | addr.balance | saldo, em Wei | |
| 32 | ORIGIN | 2 | . | tx.origin | endereço que originou a transação | |
| 33 | CALLER | 2 | . | msg.sender | endereço do remetente da msg | |
| 34 | CALLVALUE | 2 | . | msg.value | valor da msg, em Wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | lê uma palavra dos dados da msg no índice idx | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | tamanho dos dados da msg, em bytes | |
| 37 | CALLDATACOPY | A3 (abre em uma nova aba) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copia os dados da msg |
| 38 | CODESIZE | 2 | . | len(this.code) | tamanho do código do contrato em execução, em bytes | |
| 39 | CODECOPY | A3 (abre em uma nova aba) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copia o bytecode do contrato em execução |
| 3A | GASPRICE | 2 | . | tx.gasprice | preço do gás da transação, em Wei por unidade de gás ** (abre em uma nova aba) | |
| 3B | EXTCODESIZE | A5 (abre em uma nova aba) | addr | len(addr.code) | tamanho do código no endereço, em bytes | |
| 3C | EXTCODECOPY | A4 (abre em uma nova aba) | addr, dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copia o código de addr |
| 3D | RETURNDATASIZE | 2 | . | size | tamanho dos dados retornados da última chamada externa, em bytes | |
| 3E | RETURNDATACOPY | A3 (abre em uma nova aba) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copia os dados retornados da última chamada externa |
| 3F | EXTCODEHASH | A5 (abre em uma nova aba) | addr | hash | hash = addr.exists ? keccak256(addr.code) : 0 | |
| 40 | BLOCKHASH | 20 | blockNum | blockHash(blockNum) | ||
| 41 | COINBASE | 2 | . | block.coinbase | endereço do proponente do bloco atual | |
| 42 | TIMESTAMP | 2 | . | block.timestamp | timestamp do bloco atual | |
| 43 | NUMBER | 2 | . | block.number | número do bloco atual | |
| 44 | PREVRANDAO | 2 | . | randomness beacon | beacon de aleatoriedade | |
| 45 | GASLIMIT | 2 | . | block.gaslimit | limite de gas do bloco atual | |
| 46 | CHAINID | 2 | . | chain_id | empurra o ID da cadeia (abre em uma nova aba) atual para a pilha | |
| 47 | SELFBALANCE | 5 | . | address(this).balance | saldo do contrato em execução, em Wei | |
| 48 | BASEFEE | 2 | . | block.basefee | taxa básica do bloco atual | |
| 49 | BLOBHASH | 3 | idx | tx.blob_versioned_hashes[idx] | EIP-4844 (abre em uma nova aba) | |
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | taxa básica de blob do bloco atual (EIP-7516 (abre em uma nova aba)) | |
| 4B-4F | inválido | |||||
| 50 | POP | 2 | _anon | . | remove o item do topo da pilha e o descarta | |
| 51 | MLOAD | 3* (abre em uma nova aba) | ost | mem[ost:ost+32] | lê uma palavra da memória no deslocamento ost | |
| 52 | MSTORE | 3* (abre em uma nova aba) | ost, val | . | mem[ost:ost+32] := val | escreve uma palavra na memória |
| 53 | MSTORE8 | 3* (abre em uma nova aba) | ost, val | . | mem[ost] := val && 0xFF | escreve um único byte na memória |
| 54 | SLOAD | A6 (abre em uma nova aba) | key | storage[key] | lê uma palavra do armazenamento | |
| 55 | SSTORE | A7 (abre em uma nova aba) | key, val | . | storage[key] := val | escreve uma palavra no armazenamento |
| 56 | JUMP | 8 | dst | . | $pc := dst marca que pc só é atribuído se dst for um jumpdest válido | |
| 57 | JUMPI | 10 | dst, condition | . | $pc := condition ? dst : $pc + 1 | |
| 58 | PC | 2 | . | $pc | contador de programa | |
| 59 | MSIZE | 2 | . | len(mem) | tamanho da memória no contexto de execução atual, em bytes | |
| 5A | GAS | 2 | . | gasRemaining | ||
| 5B | JUMPDEST | 1 | marca um destino de salto válido | um destino de salto válido, por exemplo, um destino de salto que não esteja dentro dos dados de push | ||
| 5C | TLOAD | 100 | key | tstorage[key] | lê uma palavra do armazenamento transitório (EIP-1153 (abre em uma nova aba)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | escreve uma palavra no armazenamento transitório (EIP-1153 (abre em uma nova aba)) |
| 5E | MCOPY | 3+3*words+A0 (abre em uma nova aba) | dstOst, ost, len | . | mem[dstOst] := mem[ost:ost+len] | copia a memória de uma área para outra (EIP-5656 (abre em uma nova aba)) |
| 5F | PUSH0 | 2 | . | uint8 | empurra o valor constante 0 para a pilha | |
| 60 | PUSH1 | 3 | . | uint8 | empurra um valor de 1 byte para a pilha | |
| 61 | PUSH2 | 3 | . | uint16 | empurra um valor de 2 bytes para a pilha | |
| 62 | PUSH3 | 3 | . | uint24 | empurra um valor de 3 bytes para a pilha | |
| 63 | PUSH4 | 3 | . | uint32 | empurra um valor de 4 bytes para a pilha | |
| 64 | PUSH5 | 3 | . | uint40 | empurra um valor de 5 bytes para a pilha | |
| 65 | PUSH6 | 3 | . | uint48 | empurra um valor de 6 bytes para a pilha | |
| 66 | PUSH7 | 3 | . | uint56 | empurra um valor de 7 bytes para a pilha | |
| 67 | PUSH8 | 3 | . | uint64 | empurra um valor de 8 bytes para a pilha | |
| 68 | PUSH9 | 3 | . | uint72 | empurra um valor de 9 bytes para a pilha | |
| 69 | PUSH10 | 3 | . | uint80 | empurra um valor de 10 bytes para a pilha | |
| 6A | PUSH11 | 3 | . | uint88 | empurra um valor de 11 bytes para a pilha | |
| 6B | PUSH12 | 3 | . | uint96 | empurra um valor de 12 bytes para a pilha | |
| 6C | PUSH13 | 3 | . | uint104 | empurra um valor de 13 bytes para a pilha | |
| 6D | PUSH14 | 3 | . | uint112 | empurra um valor de 14 bytes para a pilha | |
| 6E | PUSH15 | 3 | . | uint120 | empurra um valor de 15 bytes para a pilha | |
| 6F | PUSH16 | 3 | . | uint128 | empurra um valor de 16 bytes para a pilha | |
| 70 | PUSH17 | 3 | . | uint136 | empurra um valor de 17 bytes para a pilha | |
| 71 | PUSH18 | 3 | . | uint144 | empurra um valor de 18 bytes para a pilha | |
| 72 | PUSH19 | 3 | . | uint152 | empurra um valor de 19 bytes para a pilha | |
| 73 | PUSH20 | 3 | . | uint160 | empurra um valor de 20 bytes para a pilha | |
| 74 | PUSH21 | 3 | . | uint168 | empurra um valor de 21 bytes para a pilha | |
| 75 | PUSH22 | 3 | . | uint176 | empurra um valor de 22 bytes para a pilha | |
| 76 | PUSH23 | 3 | . | uint184 | empurra um valor de 23 bytes para a pilha | |
| 77 | PUSH24 | 3 | . | uint192 | empurra um valor de 24 bytes para a pilha | |
| 78 | PUSH25 | 3 | . | uint200 | empurra um valor de 25 bytes para a pilha | |
| 79 | PUSH26 | 3 | . | uint208 | empurra um valor de 26 bytes para a pilha | |
| 7A | PUSH27 | 3 | . | uint216 | empurra um valor de 27 bytes para a pilha | |
| 7B | PUSH28 | 3 | . | uint224 | empurra um valor de 28 bytes para a pilha | |
| 7C | PUSH29 | 3 | . | uint232 | empurra um valor de 29 bytes para a pilha | |
| 7D | PUSH30 | 3 | . | uint240 | empurra um valor de 30 bytes para a pilha | |
| 7E | PUSH31 | 3 | . | uint248 | empurra um valor de 31 bytes para a pilha | |
| 7F | PUSH32 | 3 | . | uint256 | empurra um valor de 32 bytes para a pilha | |
| 80 | DUP1 | 3 | a | a, a | clona o 1º valor na pilha | |
| 81 | DUP2 | 3 | _, a | a, _, a | clona o 2º valor na pilha | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | clona o 3º valor na pilha | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | clona o 4º valor na pilha | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | clona o 5º valor na pilha | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | clona o 6º valor na pilha | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | clona o 7º valor na pilha | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | clona o 8º valor na pilha | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | clona o 9º valor na pilha | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | clona o 10º valor na pilha | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | clona o 11º valor na pilha | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | clona o 12º valor na pilha | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | clona o 13º valor na pilha | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | clona o 14º valor na pilha | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | clona o 15º valor na pilha | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | clona o 16º valor na pilha | |
| 90 | SWAP1 | 3 | a, b | b, a | ||
| 91 | SWAP2 | 3 | a, _, b | b, _, a | ||
| 92 | SWAP3 | 3 | a, _, _, b | b, _, _, a | ||
| 93 | SWAP4 | 3 | a, _, _, _, b | b, _, _, _, a | ||
| 94 | SWAP5 | 3 | a, ..., b | b, ..., a | ||
| 95 | SWAP6 | 3 | a, ..., b | b, ..., a | ||
| 96 | SWAP7 | 3 | a, ..., b | b, ..., a | ||
| 97 | SWAP8 | 3 | a, ..., b | b, ..., a | ||
| 98 | SWAP9 | 3 | a, ..., b | b, ..., a | ||
| 99 | SWAP10 | 3 | a, ..., b | b, ..., a | ||
| 9A | SWAP11 | 3 | a, ..., b | b, ..., a | ||
| 9B | SWAP12 | 3 | a, ..., b | b, ..., a | ||
| 9C | SWAP13 | 3 | a, ..., b | b, ..., a | ||
| 9D | SWAP14 | 3 | a, ..., b | b, ..., a | ||
| 9E | SWAP15 | 3 | a, ..., b | b, ..., a | ||
| 9F | SWAP16 | 3 | a, ..., b | b, ..., a | ||
| A0 | LOG0 | A8 (abre em uma nova aba) | ost, len | . | LOG0(memory[ost:ost+len-1]) | |
| A1 | LOG1 | A8 (abre em uma nova aba) | ost, len, topic0 | . | LOG1(memory[ost:ost+len-1], topic0) | |
| A2 | LOG2 | A8 (abre em uma nova aba) | ost, len, topic0, topic1 | . | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
| A3 | LOG3 | A8 (abre em uma nova aba) | ost, len, topic0, topic1, topic2 | . | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
| A4 | LOG4 | A8 (abre em uma nova aba) | ost, len, topic0, topic1, topic2, topic3 | . | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
| A5-EF | inválido | |||||
| F0 | CREATE | A9 (abre em uma nova aba) | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | |
| F1 | CALL | AA (abre em uma nova aba) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F2 | CALLCODE | AA (abre em uma nova aba) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] = returndata | o mesmo que DELEGATECALL, mas não propaga o msg.sender e msg.value originais |
| F3 | RETURN | 0* (abre em uma nova aba) | ost, len | . | return mem[ost:ost+len-1] | |
| F4 | DELEGATECALL | AA (abre em uma nova aba) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F5 | CREATE2 | A9 (abre em uma nova aba) | val, ost, len, salt | addr | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | |
| F6-F9 | inválido | |||||
| FA | STATICCALL | AA (abre em uma nova aba) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| FB-FC | inválido | |||||
| FD | REVERT | 0* (abre em uma nova aba) | ost, len | . | revert(mem[ost:ost+len-1]) | |
| FE | INVALID | AF (abre em uma nova aba) | código de operação inválido designado - EIP-141 (abre em uma nova aba) | |||
| FF | SELFDESTRUCT | AB (abre em uma nova aba) | addr | . | envia todo o ETH para addr; se executado na mesma transação em que um contrato foi criado, ele destrói o contrato |