Schnorr Signature は、秘密鍵を明かさずに特定のメッセージをデジタルに承認する方法です。ウォレットは秘密鍵で署名を作り、他の人は対応する公開鍵だけで検証できます。Bitcoin ではコインを使う権限の確認に役立ちますが、取引のほかの検査に代わるものではありません。Taproot とともに使う Bitcoin 版を BIP340 が定めています。
アリスがボブにビットコインを送るとします。ウォレットは、ビットコインを受け取ったり送ったりするためのアプリや機器です。ウォレットはトランザクションを作り、選択した署名モードが要求するデータに秘密鍵で署名します。ノードは署名と、それ以外の支出条件をすべて検証します。ノードは、取引やブロックを検証し、ネットワークの他の参加者と通信するソフトウェアです。有効な署名だけで、アリスの公的な身元、意図した送金先、十分な未使用資金の存在まで確認できるわけではありません。これらは別の問題です。署名済みの支払いでも、本人が望まなかった間違いである可能性は残ります。 [5] [3] [10] [11]
Pieter Wuille、Jonas Nick、Tim Ruffing による BIP340 は、Bitcoin の Schnorr 署名を厳密に定義しています。BIP341 はそれを Taproot の支出ルールに組み込みました。このルールは2021年、ビットコインの本番ネットワーク(Mainnet)のブロック709632で有効になりました。ブロックは、共有する履歴に追加する取引のまとまりです。署名アルゴリズムと支出条件という二つの層があるのです。古い出力形式や SegWit v0 は引き続き ECDSA(従来の署名アルゴリズム)を使い、アップグレードによって過去の署名が置き換わったわけではありません。 [1] [2] [11]
バイトはデータ量を表す一般的な単位です。Bitcoin 版では、鍵や署名の計算に使う数学的な構造である楕円曲線 secp256k1 を利用します。BIP340 は署名を固定長の64バイト形式とします。公開鍵は x 座標の32バイトで表現します。x-only という名前は、安全性の確認を省くという意味ではありません。検証側が曲線上のどちらの点を使うかも、ルールで一意に決まります。小さく厳密な形式はソフトウェアにとって扱いやすいものですが、この二つの数値だけでトランザクション全体の大きさは分かりません。 [1] [12]
ウォレットは曖昧な「同意します」に署名するのではありません。sighash モードは、取引のどのデータから署名対象のメッセージを作るかを決めます。SIGHASH_DEFAULT は SIGHASH_ALL と同様に、すべての入力と出力に関する情報を保護します。つまり、以前受け取ったどのコインを使い、どのような支出条件付きの新しい金額を作るかという情報です。対象のデータを変えると署名は無効になります。ただし、他の署名そのものなど、すべてのバイトを署名するわけではありません。ほかの許可されたモードでは保護範囲が異なります。署名は64バイトで、既定以外のモードでは種類を示す一バイトが付き、その要素は65バイトになります。これは入力や取引全体の大きさではありません。 [2]
署名時には秘密の nonce 値を作ります。同じ鍵で異なるメッセージにその値を再利用すると、秘密鍵が漏れるおそれがあります。このため BIP340 は nonce の導出方法を厳密に定め、実装をさらに守るため補助的な乱数も推奨しています。ユーザーが nonce を考えたり、バックアップに書き留めたりする必要はありません。検証を重ねた署名ライブラリが管理します。ここでの自己流の実装は、正しい暗号方式であっても台無しにしかねません。 [1] [9]
Schnorr 署名の数学的な構造により、複数人が同じメッセージに合意して共同署名を作るプロトコルを構成できます。BIP327 の MuSig2 がその一例です。このプロトコルの基本形では、選んだグループの全員が参加する必要があります。参加者の調整、正しい鍵の扱い、専用の安全な nonce 手順が必要で、完成済みの任意の署名を単純に足せばよいわけではありません。ウォレットが Schnorr Signature に対応していても、それだけで共同署名に対応しているとはいえません。 [8]
Taproot には異なる支出経路があります。key path では、出力に記録された公開鍵に対してネットワークが署名を検証します。その鍵は一人を表す場合も、協力するグループを表す場合もあります。script path では選んだスクリプト、つまり支払いが満たすべき条件を記したプログラムを公開します。Tapscript は Taproot で使うスクリプト言語の形式です。OP_CHECKSIGADD 命令は一つの署名を検証し、成功すれば累計に一を加えます。繰り返せば複数の個別署名を調べ、必要な数を満たすか確認できます。このスクリプトによる Multisig は、一つの集約署名とは別の方法です。利用するウォレットで、誰の協力が必要か、何が公開されるか、鍵を失った場合にどんな復元方法が残るかを確認しましょう。 [7] [2]
中央の審判がいないネットワークでは、バイトの解釈の違いだけで、あるノードが署名を受理し、別のノードが拒否してはいけません。BIP340 は有効な鍵、署名、検証手順を詳細に定めています。複数の署名をまとめて検証して計算を節約する batch verification も可能です。ただし、チェーン上の記録を書き換えたり、異なるトランザクション入力の署名を一つにまとめたりするものではありません。 [1]
共同の key-path 署名は、一つの鍵による署名と同じように見える場合があります。そのため、署名だけでは何人が合意したのか分からないことがあります。一方、金額、入力と出力のつながり、トランザクションの時刻は通常、観察できます。Schnorr Signature は支払いを暗号化しません。プライバシーは Taproot の使い方、ウォレットの動作、支払いの状況にも左右されます。 [2] [3]
一般のユーザーにとって重要なのは、送金先、金額、手数料を正しく表示し、確実な復元を可能にするウォレットです。開発者はさらに、BIP340 への正確な対応、テストベクトル、nonce の管理、障害時の動作を確認します。アルゴリズム名は製品全体の品質保証ではありません。libsecp256k1 のような優れたライブラリは暗号計算を担当しますが、画面の支払いを本当に承認すべきかを人間に代わって判断することはできません。 [4] [9] [6]
理解を深めるには、この項目とあわせて次もお読みください Taproot, MuSig2, Multisig, Bitcoin Script. 次の項目からも参照されています SHA-256, Opcode, MuSig2, Nostr.