Pular para o conteúdo principal

Ajude a atualizar esta página

🌏

Há uma nova versão desta página mas, no momento, ela está apenas em inglês. Ajude-nos a traduzir a última versão.

Traduzir página
Visualizar em inglês

Não há bugs aqui!🐛

Esta página não está sendo traduzida. Ela foi intencionalmente deixada em inglês, por enquanto.

Transações

Última edição: , Invalid DateTime
Editar Página
(opens in a new tab)

Transações são instruções assinadas criptograficamente de contas. Uma conta iniciará uma transação para atualizar o estado da rede Ethereum. A transação mais simples é transferir ETH de uma conta para outra.

Pré-Requisitos

Mas para ajudá-lo a entender melhor esta página, recomendamos que você primeiro leia Contas, Transaçõese nossa introdução ao Ethereum.

O que é uma transação?

Uma transação Ethereum refere-se a uma ação iniciada por uma conta de propriedade externa, ou seja, uma conta gerenciada por um ser humano, não um contrato. Por exemplo, se Bob enviar a Alice 1 ETH, a conta de Bob deverá ser debitada e a de Alice deverá ser creditada. Esta ação de mudança de estado ocorre no âmbito de uma transação.

Diagrama mostrando uma transação que causa mudança de estado (opens in a new tab) Diagrama adaptado de Ethereum EVM ilustrado(opens in a new tab)

Transações que alteram o estado da EVM precisam ser transmitidas para toda a rede. Qualquer nó pode transmitir uma solicitação para que uma transação seja executada na EVM; depois que isso acontecer, um validador executará a transação e propagará a mudança de estado resultante para o restante da rede.

As transações exigem uma taxa e devem ser incluídas em um bloco validado. Para tornar esta visão geral mais simples, cobriremos as taxas de gás e validação em outro lugar.

Uma transação enviada inclui as seguintes informações:

  • recipient: o endereço de recebimento (se uma conta de propriedade externa, a transação transferirá o valor. Se uma conta de contrato, a transação executará o código do contrato)
  • signature: o identificador do remetente. Isto é gerado quando a chave privada do remetente assina a transação e confirma que o remetente autorizou esta transação
  • nonce: um contador de incremento sequencial que indica o número da transação da conta
  • value: quantidade de ETH para transferir do remetente para o destinatário (em WEI, uma denominação de ETH)
  • data: campo opcional para incluir dados arbitrários
  • gasLimit: a quantidade máxima de gás que pode ser consumida pela transação. As unidades de gás representam etapas de cálculo
  • maxPriorityFeePerGas – a quantidade máxima de gás a ser incluída como gorjeta para o validador
  • maxFeePerGas: a quantidade máxima de gás disposta a ser paga pela transação (inclusive de baseFeePerGas e maxPriorityFeePerGas)

Gás é uma referência ao cálculo necessário para processar a transação por um validador. Os usuários têm que pagar uma taxa por este cálculo. O gasLimit e o maxPriorityFeePerGas determinam a taxa máxima de transação paga ao validador. Mais sobre gás.

O objeto da transação ficará um pouco assim:

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

Mas um objeto de transação deve ser assinado usando a chave privada do remetente. Isso prova que a transação só poderia ter vindo do remetente e não foi enviada fraudulentamente.

Um cliente Ethereum como o Geth irá lidar com este processo de assinatura.

Exemplo de chamada 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
Exibir tudo
📋 Copiar

Exemplo de resposta:

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
Exibir tudo
📋 Copiar
  • o raw é a transação assinada em Recursive Length Prefix (RLP) na forma codificada
  • tx é a transação assinada no formato JSON

Com o hash da assinatura, a transação pode ser provada criptograficamente de que veio do remetente e enviada para a rede.

O campo de dados

A grande maioria das transações acessa um contrato de uma conta de propriedade externa. A maioria dos contratos é escrita em Solidity e interpreta seus campos de dados de acordo com a interface binária do aplicativo (ABI).

Os primeiros quatro bytes especificam qual função chamar, usando o hash do nome e dos argumentos da função. Às vezes, você pode identificar a função do seletor usando este banco de dados(opens in a new tab).

O restante dos dados da chamada são os argumentos, codificado conforme especificado nas especificações ABI(opens in a new tab).

