用語集 / 開発者向けリファレンス
点関数
- 点関数とは?
- 点関数は、secp256k1の生成点をその数で乗算することで秘密鍵を公開鍵に変換するものであり、すべてのビットコインアドレスの土台となる一方向の処理です。
BIP-32で規定されています。
BIP32は、階層的な鍵派生がほとんどすべての行でこの演算に言及するため、この演算にpoint(p)という名前を与えています。曲線の固定された生成点に256ビットの秘密を掛けると、安全に公開できる座標ペアが得られます。そのペアから秘密を復元するには、78桁の空間で離散対数を解く必要があります。ウォレットはアドレスごとにこの関数を1回実行し、逆方向に実行する必要は決してありません。
仕組み
点関数は、2つの入力のうち1つが永久に固定された楕円曲線の乗算です。
ビットコインは、大きな素数体上でyの2乗がxの立方に7を加えたものに等しいという方程式で定義され、NISTではなくSEC 2文書で標準化された曲線secp256k1を使用します。この曲線には、すべての実装がハードコードする生成点Gと、値が2の256乗をわずかに下回る群位数nが付属しています。秘密鍵は、1からn引く1までの任意の整数です。この関数は、倍算と加算のはしごを使ってGをその回数だけ自分自身に加算します。これが、宇宙の年齢ではなく1ミリ秒をはるかに下回る時間で終わります。
逆方向がセキュリティの前提のすべてです。得られた点が与えられても、公開された方法で群の大きさのほぼ平方根より速く乗数を復元できるものはなく、作業量は約2の128乗回の演算になります。アドレスが再利用されても、公開されても、数十年間保持されても、それは変わりません。
1つの性質が階層ウォレットを可能にします。点の乗算は加算に対して分配法則を満たすため、a足すbの点は、aの点にbの点を加えたものと等しくなります。秘密鍵に調整値を加えると、対応する公開鍵はその調整値の点だけずれます。この量は鍵を持っていなくても誰でも計算できます。非強化のBIP32派生はその同一性に依拠しており、スクリプトツリーへのコミットメントによって内部鍵をずらしたTaprootの出力鍵も同様です。
どこで使われるか
点関数は、ウォレットが新しい受取アドレスを表示するたびに実行されます。
また、拡張公開鍵が単独で有用である理由でもあります。xpubをオンラインストアやウォッチオンリーのスマートフォンに渡すと、そのマシンはそのどこにも秘密鍵を持たずに、公開鍵を調整することで支払いごとに新しいアドレスを生成できます。ハードウェアウォレットは、同じ非対称性を反対側から利用します。秘密は決してチップから出ず、ケーブルを介しては結果の点だけが戻ってきます。
この性質には落とし穴があります。関係が加算的で公開されているため、拡張公開鍵と漏えいした1つの非強化の子秘密鍵を組み合わせると、誰でも親秘密鍵を、そしてそれとともにブランチ全体を復元できます。だからこそアカウントレベルの派生は強化されており、漏えいしたxpubが即時の盗難ではなくプライバシーの惨事となるのです。
点関数vs圧縮公開鍵
点関数は数学的対象を生成し、圧縮公開鍵はその対象を書き留める1つの方法です。点は各32バイトの座標のペアです。圧縮形式はy座標を捨て、偶数か奇数かを記録する1バイトの接頭辞を保持し、33バイトになります。非圧縮形式は両方の座標を65バイトにわたって書き出します。Taprootのxのみの形式は32バイトを保持し、接頭辞をまったく持ちません。それらのすべてが同じ点を表しますが、各エンコーディングは異なるアドレスにハッシュされます。だからこそ、誤った圧縮フラグで古い鍵をインポートすると残高がゼロと表示される一方、コインはもう一方のアドレスにそのまま残っているのです。