143 / 736GAP

Gap Limit

連続する未使用アドレスの上限

ウォレットを復元しても、履歴がすべて表示されないことがあります。Gap Limit はその理由の一つです。一度も入金のないアドレスが長く続き、探索がそこで止まった可能性があります。

Gap Limit は、未使用アドレスが何個続いたらウォレットが探索をやめるかを決める値です。バックアップから復元するとき、ウォレットはアドレスを再計算し、取引履歴があるかを調べます。膨大な候補を際限なく探さないために停止規則が必要です。その境界より先の支払いは、持ち主が正しい鍵を持っていても画面に現れない場合があります。上限を超えただけで資金が消えたり、導出できる鍵の数が制限されたりするわけではありません。

アンナは、ビットコインを受け取ったり送ったりするためのアプリや機器であるウォレットを使っています。相手が支払いを送る際に必要な情報である受取アドレスをたくさん先に作りましたが、一部は使いませんでした。ウォレットを復元すると、いくつかの支払いが見当たりません。上限 20 の探索を考えましょう。インデックス 0 のアドレスには履歴があり、次の 1–20 にはなく、21 には入金があります。インデックスはアドレスの並び順の番号で、ゼロから始まります。スキャンは未使用の連続を調べ終えると、21 に達する前に止まり、その入金を見逃します。調べている列の途中に使用済みアドレスがあれば、未使用数のカウントは最初からやり直します。つまりウォレット全体で最大二十個のアドレスしか持てないという意味ではありません。 [1] [6]

ここで未使用とは何でしょうか。現在お金がないアドレスという意味ではありません。アンナは入金を受けた後、その全額を使ったかもしれません。残高はゼロでも取引履歴は残るので、探索では使用済みとして扱います。BIP 44 が現在残高だけでなく履歴を見るのはこのためです。空のアドレスをすべて未使用とみなすと、復元が早く止まってしまいます。ずっと前に使い切った入金も、復元したウォレットの確認に役立ちます。 [1]

BIP 44 は、階層型ウォレットのアカウントやアドレスの整理方法を記述した規格です。この種のウォレットは、鍵やアドレスを枝分かれする木のように整理します。Address gap limit の規則では、入金を受けるアドレス列である外部受取分岐の探索上限を 20 としています。その境界を越えてアドレスを作るとき、ソフトウェアは警告するべきとされています。これは復元の取り決めであり、ネットワークが取引を受け入れるかを決める合意規則ではありません。ほかのウォレットは別の設定や探索手順を使うことがあります。同じ受取アドレスをいつまでも使い回すよう勧める規則でもありません。 [1]

元のウォレットは、かなり先まで作ったアドレスを知っているかもしれません。しかし鍵だけのバックアップから復元する新しいソフトウェアは、以前どこまで進んだか知らない場合があります。Electrum の文書も、Gap Limit を越えたアドレスは通常の復元で自動的に見つからないことがあると明示しています。対処として説明されているのは、上限を増やすか、使用済みの位置に届くまでアドレスを追加で導出する方法です。ただし適切な設定はソフトウェアとウォレットの種類によります。FAQ にある既定値 20 は Electrum 2.0 の説明であり、現在の全ウォレット共通の値ではありません。 [2]

ウォレットを整理された木にたとえてみましょう。アカウントが資金のグループを分け、その中に複数のアドレス分岐があります。BIP 44 では change=0 が受取用、change=1 が自分のお釣り用の分岐です。お釣りは支払い後も送信者に残る金額です。アカウント探索はアカウント 0 の外部分岐から始まります。履歴があれば次へ進み、最初の履歴のないアカウントでアカウント探索を終えます。そのため規格は、前のアカウントに履歴がなければ新しいものを作らないよう求めています。一つの分岐の未使用区間と、空のアカウントを飛ばすことは別の問題です。一つの上限を増やすだけで、その先のどのアカウントを探すかまで決まるわけではありません。 [1]

BIP 32 は決定論的な鍵導出を記述します。同じ開始データと同じ経路からは同じ鍵ができます。Derivation Path はこの木の中を進む経路であり、支出のルールを表すスクリプト形式と合わせて、ウォレットが追跡するアドレスを決めます。正しい Seed Phrase、つまりバックアップの単語列も、復元に必要な情報の一部にすぎません。BIP 39 では、任意で設定する passphrase も鍵導出の出発点となる秘密情報 seed の計算に使われます。passphrase はアプリのパスワードとは別の、追加の秘密の文字列です。違う passphrase は違うウォレットにつながり、Gap Limit を増やしても直りません。秘密鍵は、ウォレットが資金を使うことを承認するデジタル署名を作るための秘密の数値です。上級者向けには、xpub はほかの公開鍵を導出する拡張公開鍵です。アドレスや支払いの追跡に役立ちますが、それだけで資金の使用を承認することはできません。ただし親の秘密鍵を要する hardened 導出の段階は、それだけでは越えられません。探索範囲を広げても、足りない導出能力は補えません。 [4] [5] [6]

Bitcoin Core 29.0 はノードのプログラム用インターフェース RPC から importdescriptors を提供します。Descriptor は、鍵から支出条件や監視対象のアドレスをどう構成するかを記述したものです。range は導出するインデックスの範囲であり、未使用区間による停止規則ではありません。アクティブな descriptor では next_index が次のアドレス生成に使う番号を定めます。一方、timestamp はいつから取引を探すかを定めます。now はまだ一度も使われていないと分かっている出力向けで、古い支払いの復元を代替しません。文書では、インポートした descriptors の最も早い timestamp より最大二時間前のブロックと、未承認取引をローカルに保持する Mempool も対象に含めます。正しく導出したアドレスでも、該当する期間を調べなければ一覧に出ないことがあります。 [3]

アンナの話に戻りましょう。以前のウォレットの受取アドレスや支払い記録が残っていれば、新しいウォレットが本当に見つけたか確かめられます。最終残高だけでなく、すでに使った入金も比べると役立ちます。長いスキャンは見落とした履歴を発見する可能性がありますが、時間と問い合わせが増えます。外部サーバーを使う場合、関連するアドレスをさらに明かすことにもなります。探索だけで資金が移動したり、ブロックチェーンが変わったりはしません。履歴が合わないままなら、上限を増やし続けるだけでなく、バックアップ情報、アカウント、経路、アドレス形式、履歴データの利用可能性を確認する必要があります。一つのアドレスが見つかっても、復元全体の完全性は証明できません。 [1] [2] [4]

理解を深めるには、この項目とあわせて次もお読みください HD Wallet, Derivation Path, Extended Public Key (xpub), Output Descriptor, Change Address, Seed Phrase. 次の項目からも参照されています HD Wallet, Derivation Path.

DOC · 001BIP 44 — Account discovery and address gap limit仕様 DOC · 002Electrum FAQ — Gap limit and generated addresses文書 DOC · 003Bitcoin Core 29.0 — importdescriptors RPC文書 DOC · 004BIP 32 — Hierarchical Deterministic Wallets仕様 DOC · 005BIP 39 — From mnemonic to seed仕様 DOC · 006Bitcoin Developer Guide — Wallets文書
改訂日: 一次資料を優先 · 投資助言ではありません