永続ノンス:Solana の二台署名

·7 分で読める·SSP Editorial Team 著
Solana の永続ノンスと二台署名を扱うマルチシグ解説記事のための SSP ブランドカバー

永続ノンス:Solana の二台署名

SSP は 2-of-2 のウォレットです。すべての取引には二つの署名が必要です。一つはパソコンのブラウザ拡張機能 Wallet から、もう一つはスマートフォンの SSP Key から。この設計こそが要点です。一台の端末を盗んだ泥棒も、それだけではあなたの資金を動かせません。しかし、ここには非常に人間的な問題が生まれます。パソコンは取引を一瞬で構築し署名します。スマートフォンが共同署名するのは、それから二、三分後かもしれません。人がスマートフォンを手に取り、リクエストを確認し、承認をタップする必要があるからです。

Solana では、この空白が問題になります。本記事はその理由と、SSP が壊れやすいものを一切保存せずにそれをどう解決するかを説明します。

失効するブロックハッシュ

すべての通常の Solana 取引は、最近のブロックハッシュと呼ばれるデータを携えています。これはチェーン上の近い時点のブロックの指紋であり、同時に二つの役割を果たします。取引が最近作られたことを証明し、同じ署名済み取引が永久に再生されるのを防ぎます。

落とし穴は最近のという言葉にあります。ブロックハッシュは約 150 ブロックの間しか有効ではありません。Solana ではブロックが速く生成されるため、150 ブロックはわずか 60〜90 秒ほどです。その猶予を過ぎると、ネットワークは取引を即座に拒否します。署名に問題があるからではなく、ブロックハッシュが古くなったからです。

ここで SSP の署名フローをこの時計に対置してみましょう。Wallet が取引を構築し、新しいブロックハッシュを固定し、署名します。続いてユーザーのスマートフォンに通知が届きます。90 秒以内に応答すれば問題ありません。会議中だったり、スマートフォンが別の部屋にあったり、あるいは単に取引をじっくり読みたかったりすると、ブロックハッシュは静かに死にます。Wallet の署名は暗号学的にはなお有効ですが、それが添付されていた取引はもはや無価値です。すべてを一からやり直して再署名しなければなりません。

署名と同時に一気に送信する単一署名者のウォレットにとって、90 秒の猶予は十分です。二つの署名の間に人間が立つ 2-of-2 のウォレットにとっては、ユーザーが負け続ける競走です。

永続ノンスとは何か

Solana にはこれに対する組み込みの答えがあり、それは SSP より前から存在します。永続ノンスです。考え方は、失効するブロックハッシュを、失効しない値に置き換えることです。

永続ノンスは、チェーン上のそれ自身の小さなアカウント、ノンスアカウントの中に存在します。このアカウントはシステムが所有し、わずか 80 バイトのデータを保持し、そのうちの一つがノンス値そのものです。ブロックハッシュの長寿命な代役です。取引は、最近のブロックハッシュの代わりにノンスアカウントの値を使うように構築できます。その値は古くならないため、取引は必要なだけの間、有効なままです。数分、数時間、数日でも。

とはいえ、ただで手に入るものは何もなく、ノンスには再生に対する防御が必要です。その防御は一つのルールです。永続ノンスを使うすべての取引は、特定の命令 nonceAdvance を最初の命令として携えな��ればなりません。取引がついに着地すると、nonceAdvance は現在のノンス値を消費し、アカウントを新しい値へと回転させます。ノンスは使い切りです。月曜に署名した取引は水曜まで待てますが、いったん実行されると、そのまさにそのノンスは二度と別の取引を承認できません。Solana 自身によるこの仕組みの説明を読みたければ、永続トランザクションノンスのドキュメントが一次資料です。

つまり永続ノンスは、再生リスクを買うことなく時間を買います。これこそ、二台の端末を使うウォレットが必要とする性質です。

SSP のひねり:保存する必要が決してないノンスアカウント

永続ノンスアカウントもやはりアカウントであり、Solana ではすべてのアカウントにアドレスがあります。素朴なやり方は、何らかのランダムなアドレスにノンスアカウントを作り、そのアドレスを永遠に注意深く覚えておくことです。ウォレットのローカルストレージに書き込み、バックアップし、端末のリセットを生き延びることを願う。それは失う可能性のある、もう一つの壊れやすいものです。

