Saltar al contenido principal
Change page

Códigos de operación para la EVM

This is an updated version of the EVM reference page at wolflo/evm-opcodes (se abre en una pestaña nueva). Also drawn from the Yellow Paper (se abre en una pestaña nueva), the Jello Paper (se abre en una pestaña nueva), and the geth (se abre en una pestaña nueva) implementation. This is intended to be an accessible reference, but it is not particularly rigorous. If you want to be certain of correctness and aware of every edge case, using the Jello Paper or a client implementation is advisable.

Looking for an interactive reference? Check out evm.codes (se abre en una pestaña nueva).

For operations with dynamic gas costs, see gas.md (se abre en una pestaña nueva).

💡 Quick tip: To view entire lines, use [shift] + scroll to scroll horizontally on desktop.

PilaNombreGasPila inicialPila resultanteMemoria / AlmacenamientoNotas
00STOP0detener ejecución
01ADD3a, ba + bsuma de (u)int256 módulo 2**256
02MUL5a, ba * bmultiplicación de (u)int256 módulo 2**256
03SUB3a, ba - bresta de (u)int256 módulo 2**256
04DIV5a, ba // bdivisión de uint256
05SDIV5a, ba // bdivisión de int256
06MOD5a, ba % bmódulo de uint256
07SMOD5a, ba % bmódulo de int256
08ADDMOD8a, b, N(a + b) % Nsuma de (u)int256 módulo N
09MULMOD8a, b, N(a * b) % Nmultiplicación de (u)int256 módulo N
0AEXPA1 (se abre en una pestaña nueva)a, ba ** bexponenciación de uint256 módulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)extensión de signo (se abre en una pestaña nueva) de x de (b+1) bytes a 32 bytes
0C-0Finválido
10LT3a, ba < bmenor que uint256
11GT3a, ba > bmayor que uint256
12SLT3a, ba < bmenor que int256
13SGT3a, ba > bmayor que int256
14EQ3a, ba == bigualdad de (u)int256
15ISZERO3aa == 0es cero (u)int256
16AND3a, ba && bAND a nivel de bits
17OR3a, ba || bOR a nivel de bits
18XOR3a, ba ^ bXOR a nivel de bits
19NOT3a~aNOT a nivel de bits
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFbyte i-ésimo de (u)int256 x, desde la izquierda
1BSHL3shift, valval << shiftdesplazamiento a la izquierda
1CSHR3shift, valval >> shiftdesplazamiento lógico a la derecha
1DSAR3shift, valval >> shiftdesplazamiento aritmético a la derecha
1E-1Finválido
20KECCAK256A2 (se abre en una pestaña nueva)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Finválido
30ADDRESS2.address(this)dirección del contrato en ejecución
31BALANCEA5 (se abre en una pestaña nueva)addraddr.balancesaldo, en Wei
32ORIGIN2.tx.origindirección que originó la tx
33CALLER2.msg.senderdirección del remitente del msg
34CALLVALUE2.msg.valuevalor del msg, en Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]leer palabra de los datos del msg en el índice idx
36CALLDATASIZE2.len(msg.data)longitud de los datos del msg, en bytes
37CALLDATACOPYA3 (se abre en una pestaña nueva)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]copiar datos del msg
38CODESIZE2.len(this.code)longitud del código del contrato en ejecución, en bytes
39CODECOPYA3 (se abre en una pestaña nueva)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspriceprecio del gas de la tx, en Wei por unidad de gas ** (se abre en una pestaña nueva)
3BEXTCODESIZEA5 (se abre en una pestaña nueva)addrlen(addr.code)tamaño del código en la addr, en bytes
3CEXTCODECOPYA4 (se abre en una pestaña nueva)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]copiar código de addr
3DRETURNDATASIZE2.sizetamaño de los datos devueltos desde la última llamada externa, en bytes
3ERETURNDATACOPYA3 (se abre en una pestaña nueva)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]copiar datos devueltos desde la última llamada externa
3FEXTCODEHASHA5 (se abre en una pestaña nueva)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbasedirección del proponente del bloque actual
42TIMESTAMP2.block.timestampmarca de tiempo del bloque actual
43NUMBER2.block.numbernúmero del bloque actual
44PREVRANDAO2.faro de aleatoriedadfaro de aleatoriedad
45GASLIMIT2.block.gaslimitlímite de gas del bloque actual
46CHAINID2.chain_idempujar el id de la cadena (se abre en una pestaña nueva) actual a la pila
47SELFBALANCE5.address(this).balancesaldo del contrato en ejecución, en Wei
48BASEFEE2.block.basefeetarifa base del bloque actual
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (se abre en una pestaña nueva)
4ABLOBBASEFEE2.block.blobbasefeetarifa base del blob del bloque actual (EIP-7516 (se abre en una pestaña nueva))
4B-4Finválido
50POP2_anon.eliminar el elemento superior de la pila y descartarlo
51MLOAD3* (se abre en una pestaña nueva)ostmem[ost:ost+32]leer palabra de la memoria en el desplazamiento ost
52MSTORE3* (se abre en una pestaña nueva)ost, val.mem[ost:ost+32] := valescribir una palabra en la memoria
53MSTORE83* (se abre en una pestaña nueva)ost, val.mem[ost] := val && 0xFFescribir un solo byte en la memoria
54SLOADA6 (se abre en una pestaña nueva)keystorage[key]leer palabra del almacenamiento
55SSTOREA7 (se abre en una pestaña nueva)key, val.storage[key] := valescribir palabra en el almacenamiento
56JUMP8dst.$pc := dst marca que pc solo se asigna si dst es un jumpdest válido
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pccontador de programa
59MSIZE2.len(mem)tamaño de la memoria en el contexto de ejecución actual, en bytes
5AGAS2.gasRemaining
5BJUMPDEST1marcar destino de salto válidoun destino de salto válido, por ejemplo, un destino de salto que no esté dentro de los datos de empuje (push)
5CTLOAD100keytstorage[key]leer palabra del almacenamiento transitorio (EIP-1153 (se abre en una pestaña nueva))
5DTSTORE100key, val.tstorage[key] := valescribir palabra en el almacenamiento transitorio (EIP-1153 (se abre en una pestaña nueva))
5EMCOPY3+3*words+A0 (se abre en una pestaña nueva)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]copiar memoria de un área a otra (EIP-5656 (se abre en una pestaña nueva))
5FPUSH02.uint8empujar el valor constante 0 a la pila
60PUSH13.uint8empujar valor de 1 byte a la pila
61PUSH23.uint16empujar valor de 2 bytes a la pila
62PUSH33.uint24empujar valor de 3 bytes a la pila
63PUSH43.uint32empujar valor de 4 bytes a la pila
64PUSH53.uint40empujar valor de 5 bytes a la pila
65PUSH63.uint48empujar valor de 6 bytes a la pila
66PUSH73.uint56empujar valor de 7 bytes a la pila
67PUSH83.uint64empujar valor de 8 bytes a la pila
68PUSH93.uint72empujar valor de 9 bytes a la pila
69PUSH103.uint80empujar valor de 10 bytes a la pila
6APUSH113.uint88empujar valor de 11 bytes a la pila
6BPUSH123.uint96empujar valor de 12 bytes a la pila
6CPUSH133.uint104empujar valor de 13 bytes a la pila
6DPUSH143.uint112empujar valor de 14 bytes a la pila
6EPUSH153.uint120empujar valor de 15 bytes a la pila
6FPUSH163.uint128empujar valor de 16 bytes a la pila
70PUSH173.uint136empujar valor de 17 bytes a la pila
71PUSH183.uint144empujar valor de 18 bytes a la pila
72PUSH193.uint152empujar valor de 19 bytes a la pila
73PUSH203.uint160empujar valor de 20 bytes a la pila
74PUSH213.uint168empujar valor de 21 bytes a la pila
75PUSH223.uint176empujar valor de 22 bytes a la pila
76PUSH233.uint184empujar valor de 23 bytes a la pila
77PUSH243.uint192empujar valor de 24 bytes a la pila
78PUSH253.uint200empujar valor de 25 bytes a la pila
79PUSH263.uint208empujar valor de 26 bytes a la pila
7APUSH273.uint216empujar valor de 27 bytes a la pila
7BPUSH283.uint224empujar valor de 28 bytes a la pila
7CPUSH293.uint232empujar valor de 29 bytes a la pila
7DPUSH303.uint240empujar valor de 30 bytes a la pila
7EPUSH313.uint248empujar valor de 31 bytes a la pila
7FPUSH323.uint256empujar valor de 32 bytes a la pila
80DUP13aa, aclonar el 1er valor en la pila
81DUP23_, aa, _, aclonar el 2do valor en la pila
82DUP33_, _, aa, _, _, aclonar el 3er valor en la pila
83DUP43_, _, _, aa, _, _, _, aclonar el 4to valor en la pila
84DUP53..., aa, ..., aclonar el 5to valor en la pila
85DUP63..., aa, ..., aclonar el 6to valor en la pila
86DUP73..., aa, ..., aclonar el 7mo valor en la pila
87DUP83..., aa, ..., aclonar el 8vo valor en la pila
88DUP93..., aa, ..., aclonar el 9no valor en la pila
89DUP103..., aa, ..., aclonar el 10mo valor en la pila
8ADUP113..., aa, ..., aclonar el 11vo valor en la pila
8BDUP123..., aa, ..., aclonar el 12vo valor en la pila
8CDUP133..., aa, ..., aclonar el 13vo valor en la pila
8DDUP143..., aa, ..., aclonar el 14vo valor en la pila
8EDUP153..., aa, ..., aclonar el 15vo valor en la pila
8FDUP163..., aa, ..., aclonar el 16vo valor en la pila
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 (se abre en una pestaña nueva)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (se abre en una pestaña nueva)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (se abre en una pestaña nueva)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (se abre en una pestaña nueva)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (se abre en una pestaña nueva)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFinválido
F0CREATEA9 (se abre en una pestaña nueva)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (se abre en una pestaña nueva)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (se abre en una pestaña nueva)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataigual que DELEGATECALL, pero no propaga el msg.sender y msg.value originales
F3RETURN0* (se abre en una pestaña nueva)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (se abre en una pestaña nueva)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (se abre en una pestaña nueva)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9inválido
FASTATICCALLAA (se abre en una pestaña nueva)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCinválido
FDREVERT0* (se abre en una pestaña nueva)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (se abre en una pestaña nueva)código de operación inválido designado - EIP-141 (se abre en una pestaña nueva)
FFSELFDESTRUCTAB (se abre en una pestaña nueva)addr.envía todo el ETH a addr; si se ejecuta en la misma transacción en la que se creó un contrato, destruye el contrato