Ir al contenido principal

Ayúdenos a actualizar esta página.

🌏

Disponemos de una nueva versión de esta página, pero solo está en inglés por ahora. Ayúdenos a traducir la última versión.

Traducir la página
Ver en inglés

¡Aquí no hay ningún error!🐛

Esta página no se está traduciendo. Por ahora hemos dejado esta página en inglés.

Transacciones

Última edición: , Invalid DateTime
Editar página
(opens in a new tab)

Las transacciones son instrucciones firmadas criptográficamente que se emiten desde cuentas. Una cuenta iniciará una transacción para actualizar el estado de la red Ethereum. La transacción más sencilla es transferir ETH de una cuenta a otra.

Requisitos previos

Para ayudarle a comprender mejor esta página, le recomendamos leer primero la sección sobre Cuentas, así como nuestra introducción a Ethereum.

¿Qué es una transacción?

Una transacción de Ethereum hace referencia a una acción iniciada por una cuenta de propiedad externa, en otras palabras, una cuenta administrada por una persona, no un contrato. Por ejemplo, si Bob le envía 1 ETH a Alice, este debe adeudarse de la cuenta de Bob y acreditarse en la cuenta de Alice. Esta acción según la que se modifica el estado de la red tiene lugar en una transacción.

Diagrama que muestra cómo una transacción provoca cambios de estado (opens in a new tab) Diagrama adaptado de Ethereum EVM ilustrado(opens in a new tab)

Las transacciones, que modifican el estado de la EVM, se deben transmitir a toda la red. Cualquier nodo puede transmitir una solicitud de una transacción que se va ejecutar en la EVM; a continuación, un minero ejecutará la transacción y propagará la modificación de estado derivada al resto de la red.

Las transacciones implican el pago de una comisión y deben minarse para convertirse en transacciones válidas. Para simplificar este resumen, abarcaremos las comisiones de gas y el minado por separado.

Una transacción enviada incluye la siguiente información:

  • destinatario: La transacción destinataria (en caso de que sea una cuenta de propiedad externa, la transacción transferirá valor. Si se trata de un contrato, la transacción ejecutará el código del contrato)
  • firma: Identificador del remitente. Se genera cuando, mediante la clave privada, se firma la transacción y se confirma que el remitente la ha autorizado
  • valor: Cantidad de ETH que el remitente transfiere al destinatario (en WEI, una denominación de ETH)
  • datos: Campo opcional en el que se incluyen datos arbitrarios.
  • LímiteDeGas: Cantidad máxima de unidades de gas que puede consumir la transacción. Las unidades de gas representan pasos computacionales
  • maxPriorityFeePerGas: la cantidad máxima de gas que se incluirá como recompensa para el minero
  • maxFeePerGas: la cantidad mínima de gas que se quiere pagar por la transacción (incluidas baseFeePerGas y maxPriorityFeePerGas)

El gas es una referencia al cálculo necesario para que el minero procese la transacción. Los usuarios tienen que pagar una comisión por ese cálculo. Los valores gasLimit y maxPriorityFeePerGas determinan la comisión por transacción máxima que se le paga al minero. Mas información sobre el gas.

El objeto de la transacción se verá de la siguiente forma:

1{
2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
4 gasLimit: "21000",
5 maxFeePerGas: "300",
6 maxPriorityFeePerGas: "10",
7 nonce: "0",
8 value: "10000000000"
9}
10
Mostrar todo
📋 Copiar

Es necesario firmar este objeto mediante la clave privada del emisor. De esta forma, se demuestra que la transacción solo pudo haberla enviado el emisor y que no se envió de forma fraudulenta.

Un cliente de Ethereum como Geth gestionará el proceso de firma.

Ejemplo de una llamada JSON-RPC(opens in a new tab):

1{
2 "id": 2,
3 "jsonrpc": "2.0",
4 "method": "account_signTransaction",
5 "params": [
6 {
7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
8 "gas": "0x55555",
9 "maxFeePerGas": "0x1234",
10 "maxPriorityFeePerGas": "0x1234",
11 "input": "0xabcd",
12 "nonce": "0x0",
13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
14 "value": "0x1234"
15 }
16 ]
17}
18
Mostrar todo
📋 Copiar

Ejemplo de respuesta:

1{
2 "jsonrpc": "2.0",
3 "id": 2,
4 "result": {
5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
6 "tx": {
7 "nonce": "0x0",
8 "maxFeePerGas": "0x1234",
9 "maxPriorityFeePerGas": "0x1234",
10 "gas": "0x55555",
11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
12 "value": "0x1234",
13 "input": "0xabcd",
14 "v": "0x26",
15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
18 }
19 }
20}
21
Mostrar todo
📋 Copiar
  • la propiedad raw es la transacción firmada en Recursive Length Prefix (RLP)
  • la propiedad tx es la transaccion firmada en formato JSON

Mediante el hash de la firma, se puede demostrar criptográficamente que la transacción proviene del emisor y que se envió a la red.