Por exemplo, vejamos esta transação(opens in a new tab). Use Clique para ver mais para conferir os dados de chamada.

O seletor de função é 0xa9059cbb. Existem várias funções conhecidas com esta assinatura(opens in a new tab). Nesse caso, o código-fonte do contrato(opens in a new tab) foi carregado para o Etherscan, então sabemos que a função é transfer(address, uint256).

O resto dos dados é:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4
3

De acordo com as especificações da ABI, valores inteiros (como endereços, que são inteiros de 20 bytes) aparecem na ABI como palavras de 32 bytes, preenchidos com zeros na frente. Portanto, sabemos que o endereço para é 4f6742badb049791cd9a37ea913f2bac38d01279(opens in a new tab). O valor é 0x3b0559f4 = 990206452.

Tipos de transações

No Ethereum existem alguns tipos diferentes de transações:

  • Transações regulares: uma transação de uma conta para outra.
  • Transações de implantação do contrato: uma transação sem um endereço 'para', onde o campo de dados é usado para o código do contrato.
  • Execução de um contrato: uma transação que interage com um contrato inteligente implantado. Nesse caso, o endereço "para" é o endereço do contrato inteligente.

Sobre gás

Como mencionado, as transações custam gás para serem executadas. Transações de transferência simples requerem 21.000 unidades de gás.

Então para Bob enviar a Alice 1 ETH para baseFeePerGas de 190 gwei e maxPriorityFeePerGas de 10 gwei, Bob precisará pagar a seguinte taxa:

1(190 + 10) * 21000 = 4.200.000 gwei
2--ou--
30,0042 ETH
4

A conta de Bob será debitada -1,0042 ETH (1 ETH para Alice + 0,0042 ETH em taxas de gás)

A conta de Alice será creditada +1,0 ETH

A taxa base queimará -0,00399 ETH

O validador mantém a gorjeta de +0,000210 ETH

É necessário gás para qualquer interação de contrato inteligente também.

Diagrama que mostra como o gás não utilizado é reembolsado (opens in a new tab) Diagrama adaptado do Ethereum EVM ilustrado(opens in a new tab)

Qualquer gás não usado em uma transação é reembolsado para a conta do usuário.

Ciclo de vida de transação

Quando uma transação é enviada, acontece o seguinte:

  1. Depois de enviar uma transação, a criptografia gera um hash de transação: 0x97d99bc77292111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. A transação é então transmitida para a rede e incluída em um pool com muitas outras transações.
  3. Um validador deve escolher sua transação e incluí-la em um bloco para verificar a transação e considerá-la "bem-sucedida".
  4. Com o passar do tempo, o bloco que contém sua transação será atualizado para "justificado" e depois "finalizado". Essas atualizações tornam muito mais certo de que sua transação foi bem-sucedida e nunca será alterada. Uma vez que um bloco é "finalizado", ele só pode ser alterado por um ataque que custaria muitos bilhões de dólares.

Uma demonstração visual

Assista Austin mostrar as transações, gás e mineração.

Envelope de transação digitado

O Ethereum originalmente tinha um formato para transações. Cada transação possuía um emissor, custo de "queima", parâmetro de "queima", endereçamentos, valores, dados, v, r, e s. Estas categorias são encriptadas em RLP para se parecer com algo assim:

RLP ([emissor, taxa de "queima", parâmetros de "queima", destino, valor, dados, v, r, s])

O Ethereum evoluiu para apoiar vários tipos de transações, permitindo que novos recursos, como listas de acesso e EIP-1559(opens in a new tab) sejam implementados sem que isso afete os modelos transacionais precursores.

EIP-2718: Carta de Transações Redigidas(opens in a new tab) trata-se de um tipo de transação que é um "envelope" para os tipos de transações futuras.

EIP-2718 é um novo envelope generalizado para transações tipadas. No novo padrão, as transações são interpretadas como:

TransactionType ├TransactionPayload

Onde os campos são definidos como:

  • TransactionType: um número entre 0 e 0x7f, para um total de 128 tipos de transações possíveis.
  • TransactionPayload: um array de bytes arbitrário definido pelo tipo de transação.

Leitura adicional

Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione-o!

Este artigo foi útil?