Transações
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.
(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çãononce
: um contador de incremento sequencial que indica o número da transação da contavalue
: 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áriosgasLimit
: a quantidade máxima de gás que pode ser consumida pela transação. As unidades de gás representam etapas de cálculomaxPriorityFeePerGas
– a quantidade máxima de gás a ser incluída como gorjeta para o validadormaxFeePerGas
: a quantidade máxima de gás disposta a ser paga pela transação (inclusive debaseFeePerGas
emaxPriorityFeePerGas
)
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}10Exibir tudoCopiar
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}18Exibir tudoCopiar
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}21Exibir tudoCopiar
- 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 é:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f43
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 gwei2--ou--30,0042 ETH4
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.
(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:
- Depois de enviar uma transação, a criptografia gera um hash de transação:
0x97d99bc77292111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
- A transação é então transmitida para a rede e incluída em um pool com muitas outras transações.
- Um validador deve escolher sua transação e incluí-la em um bloco para verificar a transação e considerá-la "bem-sucedida".
- 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!