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 的计算。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文档
修订日期: 来源优先 · 非投资建议