用語集 / アドレスと鍵
NUMSポイント
- NUMSポイントとは?
- NUMSポイントとは、秘密鍵を誰も保有していない公開鍵のことで、協調的な支出経路が不可能であることを意図する場合にTaprootの内部鍵として使用されます。
BIP-341で規定されています。
Nothing Up My Sleeve(何も仕込んでいない)とはその性質のことです。この点は公開された再現可能な手順から導かれるため、誰もその秘密鍵を主張することはできません。BIP-341はそのような点の1つを公開しており、x座標は0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0で、secp256k1の基点Gの標準的な非圧縮エンコードをハッシュ化して生成されます。ウォレットにとって、これはtaprootの出力をスクリプト専用にする方法です。すなわち、条件のツリーを通じてのみ支出可能となり、それ以外では支出できません。
仕組み
NUMSポイントは鍵としてではなく、ハッシュとして生まれます。
通常の公開鍵は生成元Gに秘密の数を掛けたものであり、その数を選んだ者は署名できます。NUMSポイントは逆に構築されます。固定された公開文字列を取り、それをハッシュ化し、32バイトのダイジェストをx座標として読み取ります。BIP-341の例ではG自体の標準的な非圧縮エンコードをハッシュ化しており、これにより作成者が入力を不正に操作する自由は残されません。その値を曲線上の点に持ち上げると、1点を除いてあらゆる点で有効な公開鍵が得られます。それに対する署名は離散対数の求解を意味し、BIP-341は設計のセキュリティ上の限界として2分の1を128乗と明記しています。
残りはTaprootが担います。taprootの出力鍵は、スクリプトツリーのマークルルートをコミットするツイークによって曲線上でシフトされた内部鍵Pです。BIP-341はt = hash_TapTweak(p || merkle_root)を設定し、次にQ = P + int(t)Gとします。鍵パスでQに署名するにはPの背後にある秘密鍵が必要であるため、PがNUMSポイントである場合、そのパスは閉ざされ、スクリプトパスのみが入り口となります。そのような支出では1つのリーフと33 + 32mバイトのコントロールブロックが明らかになります。ここでmは兄弟ハッシュの数であり、BIP-341によって128に上限が設けられています。
知っておく価値のある漏洩が1つあります。よく知られたNUMSポイントは一目で識別できるため、コントロールブロックにそのまま公開すると、鍵パスが最初から無効であったことが明らかになります。BIP-341はこれを推奨していません。0からnから1を引いた値までの範囲で新しい整数rを一様にランダムに選び、代わりにH + rGを使用することを勧めています。これは通常の内部鍵と区別がつきません。rを保持しておけば、それを渡して再計算させることで、その点がNUMSであったことを共同署名者に証明できます。
どこで見られるか
NUMSポイントはアドレスには決して現れず、スクリプトパス支出のウィットネスにのみ現れます。
オンチェーンでは、出力は34バイトで、OP_1の後に32バイトのプッシュが続き、他のtaproot出力と何ら変わりません。内部鍵はコントロールブロックの最初のバイトに続く32バイトであるため、誰かが初めてツリーを通じて支出したときに明らかになります。入金されてもスクリプトで支出されない出力は、それを明らかにしません。
ディスクリプタは選択を明示します。BIP-386はtr()内のすべての鍵式がx-onlyであることを要求し、内部鍵をtr(KEY, TREE)の先頭に置くため、そこにNUMSポイントがあることは、鍵パスが存在しないことをディスクリプタが示す方法です。対照的なケースはツリーのないtr(KEY)であり、BIP-386はスクリプトパスのない出力でも支出不可能なスクリプトパスにコミットすべきというBIP-341の助言を引用しています。
NUMSの内部鍵を使用すると、復元はシードフレーズのみに依存するのではなく、ディスクリプタ文字列に依存します。シードはリーフ鍵を再現しますが、その中にはツリーやその上の点を記録するものは何もありません。Sparrowのマルチシグのフローではディスクリプタを保持するよう指示されており、この指示は通常の鍵パスウォレットの場合よりもここで重要になります。
NUMSポイントvsヌルデータトランザクション
NUMSポイントは1つの支出経路を閉ざすのに対し、ヌルデータトランザクションは出力を完全に支出不可能にします。OP_RETURNの出力は設計上、使用できないことが証明可能です。ノードはそれをUTXOセットから削除し、それに割り当てられた価値はすべて焼却されます。NUMSの内部鍵の背後にあるコインは焼却されません。スクリプトツリー内のすべての条件は通常どおり支出できます。両者が共有する言葉は「支出不可能」であり、一方では出力全体を、他方では単一のブランチを指します。