SSP はそれを保存することを拒みます。代わりに、SSP の Solana マルチシグプログラムには provision_nonce という命令が含まれており、それはノンスアカウントを導出されたアドレスに作成します。アドレスは決定論的なレシピから生まれます。マルチシグアカウントそのもの、固定のテキストラベル "nonce"、そして Solana のシステムプログラムから計算されます。同じマルチシグを入れれば、同じノンスアドレスが出る。毎回です。

これが重要なのは、本シリーズの残りの部分がすでに確立したことのおかげです。SSP の Solana マルチシグは、マルチシグアドレスをメンバー集合から導出し、ボールトアドレスをマルチシグから導出します。(これらの導出が初めてなら、自己起動する Solana マルチシグの記事がそれぞれを順に解説します。)いまやノンスアカウントも同じ家族に加わります。それもまた純粋な導出です。どの SSP 端末も――あなたのパソコン、あなたのスマートフォン、入れ直したばかりのウォレットも――ノンスアカウントのアドレスを一から再計算できます。失う秘密のアドレスは存在しません。そもそも保存されたアドレスが一つもないからです。

この設計からはいくつかの実務上の注記が導かれます。provision_nonce は許可不要(permissionless)です。誰でも少額のレント(約 0.00144 SOL)を支払ってノンスアカウントを存在させることができ、支払った者がその初期権限者になります。実際には SSP relay のペイマスターです。この権限は後で再割り当てでき、その間アカウントのアドレスは決して変わらないため、今日あなたが導出したアドレスは、その背後の運用鍵が交代しても正しいままです。ノンスアカウントの所在は、たまたまそれに資金を出した者ではなく、あなたのマルチシグに固定されています。

落ち着いた署名フロー

部品を組み合わせれば、競走は消えます。Wallet は、最近のブロックハッシュではなく導出されたノンスアカウントを使う取引を構築し、nonceAdvance を最初の命令に据えて署名します。プッシュ通知がスマートフォンに届きます。ユーザーは準備ができたときに承認します。彼らに向かって刻む時計はありません。SSP Key が二つ目の署名を加え、完全に署名された取引が送信されます。永続ノンスの上に構築されているため、それはなお有効であり、nonceAdvance がノンスを回転させて取引が再生されないようにします。

名前を挙げておく価値のある制約がもう一つあります。Solana は単一の取引を 1232 バイトに制限します。マルチシグ取引は、メンバーリストと支出命令をその上限の中に収めなければなりません。SSP が Solana のコンパクトなバージョン付き取引形式を使い、データを可能なかぎり詰めて渡すのはそのためです。永続ノンスはサイズの予算を変えません。時間の予算だけを変えます。

すべてを導出し、何も保存しない

これが『Solana マルチシグ、SSP 流』シリーズ全体を貫く糸です。マルチシグアドレス、あなたの資金を保持するボールト、そしていま二台の端末に合意のための時間を与えるノンスアカウント――そのどれも、SSP が保存して守らなければならない値ではありません。それぞれが、ウォレットがすでに知っている入力から必要に応じて再計算されます。バックアップすべきものは少なく、漏れうるものは少なく、端末のリセットで誤りうるものも少ない。この考え方に寄りかかるマルチシグ設計は、SSP の単一署名者マルチシグのアプローチのように、壊れる可動部分が最も少ない傾向があります。

シリーズの残りと同じ誠実さの精神で締めくくりの注記を一つ。SSP の Solana マルチシグプログラムは現在 devnet にのみ展開されており、いかなる mainnet リリースの前にも外部のセキュリティ監査を待っています。ここで述べた設計――provision_nonce とその導出されたノンスアカウントを含む――は実在し、オープンソースのプログラムで読めますが、まだ本番のインフラではありません。SSP の二台モデルそのものが初めてなら、入門記事2-of-2 マルチシグとは何かが出発点です。

永続ノンスは、Solana の小さく古い配管の一片です。SSP の貢献は、そのアドレスを、あなたが決して覚えておく必要のないもう一つのものにすることです。

この記事をシェアする

関連記事