Nonces duráveis

Resumo

As transações com nonce durável substituem o blockhash recente por um valor de nonce armazenado, removendo a janela de expiração de 150 slots para uma transação. Isso permite a assinatura offline e o envio atrasado.

Os nonces duráveis podem ser descontinuados numa versão futura. Consulte a discussão SIMD para mais detalhes.

Nonces duráveis

Uma transação com nonce durável substitui o blockhash recente por um valor de nonce armazenado, removendo a janela de expiração de 150 slots. Isso permite a assinatura offline e o envio atrasado.

Como funcionam as transações com nonce

Uma conta de nonce é uma conta pertencente ao System Program que armazena um valor State::Initialized contendo três campos: uma authority pubkey (quem pode avançar o nonce), um valor de nonce durável (um hash derivado de um blockhash recente) e lamports por assinatura (a taxa de transação quando o nonce foi avançado pela última vez).

Para usar um nonce durável:

  1. Crie e inicialize uma conta de nonce usando CreateAccount + InitializeNonceAccount
  2. Construa a transação com AdvanceNonceAccount como a primeira instrução e o valor do nonce como recent_blockhash
  3. Assine a transação (pode ser feito offline, pois o nonce não expira)
  4. Envie quando estiver pronto

Detecção de nonce

O runtime deteta transações com nonce verificando se a primeira instrução (índice NONCED_TX_MARKER_IX_INDEX = 0) é uma chamada ao System Program com a instrução AdvanceNonceAccount. A conta de nonce deve ser a primeira conta dessa instrução e deve ser gravável. Consulte get_durable_nonce.

Fluxo de validação de nonce

Quando o recent_blockhash de uma transação não é encontrado no BlockhashQueue, o validador verifica se é uma transação nonce válida através de check_transaction_age:

  1. O durable_nonce armazenado do nonce deve diferir do próximo nonce durável (derivado do blockhash atual). Isto garante que o nonce ainda não foi utilizado neste bloco
  2. A conta nonce deve ser carregada e deve ser analisada como State::Initialized
  3. O durable_nonce armazenado deve corresponder ao recent_blockhash da transação

A verificação de assinatura da autoridade do nonce é realizada posteriormente (validate_transaction_nonce).

Se todas as verificações forem bem-sucedidas, o nonce é avançado para o próximo valor de nonce durável antes do início da execução. Em caso de falha na execução, o nonce avançado e o pagador de taxas com taxa deduzida ainda são confirmados (prevenindo repetição enquanto cobra taxas).

Comportamento de falha do nonce

Se uma transação nonce falhar na validação (nonce já utilizado, autoridade não assinou, conta não encontrada), a transação inteira é descartada. Nenhuma taxa cobrada, nenhuma alteração de estado.

Se uma transação nonce passar na validação mas a execução falhar (uma instrução retorna um erro), o nonce ainda é avançado e as taxas ainda são cobradas. Isto previne que a transação seja repetida enquanto garante que o validador seja compensado.

Is this page helpful?

Índice

Editar Página

Gerenciado por

© 2026 Fundação Solana.
Todos os direitos reservados.
Conecte-se
  • Blog