30 / 736BIP32

HD Wallet

分层确定性钱包

钱包可以为每笔付款提供新地址,而不必每收一次款就重新备份密钥。HD Wallet 从一个初始秘密派生出整棵密钥树。恢复时,还需要知道钱包使用的是树中的哪一部分。

HD Wallet 可以从同一个秘密起点——种子——计算出许多相互关联的密钥。私钥用来为付款签名,钱包则利用对应的公钥生成收款地址。因此,钱包可以使用新地址,而不必为每个地址单独备份。

Alice 打开收款页面,钱包显示了一个地址。她通过它收到 10 000 聪,也就是比特币的小单位。下一次收款时,应用提供了另一个地址,该地址收到 20 000 聪。如果这两笔是她仅有的未花费收款,钱包就会显示总计 30 000 聪。新地址并没有创建独立账户,之前的钱也没有自动转移到别处。应用管理着两笔收款所需的密钥。HD Wallet 让这种方式变得方便。HD 是 Hierarchical Deterministic 的缩写:Hierarchical 指密钥组成分支结构;Deterministic 指相同的种子和路径会生成相同的密钥,恢复钱包时也一样。路径是一串数字,告诉程序应计算哪条分支上的哪个密钥。日常收款时,Alice 通常不用处理路径,但恢复钱包必须使用正确的路径。因此,初始秘密的一份备份也能覆盖未来的地址,不过钱包设置仍然需要保存。新地址有助于避免地址复用,却不能单独保证匿名性。 [1] [12]

扩展公钥通常称为 xpub,可以用来计算这棵密钥树中某一部分的公钥。它不包含为付款签名所需的私钥。因此,仅凭 xpub 无法花费资金;要生成具体地址,应用还需要知道地址的格式。具备合适 xpub 的 watch-only 钱包可以生成地址、监控付款,而无需签名密钥。但 xpub 泄露可能把该分支的过去和未来地址、余额及交易联系起来。只共享确实需要的分支。即使 xpub 正确,也无法阻止被入侵的电脑显示他人的地址。请在了解该钱包配置的可信签名设备上核对收款地址。 [1] [12] [14]

商店可以为每个订单生成不同地址。网站需要知道这些地址,却不应持有花费营业收入的密钥。BIP32 可以把这条收款分支与钱包其他部分分开。提案由 Pieter Wuille 编写,分配日期为 2012 年 2 月 11 日。它是钱包标准,不是共识规则。BIP39 备份词、脚本类型和完整恢复流程由其他层处理。 [1] [11] [12]

BIP32 为密钥增加一个 256 位 chain code,即供后续派生使用的 32 字节链码。私有形式由 secp256k1 标量 k 和链码 c 组成;公开形式使用 K = point(k) 和同一个 c。主密钥通过 HMAC-SHA512 生成,函数密钥是精确字符串“Bitcoin seed”,输入数据是种子。左侧 32 字节作为私钥候选,右侧 32 字节作为链码。候选为零或不小于曲线阶 n 时,主密钥无效。 [1]

派生是计算,不是查找已存储的列表。 派生分为普通派生和 hardened 派生。普通派生可以根据父扩展公钥计算后续公钥;hardened 步骤则必须使用父扩展私钥。 CKDpriv 计算 I = HMAC-SHA512(cpar, data),把结果分成 IL 和 IR,再将 parse256(IL) 与父私钥相加并对 n 取模。IR 成为新链码。普通派生使用 serP(Kpar) || ser32(i);hardened 派生使用 0x00 || ser256(kpar) || ser32(i),其中 i ≥ 2^31。CKDpub 只能生成普通公钥分支,计算方式是将 point(parse256(IL)) 加到 Kpar。改变分支编号会改变后续派生密钥。 [1]

只要路径不跨越 hardened 步骤,就能从 xpub 派生公钥。但这有代价:父 xpub 加上一个泄露的普通子私钥,可以反推出父私钥。其他同级分支也随之面临风险。hardened 阻断这种反向计算,却不能保护已被盗的种子,也不能弥补弱随机性或用户误批恶意交易。 [1]

