Pular para conteúdo

Transações Ethereum

Uma transação Ethereum debita diretamente o saldo da conta de um remetente e credita a operação de um destinatário (ou, para uma chamada contratual, desencadeia a execução de código) estruturalmente diferente das transações que consomem UTXO abrangidas Transações de BitcoinEste capítulo abrange os campos de transação e o tipo de transação que tem sido padrão da Ethereum desde 2021.

Campos principais

  • nonce: o número atual de transações do remetente, coberto EOAs.
  • para: o endereço do destinatário, ou vazio para uma transação de criação de contratos (ver Criação de Contratos).
  • valor: a quantidade de éter (em wei) a transferir.
  • dados: dados de byte arbitrários, usados para codificar uma chamada de função e seus argumentos ao chamar um contrato (ver Contrato ABI), ou código de inicialização do contrato para uma transação de criação.
  • gasLimit: o montante máximo de gás o remetente está disposto a ter esta transação consumida.
  • assinatura (v, r, s), a assinatura ECDSA autorizando a transação, cobrindo tudo o mais na transação.
  • chainId: em que rede esta transação é válida (ver IDs de cadeia), impedindo que uma transação assinada para uma rede seja reproduzida em outra.

Tipos de transação: legado versus EIP-1559

Ethereum usou mais de um formato de transação ao longo de seu histórico, distinguido por um tipo bytes:

  • Tipo 0 (legado): o formato original, usando um único gasPrice campo, o remetente especifica exatamente quanto eles estão dispostos a pagar por unidade de gás, e (antes EIP-1559) o montante inteiro vai para o minerador/validador que inclui a transação.
  • Tipo 2 (EIP-1559)A Comissão adoptou, em 18 de Atualização de Londres (5 de agosto de 2021) e o formato padrão desde então, substituindo o single gasPrice com dois campos separados (maxFeePerGas e maxPriorityFeePerGas) alimentação para o mecanismo de base-fee-and-tip Preço do gás e taxas.

Exemplo: construir e inspecionar os campos de uma transação com viem

import { parseEther, parseGwei } from "viem";

const transaction = {
  to: "0x0000000000000000000000000000000000dEaD" as const, // a conventional "burn" address
  value: parseEther("0.01"),
  maxFeePerGas: parseGwei("20"),
  maxPriorityFeePerGas: parseGwei("1.5"),
  gas: 21_000n, // the fixed cost of a simple ETH transfer — see chapters/ethereum/gas.md
};

console.log("value (wei):", transaction.value.toString());
console.log("maxFeePerGas (wei):", transaction.maxFeePerGas.toString());
console.log("maxPriorityFeePerGas (wei):", transaction.maxPriorityFeePerGas.toString());

Resultado verificado da execução deste código exato:

value (wei): 10000000000000000
maxFeePerGas (wei): 20000000000
maxPriorityFeePerGas (wei): 1500000000

Este exemplo específico só constrói e mostra os campos localmente (parseEther/parseGwei são funções de conversão de unidade pura), por isso não requer acesso à rede, ao contrário do exemplo de leitura de conta em Contas Ethereum.

Conceitos errôneos comuns

Uma transação Ethereum data campo não é a mesma coisa que um script de transação do Bitcoin. É tipicamente dados de chamada de função codificados pelo ABI interpretados pelo EVM ao executar um contrato, um mecanismo fundamentalmente diferente dos scripts de bloqueio/desbloqueamento baseados em pilhas do Bitcoin (veja Bitcoin Script), embora ambos sirvam um papel amplamente análogo "especifique o que esta transação está instruindo".

Definir uma alta gasLimit não significa que uma transação irá necessariamente consumir tanto gás. É um teto, não um alvo; uma simples transferência de ETH consome exatamente 21.000 gás, independentemente de um limite configurado superior, e qualquer gás não utilizado (até o limite) não é carregado (ver Gás).

Outras leituras


← Anterior: Contas de contrato · Voltar para Ethereum · Próximo: Gás →