The data field

The vast majority of transactions access a contract from an externally-owned account. Most contracts are written in Solidity and interpret their data field in accordance with the application binary interface (ABI).

The first four bytes specify which function to call, using the hash of the function's name and arguments. You can sometimes identify the function from the selector using this database(opens in a new tab).

The rest of the calldata is the arguments, encoded as specified in the ABI specs(opens in a new tab).

For example, lets look at this transaction(opens in a new tab). Use Click to see More to see the calldata.

The function selector is 0xa9059cbb. There are several known functions with this signature(opens in a new tab). In this case the contract source code(opens in a new tab) has been uploaded to Etherscan, so we know the function is transfer(address,uint256).

The rest of the data is:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4
3

According to the ABI specifications, integer values (such as addresses, which are 20-byte integers) appear in the ABI as 32-byte words, padded with zeros in the front. So we know that the to address is 4f6742badb049791cd9a37ea913f2bac38d01279(opens in a new tab). The value is 0x3b0559f4 = 990206452.

Tipos de transacciones

En Ethereum hay algunos tipos diferentes de transacciones:

  • Transacciones regulares: una transacción desde una cartera a otra.
  • Transacciones de despliegue de contratos: una transacción sin la dirección «a», donde el campo de datos se usa para el código de contrato.
  • Execution of a contract: a transaction that interacts with a deployed smart contract. In this case, 'to' address is the smart contract address.

Sobre el gas

Tal y se ha mencionado, las transacciones necesitan gas para ejecutarse. Las transacciones de transferencia simple requieren 21.000 unidades de gas.

De modo que, para que Bob pueda enviar a Alice 1 ETH con un coste de baseFeePerGas de 190 gwei y de maxPriorityFeePerGas de 10 gwei, Bob tendrá que pagar la siguiente comisión:

1(190 + 10) * 21000 = 4,200,000 gwei
2--or--
30.0042 ETH
4

A la cuenta de Bob se le restarán -1,0042 ETH

A la cuenta de Alice se añadirán +1,0 ETH

La comisión base que se quemará será de 0,00399 ETH

El minero se queda con la propina (+0.000210 ETH)

El gas también es necesario para cualquier interacción del contrato inteligente.

Diagrama que muestra la devolución del gas no utilizado. (opens in a new tab) Diagrama adaptado de Ethereum EVM ilustrado(opens in a new tab)

Cualquier gas no utilizado en una transacción es reembolsado a la cuenta de usuario.

Ciclo de vida de la transacción

Una vez que la transacción ha sido enviada ocurre lo siguiente:

  1. Una vez que envíes una transacción, la criptografía genera un hash de transacción: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. A continuación, la transacción se transmite a la red e incluida en un pool con muchas otras transacciones.
  3. Un minero debe elegir tu transacción e incluirla en un bloque para verificar la transacción y considerarla "exitosa".
    • Puede que deba esperar en esta fase si la red está ocupada y los mineros no son capaces de mantenerse al día.
  4. Tu transacción recibirá «confirmaciones». El número de confirmaciones indica el número de bloques creados desde el bloque en el cual se incluyó su transacción. Cuanto mayor sea el número, mayor será la certeza de que la red procesó y reconoció la transacción.
    • Los bloques recientes pueden sufrir un proceso de reorganización, con lo que dará la impresión de que la transacción ha fallado. Sin embargo, es posible que la transacción todavía sea válida pero que se incluya en otro bloque.
    • La probabilidad de que se lleve a cabo una reorganización disminuye con cada bloque minado posterior, es decir, cuanto mayor es el número de confirmaciones, más inmutable es la transacción.

Una demostración visual

Observa a Austin mientras te guía por las transacciones, el gas y la minería.

Typed Transaction Envelope

Inicialmente, Ethereum tenía un formato único para las transacciones. Cada transacción contenía un nonce, un precio de gas, un límite de gas, una dirección, un importe, datos, y v, r y s. Estos campos se codifican en RLP, y tiene esta apariencia:

RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])

Ethereum ha mejorado y ahora es compatible con múltiples tipos de transacciones, lo que permite que se implementen nuevas características como listas de acceso y EIP-1559(opens in a new tab) sin afectar los formatos de transacción antiguos.

EIP-2718: Typed Transaction Envelope(opens in a new tab) se refiere a un tipo de transacción que funciona como un sobre para futuros tipos de transacción.

El EIP-2718 es un nuevo sobre generalizado para transacciones escritas. En el nuevo modelo, las transacciones se interpretan de la siguiente forma:

TransactionType || TransactionPayload

Donde los nuevos campos indican:

  • TransactionType - un número entre 0 y 0x7f, para un total de 128 posibles tipos de transacción.
  • TransactionPayload - una matriz de bytes arbitraria definida según el tipo de transacción.

Más información

¿Conoce algún recurso en la comunidad que le haya servido de ayuda? Edita esta página y añádelo.

¿Le ha resultado útil este artículo?