用語集 / 開発者向けリファレンス
ディスクリプタチェックサム
- ディスクリプタチェックサムとは?
- ディスクリプタチェックサムとは、出力ディスクリプタ内のハッシュ記号の後ろに付く8文字のコードのことで、ウォレットが誤った鍵を取り込む前に、入力ミスやコピーの誤りを検出するBCH符号です。
BIP-380で規定されています。
このコードはディスクリプタの末尾、単一のハッシュ記号の後ろに、bech32と同じ32文字のアルファベットで置かれます。BIP-380は、49,154文字までのディスクリプタにおいて、3記号以下に影響する誤りが必ず検出されることを保証しており、ランダムな誤りが見逃される確率はおよそ1兆回に1回です。このチェックがなければ、マルチシグのバックアップで1文字を間違えるだけで、何も保有していないアドレスを見つめることになります。
仕組み
ディスクリプタチェックサムは、ディスクリプタのテキスト自体をハッシュ化したものではなく、そのテキストに対して計算されるBCH符号であり、誤り検出の保証はそこから得られます。BIP-380は95文字の入力アルファベットを定め、それを3つのグループに分け、それ自体では保護を持たない文字を最初のグループに入れます。すなわち数字、括弧、スラッシュ、ワイルドカードのアスタリスク、および小文字のaからhで、16進数で符号化された鍵や導出パスはここに入ります。仕様の本文はこの3つのグループを32としていますが、その参照コードでは32、32、31となっています。
各文字はそのグループ内での位置という1つの記号を寄与し、3つ目の記号のたびに、3つのグループ番号を組み合わせた4つ目の記号が挿入されるため、3文字は4記号に展開されます。文字をそのグループ内で動かすだけの変更、あるいは文字が属するグループを変えるだけの変更は、ちょうど1つの記号を乱します。そのため大文字小文字の誤りはちょうど1記号の誤りとして扱われ、1文字を大文字にしただけでも必ず検出されます。
保証は文字列が長くなるにつれて段階的に下がります。1記号の誤りは常に検出されます。2または3記号は49,154文字まで常に検出され、4記号は507文字まで、5記号は77文字まで検出され、符号は387まで検出されない5記号の誤りを最小化するように調整されています。Bitcoin Coreのdescriptors.mdは、4記号の誤り境界を507ではなく501文字と引用し、残存リスクをおよそ1兆分の1としています。この文書にある単一鍵のディスクリプタは140文字で、すべての境界の内側に収まります。その2of3のマルチパスの例は439文字で、5記号の範囲を超え、4記号の範囲の内側に収まります。
拡張鍵はすでに自らを守っています。BIP-380は、xpubが最初のグループの外に及び、独自のチェックサムの仕組みを持つため、鍵の式は結果として二重に保護されると述べています。
どこで見られるか
BIP-380のテストベクターは、ディスクリプタチェックサムが機能する様子を見る最短の方法です。有効な文字列はraw(deadbeef)#89f8spxmで、仕様が拒否する惜しい変種には、チェックサムなし、ハッシュ記号だけ、9文字のチェックサム、7文字のチェックサム、古いチェックサムをそのままにしたraw(deedbeef)、および入力アルファベット外の文字を使ったペイロードが含まれます。
Bitcoin Coreは出力時にチェックサムを表示し、入力時にそれを要求します。ディスクリプタを返すすべてのRPCは8文字を付けますが、入力時にチェックサムを要求するのは一部だけで、その中にはderiveaddressesやimportdescriptorsが含まれます。手で入力または編集した行については、getdescriptorinfoが正しいチェックサムを返します。
チェックサムは構文解析では任意のままであり、BIP-380はアプリケーションがチェックサムなしのディスクリプタを拒否することを認めています。マルチシグの構成をコーディネーター、予備のマシン、紙の間で移すときには、チェックサムがあることを想定してください。それらの8文字だけが、残りの部分が損なわれずに届いたことを裏付ける部分です。
ディスクリプタチェックサムvs bech32
bech32のチェックサムはアドレスを保護し、ディスクリプタチェックサムはウォレットの定義を保護しており、関与するサイズが設計上の違いを説明します。BIP-173はbech32文字列を90文字に制限し、データ部分の最後の6文字をチェックサムに充て、同じ32記号のアルファベットを使います。ディスクリプタにはそのような上限がなく、括弧、カンマ、引用符、空白もカバーする必要があるため、BIP-380はテキストを位置記号に展開し、グループ記号を交互に挿入して8文字を充てます。
どちらもその結果を同じアルファベットqpzry9x8gf2tvdw0s3jn54khce6mua7lで表し、ここから混乱が始まります。失敗する対象が異なります。チェックサムに失敗したbech32アドレスには支払えません。チェックサムに失敗したディスクリプタは、復元できないウォレットです。