在 mainnet,标准公钥编码以 xpub 开头,私钥编码以 xprv 开头,版本分别为 0x0488B21E 和 0x0488ADE4。Base58Check 编码前共 78 字节:版本 4、深度 1、父指纹 4、子编号 4、链码 32、密钥数据 33。最终编码长 111 个字符。短指纹便于匹配密钥,并不能证明身份。SLIP132 的 ypub/zpub 前缀有时提示脚本类型,但仅修改前缀不会改变密钥或钱包规则。 [1] [9]

BIP43 将第一个 hardened 层级保留给用途。BIP44 使用 m / 44' / coin_type' / account' / change / address_index。账户之后是收款分支 0 或找零分支 1,再后面是地址编号。撇号或 h 表示索引加上 2^31。BIP44 地址发现使用 gap limit 20:遇到连续 20 个未使用收款地址就停止。BIP48 描述 Multisig,BIP84 用用途 84' 表示原生 SegWit,BIP86 用 86' 表示单密钥 Taproot。这些是钱包约定,既不存储在种子本身中,也不由节点强制执行。 [2] [3] [4] [5] [6]

密钥本身并不说明用什么脚本保护资金。Output Descriptor 可以记录密钥来源、路径、wpkh() 等结构、所需签名数、其他 Multisig 参与者和校验和。Multipath descriptor 可以同时表示收款与找零分支。一个参与者的种子无法重建其他 xpub 或共同规则。因此也应备份经过验证的公开描述符或配置导出,并保护其隐私。如果导出文件包含私钥,就必须将其视为秘密。 [7] [8] [10] [13]

种子可以重新派生密钥,但应用还需要种子格式、使用过的 BIP39 passphrase、网络、脚本类型、coin type、账户、两条分支及搜索范围。Multisig 还需要共同配置。恢复后余额为零不一定代表币丢了,也可能是查找路径不同。安全测试应在可信设备上找到正确的 UTXO,即尚未花费的交易输出,并验证签名。绝不要把真实种子或备份词输入网页工具或普通联网电脑。 [3] [7] [10] [11]

BIP32 也处理少见的无效结果:parse256(IL) ≥ n、派生私钥为零,或公钥结果为无穷远点。遇到这种子密钥时应尝试下一索引。恢复中更常见的问题是缺少路径、找零分支或对脚本类型的支持。更换应用前先确认能找到资金,并进行小额转账测试。新流程验证成功之前,保留原备份和配置。xprv 能生成签名所需的密钥,xpub 暴露财务关联,描述符说明如何构建钱包。 [1] [7] [9] [10]

要获得更完整的理解,请将本词条与以下词条结合阅读: 钱包, Seed Phrase, Extended Public Key (xpub), Derivation Path, Gap Limit, Bitcoin. 反向关联还来自: 比特币地址, BIP 39, Cold Storage, Watch-only Wallet.

DOC · 001BIP 32 — Hierarchical deterministic wallets规范 DOC · 002BIP 43 — Purpose field for deterministic wallets规范 DOC · 003BIP 44 — Multi-account hierarchy规范 DOC · 004BIP 48 — Multi-script hierarchy for multisig wallets规范 DOC · 005BIP 84 — Native SegWit derivation规范 DOC · 006BIP 86 — Single-key Taproot derivation规范 DOC · 007BIP 380 — Output script descriptors规范 DOC · 008BIP 389 — Multipath descriptor key expressions规范 DOC · 009SLIP 132 — Registered HD version bytes规范 DOC · 010Bitcoin Core — Output descriptors文档 DOC · 011BIP 39 — Mnemonic code for deterministic keys规范 DOC · 012Bitcoin Developer Guide — Wallets文档 DOC · 013Bitcoin Optech — Output script descriptors文档 DOC · 014Trezor Learn — Hierarchical deterministic wallets文档
修订日期: 来源优先 · 非投资建议