Ir al contenido principal
Change page

Opcodes para la EVM

Última actualización de la página: 11 de septiembre de 2025

Presentación

Esta es una versión actualizada de la página de referencia de EVM en wolflo/evm-opcodesopens in a new tab. También extraído del Yellow Paperopens in a new tab, del Jello Paperopens in a new tab y de la implementación de gethopens in a new tab. Pretende ser una referencia accesible, pero no es particularmente rigurosa. Si quiere asegurarse a ciencia cierta y conocer todos los casos extremos, es aconsejable utilizar el Jello Paper o una implementación cliente.

¿Busca una referencia interactiva? Consulte evm.codesopens in a new tab.

Para las operaciones con costes de gas dinámicos, consulte gas.mdopens in a new tab.

💡 Consejo rápido: para ver líneas enteras, utilice [shift] + scroll para desplazarse horizontalmente en el escritorio.

PilaNombreGasPila inicialPila resultanteMem / AlmacenamientoNotas
00DETENER0detener ejecución
01ADD3a, ba + badición (u)int256 módulo 2**256
02MUL5a, ba * bmultiplicación (u)int256 módulo 2**256
03SUB3a, ba - bsustracción (u)int256 módulo 2**256
04DIV5a, ba // bdivisión uint256
05SDIV5a, ba // bdivisión int256
06MOD5a, ba % bmódulo uint256
07SMOD5a, ba % bmódulo int256
08ADDMOD8a, b, N(a + b) % Nadición (u)int256 módulo N
09MULMOD8a, b, N(a * b) % Nmultiplicación (u)int256 módulo N
0AEXPA1opens in a new taba, ba ** bexponenciación uint256 módulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)extensión de signoopens in a new tab de x desde (b+1) bytes a 32 bytes
0C-0Finválido
10LT3a, ba < buint256 menor que
11GT3a, ba > buint256 mayor que
12SLT3a, ba < bint256 menor que
13SGT3a, ba > bint256 mayor que
14EQ3a, ba == bigualdad (u)int256
15ISZERO3aa == 0(u)int256 es cero
16AND3a, ba && bAND a nivel de bits
17OR3a, b`a \\b`
18XOR3a, ba ^ bXOR a nivel de bits
19NOT3a~aNOT a nivel de bits
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFel i-ésimo byte 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
20KECCAK256A2opens in a new tabost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Finválido
30ADDRESS2.address(this)dirección del contrato en ejecución
31BALANCEA5opens in a new tabaddraddr.balancesaldo, en wei
32ORIGIN2.tx.origindirección que originó la transacción
33CALLER2.msg.senderdirección del remitente del mensaje
34CALLVALUE2.msg.valuevalor del mensaje, en wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]leer palabra de los datos del mensaje en el índice idx
36CALLDATASIZE2.len(msg.data)longitud de los datos del mensaje, en bytes
37CALLDATACOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]copiar datos del mensaje
38CODESIZE2.len(this.code)longitud del código del contrato en ejecución, en bytes
39CODECOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]copiar el bytecode del contrato en ejecución
3AGASPRICE2.tx.gaspriceprecio del gas de la transacción, en wei por unidad de gas **opens in a new tab
3BEXTCODESIZEA5opens in a new tabaddrlen(addr.code)tamaño del código en la dirección, en bytes
3CEXTCODECOPYA4opens in a new tabaddr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]copiar código desde addr
3DRETURNDATASIZE2.sizetamaño de los datos devueltos de la última llamada externa, en bytes
3ERETURNDATACOPYA3opens in a new tabdstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]copiar datos devueltos de la última llamada externa
3FEXTCODEHASHA5opens in a new tabaddrhashhash = 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.randomness beaconbaliza de aleatoriedad
45GASLIMIT2.block.gaslimitlímite de gas del bloque actual
46CHAINID2.chain_idinserta el ID de la cadenaopens in a new tab actual en 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-4844opens in a new tab
4ABLOBBASEFEE2.block.blobbasefeetarifa base de blob del bloque actual (EIP-7516opens in a new tab)
4B-4Finválido
50POP2_anon.elimina el elemento de la parte superior de la pila y lo descarta
51MLOAD3*opens in a new tabostmem[ost:ost+32]leer palabra de la memoria en el desplazamiento ost
52MSTORE3*opens in a new tabost, val.mem[ost:ost+32] := valescribir una palabra en la memoria
53MSTORE83*opens in a new tabost, val.mem[ost] := val && 0xFFescribir un solo byte en la memoria
54SLOADA6opens in a new tabkeystorage[key]leer palabra del almacenamiento
55SSTOREA7opens in a new tabkey, val.storage[key] := valescribir palabra en el almacenamiento
56JUMP8dst.$pc := dst indica que a pc solo se le asigna un valor si dst es un destino de salto 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 se encuentra dentro de los datos de inserción
5CTLOAD100keytstorage[key]leer palabra del almacenamiento transitorio (EIP-1153opens in a new tab)
5DTSTORE100key, val.tstorage[key] := valescribir palabra en el almacenamiento transitorio (EIP-1153opens in a new tab)
5EMCOPY3+3*words+A0opens in a new tabdstOst, ost, len.mem[dstOst] := mem[ost:ost+len]copiar memoria de un área a otra (EIP-5656opens in a new tab)
5EPUSH02.uint8impulsar el valor constante 0 a la pila
60PUSH13.uint8insertar un valor de 1 byte en la pila
61PUSH23.uint16insertar un valor de 2 bytes en la pila
62PUSH33.uint24insertar un valor de 3 bytes en la pila
63PUSH43.uint32insertar un valor de 4 bytes en la pila
64PUSH53.uint40insertar un valor de 5 bytes en la pila
65PUSH63.uint48insertar un valor de 6 bytes en la pila
66PUSH73.uint56insertar un valor de 7 bytes en la pila
67PUSH83.uint64insertar un valor de 8 bytes en la pila
68PUSH93.uint72insertar un valor de 9 bytes en la pila
69PUSH103.uint80insertar un valor de 10 bytes en la pila
6APUSH113.uint88insertar un valor de 11 bytes en la pila
6BPUSH123.uint96insertar un valor de 12 bytes en la pila
6CPUSH133.uint104insertar un valor de 13 bytes en la pila
6DPUSH143.uint112insertar un valor de 14 bytes en la pila
6EPUSH153.uint120insertar un valor de 15 bytes en la pila
6FPUSH163.uint128insertar un valor de 16 bytes en la pila
70PUSH173.uint136insertar un valor de 17 bytes en la pila
71PUSH183.uint144insertar un valor de 18 bytes en la pila
72PUSH193.uint152insertar un valor de 19 bytes en la pila
73PUSH203.uint160insertar un valor de 20 bytes en la pila
74PUSH213.uint168insertar un valor de 21 bytes en la pila
75PUSH223.uint176insertar un valor de 22 bytes en la pila
76PUSH233.uint184insertar un valor de 23 bytes en la pila
77PUSH243.uint192insertar un valor de 24 bytes en la pila
78PUSH253.uint200insertar un valor de 25 bytes en la pila
79PUSH263.uint208insertar un valor de 26 bytes en la pila
7APUSH273.uint216insertar un valor de 27 bytes en la pila
7BPUSH283.uint224insertar un valor de 28 bytes en la pila
7CPUSH293.uint232insertar un valor de 29 bytes en la pila
7DPUSH303.uint240insertar un valor de 30 bytes en la pila
7EPUSH313.uint248insertar un valor de 31 bytes en la pila
7FPUSH323.uint256insertar un valor de 32 bytes en la pila
80DUP13aa, aclonar el primer valor en la pila
81DUP23_, aa, _, aclonar el segundo valor en la pila
82DUP33_, _, aa, _, _, aclonar el tercer valor en la pila
83DUP43_, _, _, aa, _, _, _, aclonar el cuarto valor en la pila
84DUP53..., aa, ..., aclonar el quinto valor en la pila
85DUP63..., aa, ..., aclonar el sexto valor en la pila
86DUP73..., aa, ..., aclonar el séptimo valor en la pila
87DUP83..., aa, ..., aclonar el octavo valor en la pila
88DUP93..., aa, ..., aclonar el noveno valor en la pila
89DUP103..., aa, ..., aclonar el décimo valor en la pila
8ADUP113..., aa, ..., aclonar el undécimo valor en la pila
8BDUP123..., aa, ..., aclonar el duodécimo valor en la pila
8CDUP133..., aa, ..., aclonar el decimotercer valor en la pila
8DDUP143..., aa, ..., aclonar el decimocuarto valor en la pila
8EDUP153..., aa, ..., aclonar el decimoquinto valor en la pila
8FDUP163..., aa, ..., aclonar el decimosexto 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
A0LOG0A8opens in a new tabost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8opens in a new tabost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8opens in a new tabost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8opens in a new tabost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8opens in a new tabost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFinválido
F0CREATEA9opens in a new tabval, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAAopens in a new tabgas, addr, val, argOst, argLen, retOst, retLenéxitomem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAAopens in a new tabgas, addr, val, argOst, argLen, retOst, retLenéxitomem[retOst:retOst+retLen-1] = returndataigual que DELEGATECALL, pero no propaga los valores originales msg.sender y msg.value
F3RETURN0*opens in a new tabost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAAopens in a new tabgas, addr, argOst, argLen, retOst, retLenéxitomem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9opens in a new tabval, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9inválido
FASTATICCALLAAopens in a new tabgas, addr, argOst, argLen, retOst, retLenéxitomem[retOst:retOst+retLen-1] := returndata
FB-FCinválido
FDREVERT0*opens in a new tabost, len.revert(mem[ost:ost+len-1])
FEINVALIDAFopens in a new tabcódigo de operación inválido designado - EIP-141opens in a new tab
FFSELFDESTRUCTABopens in a new tabaddr.envía todos los ETH a addr; si se ejecuta en la misma transacción en la que se creó un contrato, lo destruye

¿Le ha resultado útil este artículo?