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:
- Crie e inicialize uma conta de nonce usando
CreateAccount+InitializeNonceAccount - Construa a transação com
AdvanceNonceAccountcomo a primeira instrução e o valor do nonce comorecent_blockhash - Assine a transação (pode ser feito offline, pois o nonce não expira)
- 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:
- O
durable_noncearmazenado 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 - A conta nonce deve ser carregada e deve ser analisada como
State::Initialized - O
durable_noncearmazenado deve corresponder aorecent_blockhashda 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?