Pular para o conteúdo principal
Change page

Opcodes para o EVM

Última atualização da página: 11 de setembro de 2025

Visão geral

Esta é uma versão atualizada da página de referência da EVM em wolflo/evm-opcodes (opens in a new tab). Também extraído do Yellow Paper (opens in a new tab), do Jello Paper (opens in a new tab) e da implementação do geth (opens in a new tab). Este artigo tem o intuito de ser uma referência acessível, mas não é particularmente rigorosa. Se quiser se certificar da exatidão e consciência de todos os casos extremos, é aconselhável usar o Jello Paper ou uma implementação do cliente.

Procurando uma referência interativa? Confira evm.codes (opens in a new tab).

Para operações com custos de gás dinâmicos, consulte gas.md (opens in a new tab).

💡 Dica rápida: Para ver linhas inteiras, use [shift] + scroll para rolar horizontalmente na área de trabalho.

PilhaNomeGásPilha inicialPilha resultanteMemória / ArmazenamentoObservações
00STOP0interromper execução
01ADD3a, ba + badição de (u)int256 módulo 2**256
02MUL5a, ba * bmultiplicação de (u)int256 módulo 2**256
03SUB3a, ba - bsubtração de (u)int256 módulo 2**256
04DIV5a, ba // bdivisão de uint256
05SDIV5a, ba // bdivisão de int256
06MOD5a, ba % bmódulo uint256
07SMOD5a, ba % bmódulo int256
08ADDMOD8a, b, N(a + b) % Nadição de (u)int256 módulo N
09MULMOD8a, b, N(a * b) % Nmultiplicação de (u)int256 módulo N
0AEXPA1 (opens in a new tab)a, ba ** bexponenciação de uint256 módulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)estender sinal (opens in a new tab) de x de (b+1) bytes para 32 bytes
0C-0Finválido
10LT3a, ba < buint256 menor que
11GT3a, ba > buint256 maior que
12SLT3a, ba < bint256 menor que
13SGT3a, ba > bint256 maior que
14EQ3a, ba == bigualdade de (u)int256
15ISZERO3aa == 0(u)int256 é zero
16AND3a, ba && bAND bit a bit
17OR3a, b`a \\b`
18XOR3a, ba ^ bXOR bit a bit
19NOT3a~aNOT bit a bit
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFi-ésimo byte de (u)int256 x, da esquerda
1BSHL3shift, valval << shiftdeslocamento à esquerda
1CSHR3shift, valval >> shiftdeslocamento lógico à direita
1DSAR3shift, valval >> shiftdeslocamento aritmético à direita
1E-1Finválido
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Finválido
30ADDRESS2.address(this)endereço do contrato em execução
31BALANCEA5 (opens in a new tab)addraddr.balancesaldo, em wei
32ORIGIN2.tx.originendereço que originou a tx
33CALLER2.msg.senderendereço do remetente da msg
34CALLVALUE2.msg.valuevalor da msg, em wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]lê a palavra dos dados da msg no índice idx
36CALLDATASIZE2.len(msg.data)comprimento dos dados da msg, em bytes
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]copiar dados da msg
38CODESIZE2.len(this.code)comprimento do código do contrato em execução, em bytes
39CODECOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]copia o bytecode do contrato em execução
3AGASPRICE2.tx.gaspricepreço do gás da transação, em wei por unidade de gás ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)tamanho do código no endereço (addr), em bytes
3CEXTCODECOPYA4 (opens in a new tab)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]copia o código de addr
3DRETURNDATASIZE2.sizetamanho dos dados retornados da última chamada externa, em bytes
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]copia os dados retornados da última chamada externa
3FEXTCODEHASHA5 (opens in a new tab)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseendereço do proponente do bloco atual
42TIMESTAMP2.block.timestampcarimbo de data/hora do bloco atual
43NUMBER2.block.numbernúmero do bloco atual
44PREVRANDAO2.sinalizador de aleatoriedadesinalizador de aleatoriedade
45GASLIMIT2.block.gaslimitlimite de gás do bloco atual
46CHAINID2.chain_idenvia o ID da cadeia (opens in a new tab) atual para a pilha
47SELFBALANCE5.address(this).balancesaldo do contrato em execução, em wei
48BASEFEE2.block.basefeetaxa base do bloco atual
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeetaxa base do blob do bloco atual (EIP-7516 (opens in a new tab))
4B-4Finválido
50POP2_anon.remove o item do topo da pilha e o descarta
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]lê uma palavra da memória no deslocamento ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valescreve uma palavra na memória
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFescreve um único byte na memória
54SLOADA6 (opens in a new tab)keystorage[key]lê a palavra do armazenamento
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valescreve uma palavra no armazenamento
56JUMP8dst.$pc := dst marca que pc só é atribuído se dst for um jumpdest válido
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pccontador de programa
59MSIZE2.len(mem)tamanho da memória no contexto de execução atual, em bytes
5AGAS2.gasRemaining
5BJUMPDEST1marca um destino de salto válidoum destino de salto válido, por exemplo, um destino de salto que não esteja dentro dos dados push
5CTLOAD100keytstorage[key]lê palavra do armazenamento transiente (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valescreve palavra no armazenamento transiente (EIP-1153 (opens in a new tab))
5EMCOPY3+3*words+A0 (opens in a new tab)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]copia memória de uma área para outra (EIP-5656 (opens in a new tab))
5FPUSH02.uint8empurra o valor constante 0 para a pilha
60PUSH13.uint8envia um valor de 1 byte para a pilha
61PUSH23.uint16envia um valor de 2 bytes para a pilha
62PUSH33.uint24envia um valor de 3 bytes para a pilha
63PUSH43.uint32envia um valor de 4 bytes para a pilha
64PUSH53.uint40envia um valor de 5 bytes para a pilha
65PUSH63.uint48envia um valor de 6 bytes para a pilha
66PUSH73.uint56envia um valor de 7 bytes para a pilha
67PUSH83.uint64envia um valor de 8 bytes para a pilha
68PUSH93.uint72envia um valor de 9 bytes para a pilha
69PUSH103.uint80envia um valor de 10 bytes para a pilha
6APUSH113.uint88envia um valor de 11 bytes para a pilha
6BPUSH123.uint96envia um valor de 12 bytes para a pilha
6CPUSH133.uint104envia um valor de 13 bytes para a pilha
6DPUSH143.uint112envia um valor de 14 bytes para a pilha
6EPUSH153.uint120envia um valor de 15 bytes para a pilha
6FPUSH163.uint128envia um valor de 16 bytes para a pilha
70PUSH173.uint136envia um valor de 17 bytes para a pilha
71PUSH183.uint144envia um valor de 18 bytes para a pilha
72PUSH193.uint152envia um valor de 19 bytes para a pilha
73PUSH203.uint160envia um valor de 20 bytes para a pilha
74PUSH213.uint168envia um valor de 21 bytes para a pilha
75PUSH223.uint176envia um valor de 22 bytes para a pilha
76PUSH233.uint184envia um valor de 23 bytes para a pilha
77PUSH243.uint192envia um valor de 24 bytes para a pilha
78PUSH253.uint200envia um valor de 25 bytes para a pilha
79PUSH263.uint208envia um valor de 26 bytes para a pilha
7APUSH273.uint216envia um valor de 27 bytes para a pilha
7BPUSH283.uint224envia um valor de 28 bytes para a pilha
7CPUSH293.uint232envia um valor de 29 bytes para a pilha
7DPUSH303.uint240envia um valor de 30 bytes para a pilha
7EPUSH313.uint248envia um valor de 31 bytes para a pilha
7FPUSH323.uint256envia um valor de 32 bytes para a pilha
80DUP13aa, aclona o 1º valor na pilha
81DUP23_, aa, _, aclona o 2º valor na pilha
82DUP33_, _, aa, _, _, aclona o 3º valor na pilha
83DUP43_, _, _, aa, _, _, _, aclona o 4º valor na pilha
84DUP53..., aa, ..., aclona o 5º valor na pilha
85DUP63..., aa, ..., aclona o 6º valor na pilha
86DUP73..., aa, ..., aclona o 7º valor na pilha
87DUP83..., aa, ..., aclona o 8º valor na pilha
88DUP93..., aa, ..., aclona o 9º valor na pilha
89DUP103..., aa, ..., aclona o 10º valor na pilha
8ADUP113..., aa, ..., aclona o 11º valor na pilha
8BDUP123..., aa, ..., aclona o 12º valor na pilha
8CDUP133..., aa, ..., aclona o 13º valor na pilha
8DDUP143..., aa, ..., aclona o 14º valor na pilha
8EDUP153..., aa, ..., aclona o 15º valor na pilha
8FDUP163..., aa, ..., aclona o 16º valor na pilha
90SWAP13a, bb, a
91SWAP23a, _, bb, _, a
92SWAP33a, _, _, bb, _, _, a
93SWAP43a, _, _, _, bb, _, _, _, a
94SWAP53a, ..., bb, ..., a
95SWAP63a, ..., bb, ..., a
96SWAP73a, ..., bb, ..., a
97SWAP83a, ..., bb, ..., a
98SWAP93a, ..., bb, ..., a
99SWAP103a, ..., bb, ..., a
9ASWAP113a, ..., bb, ..., a
9BSWAP123a, ..., bb, ..., a
9CSWAP133a, ..., bb, ..., a
9DSWAP143a, ..., bb, ..., a
9ESWAP153a, ..., bb, ..., a
9FSWAP163a, ..., bb, ..., a
A0LOG0A8 (opens in a new tab)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (opens in a new tab)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (opens in a new tab)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (opens in a new tab)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (opens in a new tab)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFinválido
F0CREATEA9 (opens in a new tab)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (opens in a new tab)gás, addr, val, argOst, argLen, retOst, retLensucessomem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)gás, addr, val, argOst, argLen, retOst, retLensucessomem[retOst:retOst+retLen-1] = returndatao mesmo que DELEGATECALL, mas não propaga o msg.sender e o msg.value originais
F3RETURN0* (opens in a new tab)ost, len.retorna mem[ost:ost+len-1]
F4DELEGATECALLAA (opens in a new tab)gás, addr, argOst, argLen, retOst, retLensucessomem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (opens in a new tab)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9inválido
FASTATICCALLAA (opens in a new tab)gás, addr, argOst, argLen, retOst, retLensucessomem[retOst:retOst+retLen-1] := returndata
FB-FCinválido
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)opcode inválido designado - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.envia todo o ETH para addr; se executado na mesma transação em que um contrato foi criado, destrói o contrato

Este artigo foi útil?