Durable Nonce

概要

Durable nonceトランザクションは、最近のブロックハッシュを保存されたnonce値に置き換えることで、トランザクションの150スロットの有効期限を削除します。これにより、オフライン署名と遅延送信が可能になります。

Durable nonceは将来のリリースで非推奨になる可能性があります。詳細はSIMDディスカッションを参照してください。

Durable nonce

Durable nonceトランザクションは、最近のブロックハッシュを保存されたnonce値に置き換えることで、150スロットの有効期限を削除します。これにより、オフライン署名と遅延送信が可能になります。

Nonceトランザクションの仕組み

Nonceアカウントは、System Programが所有するアカウントで、3つのフィールドを含む*rsState::Initialized*値を保存します:authority pubkey(nonceを進めることができる者)、durable nonce値(最近のブロックハッシュから派生したハッシュ)、lamports per signature(nonceが最後に進められたときの手数料レート)です。

Durable nonceを使用するには:

  1. CreateAccount + *rsInitializeNonceAccount*を使用してnonceアカウントを作成し初期化する
  2. *rsAdvanceNonceAccount*を最初のインストラクションとして、nonce値をrecent_blockhashとしてトランザクションを構築する
  3. トランザクションに署名する(nonceは期限切れにならないため、オフラインで実行可能)
  4. 準備ができたら送信する

Nonceの検出

ランタイムは、最初のインストラクション(インデックスNONCED_TX_MARKER_IX_INDEX = 0)が*rsAdvanceNonceAccount*インストラクションを使用したSystem Programへの呼び出しであるかどうかをチェックすることで、nonceトランザクションを検出します。Nonceアカウントは、そのインストラクションの最初のアカウントである必要があり、書き込み可能である必要があります。get_durable_nonceを参照してください。

Nonce検証フロー

トランザクションのrecent_blockhashBlockhashQueueに見つからない場合、validatorはcheck_transaction_ageを介して、それが有効なnonceトランザクションであるかを確認します。

  1. nonceに保存されているdurable_nonceは、次のdurable nonce(現在のblockhashから派生)と異なる必要があります。これにより、nonceがこのブロックで既に使用されていないことが保証されます
  2. nonceアカウントは読み込まれている必要があり、*rsState::Initialized*として解析できる必要があります
  3. 保存されているdurable_nonceは、トランザクションのrecent_blockhashと一致する必要があります

nonce authorityの署名チェックは後で実行されます(validate_transaction_nonce)。

すべてのチェックに合格すると、実行が開始される前にnonceが次のdurable nonce値に進められます。実行が失敗した場合でも、進められたnonceと手数料が差し引かれたfee payerはコミットされます(リプレイを防ぎながら手数料を徴収します)。

Nonce失敗時の動作

nonceトランザクションが検証に失敗した場合(nonceが既に使用されている、authorityが署名していない、アカウントが見つからない)、トランザクション全体が破棄されます。手数料は徴収されず、状態変更もありません。

nonceトランザクションが検証に合格したが実行に失敗した場合(命令がエラーを返す)、nonceは進められ、手数料は徴収されます。これにより、トランザクションのリプレイを防ぎながら、validatorが報酬を受け取ることが保証されます。

Is this page helpful?

目次

ページを編集

管理運営

© 2026 Solana Foundation.
無断転載を禁じます。
つながろう