Saltar al contenido principal
Change page

Códigos de operación para la EVM

Descripción general

Esta es una versión actualizada de la página de referencia de la EVM en wolflo/evm-opcodes (opens in a new tab). También se basa en el Libro Amarillo (opens in a new tab), el Jello Paper (opens in a new tab) y la implementación de geth (opens in a new tab). Su objetivo es ser una referencia accesible, pero no es particularmente rigurosa. Si desea tener certeza de la exactitud y conocer cada caso extremo, es aconsejable utilizar el Jello Paper o la implementación de un cliente.

¿Busca una referencia interactiva? Eche un vistazo a evm.codes (opens in a new tab).

Para operaciones con costos de gas dinámicos, consulte gas.md (opens in a new tab).

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

PilaNombreGasPila inicialPila resultanteMemoria / AlmacenamientoNotas
00STOP0detener la 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 (opens in a new tab)a, ba ** bexponenciación de uint256 módulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)extensión de signo (opens in a new tab) de x desde (b+1) bytes a 32 bytes
0C-0Finválido
10LT3a, ba < bmenor que de uint256
11GT3a, ba > bmayor que de uint256
12SLT3a, ba < bmenor que de int256
13SGT3a, ba > bmayor que de int256
14EQ3a, ba == bigualdad de (u)int256
15ISZERO3aa == 0es cero de (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 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 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Finválido
30ADDRESS2.address(this)dirección del contrato en ejecución
31BALANCEA5 (opens in a new tab)addraddr.balancesaldo, en Wei
32ORIGIN2.tx.origindirección que originó la tx
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
37CALLDATACOPYA3 (opens in a new tab)dstOst, 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
39CODECOPYA3 (opens in a new tab)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 ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)tamaño del código en la dirección, en bytes
3CEXTCODECOPYA4 (opens in a new tab)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 de la última llamada externa, en bytes
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]copiar datos devueltos de la última llamada externa
3FEXTCODEHASHA5 (opens in a new tab)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.randomness beaconbaliza de aleatoriedad
45GASLIMIT2.block.gaslimitlímite de gas del bloque actual
46CHAINID2.chain_idempujar el id de la cadena (opens in a new tab) 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 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeetarifa base del blob del bloque actual (EIP-7516 (opens in a new tab))
4B-4Finválido
50POP2_anon.eliminar el elemento superior de la pila y descartarlo
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]leer palabra de la memoria en el desplazamiento ost
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valescribir una palabra en la memoria
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFescribir un solo byte en la memoria
54SLOADA6 (opens in a new tab)keystorage[key]leer palabra del almacenamiento
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valescribir palabra en el almacenamiento
56JUMP8dst.$pc := dst marca que pc solo se asigna 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 esté dentro de los datos de push
5CTLOAD100keytstorage[key]leer palabra del almacenamiento transitorio (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valescribir palabra en el almacenamiento transitorio (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]copiar memoria de un área a otra (EIP-5656 (opens in a new tab))
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 1.er valor en la pila
81DUP23_, aa, _, aclonar el 2.º valor en la pila
82DUP33_, _, aa, _, _, aclonar el 3.er valor en la pila
83DUP43_, _, _, aa, _, _, _, aclonar el 4.º valor en la pila
84DUP53..., aa, ..., aclonar el 5.º valor en la pila
85DUP63..., aa, ..., aclonar el 6.º valor en la pila
86DUP73..., aa, ..., aclonar el 7.º valor en la pila
87DUP83..., aa, ..., aclonar el 8.º valor en la pila
88DUP93..., aa, ..., aclonar el 9.º valor en la pila
89DUP103..., aa, ..., aclonar el 10.º valor en la pila
8ADUP113..., aa, ..., aclonar el 11.º valor en la pila
8BDUP123..., aa, ..., aclonar el 12.º valor en la pila
8CDUP133..., aa, ..., aclonar el 13.º valor en la pila
8DDUP143..., aa, ..., aclonar el 14.º valor en la pila
8EDUP153..., aa, ..., aclonar el 15.º valor en la pila
8FDUP163..., aa, ..., aclonar el 16.º 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 (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)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndataigual que DELEGATECALL, pero no propaga el msg.sender ni el msg.value originales
F3RETURN0* (opens in a new tab)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[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)gas, addr, argOst, argLen, retOst, retLensuccessmem[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)código de operación inválido designado - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)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