概要
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を使用するには:
CreateAccount+ *rsInitializeNonceAccount*を使用してnonceアカウントを作成し初期化する- *rs
AdvanceNonceAccount*を最初のインストラクションとして、nonce値をrecent_blockhashとしてトランザクションを構築する - トランザクションに署名する(nonceは期限切れにならないため、オフラインで実行可能)
- 準備ができたら送信する
Nonceの検出
ランタイムは、最初のインストラクション(インデックスNONCED_TX_MARKER_IX_INDEX
= 0)が*rsAdvanceNonceAccount*インストラクションを使用したSystem
Programへの呼び出しであるかどうかをチェックすることで、nonceトランザクションを検出します。Nonceアカウントは、そのインストラクションの最初のアカウントである必要があり、書き込み可能である必要があります。get_durable_nonceを参照してください。
Nonce検証フロー
トランザクションのrecent_blockhashがBlockhashQueueに見つからない場合、validatorはcheck_transaction_ageを介して、それが有効なnonceトランザクションであるかを確認します。
- nonceに保存されている
durable_nonceは、次のdurable nonce(現在のblockhashから派生)と異なる必要があります。これにより、nonceがこのブロックで既に使用されていないことが保証されます - nonceアカウントは読み込まれている必要があり、*rs
State::Initialized*として解析できる必要があります - 保存されている
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?