60 / 736XPUB

Extended Public Key (xpub)

BIP32 扩展公钥

你想在手机上查看收款,却不想把花费 bitcoin 的密钥交给它。xpub 就能帮助做到这一点:软件可以据此生成地址、观察钱包的某一部分,而无须持有签名所需的私钥。不过,“公钥”不等于应该公开发布。

Extended Public Key (xpub) 遵循 BIP32,也就是组织钱包密钥的一套规则。软件可以用它计算钱包某个范围内的其他公钥,再配合正确的地址规则生成收款地址、跟踪支付。花费资金则需要数字签名,也就是对交易作出的密码学授权。签名由私钥生成,而 xpub 不包含私钥。因此,xpub 不能替代私钥,也不能替代 Seed Phrase——以一串单词记录的钱包备份。

安娜 使用硬件钱包,想在手机上确认客户是否付款。她把所选账户的公开配置导入手机,其中包含 xpub,却没有任何私钥。手机于是成为 Watch-only Wallet:可以观察对应地址、生成新地址,也可以构造未签名交易。但要花费资金,仍需由保存秘密密钥的设备签名。同样,商店可以为不同订单生成不同收款地址,而不在服务器保存花费密钥。这样能限制服务器被入侵后的损失,却不是万无一失:攻击者仍可能向客户展示自己的地址,骗取新的付款。 [1] [5]

别人要付钱给你时,你通常只需提供一个 Bitcoin 地址。xpub 带来的视野广得多。知道账户 xpub 及其地址生成规则的人,可以计算收款地址和找零地址,并关联它们的历史及余额。范围是可派生的分支,不是自动覆盖整个钱包的所有账户。如果把 xpub 交给记账服务或第三方区块浏览器,对方可以保留副本,继续观察未来支付。断开应用连接,并不能撤回已经交出的副本。单次收款通常只需一个地址;只有确实需要时,才提供更广的观察权限。 [1] [5]

BIP32 钱包从一个起点生成一棵密钥树。这里的分支指一组派生密钥,不是网络或区块链的一部分。xpub 只能沿 non-hardened 步骤向下派生。另一类步骤叫 Hardened Derivation,需要私有数据,因此形成 xpub 自身无法跨越的边界。常见的 BIP44 结构会在各个账户之前设置这样的边界,所以导出一个账户的 xpub 不会单独暴露其他账户。导出的深度也很重要:仅收款分支的 xpub,观察范围小于整个账户的 xpub,后者通常还覆盖找零。 [1] [6]

同样的公钥按不同规则,可以形成不同的 Bitcoin 地址。交易输出记录了一笔金额,以及今后花费它所需满足的条件。应用还需要知道钱包使用的输出类型,例如 Native SegWit 或 Taproot,以及要派生哪条分支、哪些序号。SLIP-0132 中的 ypub、zpub 等前缀能提示地址类型,却不能完整描述钱包。Output Descriptor 更精确:它用文本记录密钥,以及生成地址和花费条件的规则。它可以包含密钥来源、派生路径和用于发现输入错误的校验和。校验和检查的是文字是否有误,不是发送者是否可信。也不是所有 descriptor 都只包含公开数据:有些含有私钥,分享之前必须分清。 [2] [3] [4]

先核对网络、所选账户、地址类型和派生路径;路径就是说明密钥在树中所处位置的一组指令。将多个收款地址与原钱包比较;使用硬件钱包时,按厂商流程在其可信屏幕上确认。账户名称相同还不够。导入后余额为零,不一定代表资金丢失:可能看错账户、地址类型,或搜索的地址序号范围太小。不要因此把恢复词输入随便找到的网站。如果只是查看,应导出公开配置,而不是 Seed Phrase 或 xprv;xprv 是扩展私钥。 [4] [5]

xpub 本身不是签名密钥。不过 BIP32 有一个重要关系:父级 xpub,也就是文档中的 parent xpub,与某个 non-hardened 后代的私钥一起,可以用来恢复父级私钥。如果后代相隔多层,中间所有步骤都必须是 non-hardened,计算时也需要知道对应路径。这不是仅凭地址就能盗币。危险的是同一分支的公开观察数据和秘密密钥同时泄露,攻击者可能因此得到该父级之下的其他密钥。Hardened 边界可以隔离账户,却保护不了已经暴露的私钥。 [1]

Multisig 钱包可能要求三把密钥中的两把签名。但仅知道能恢复哪两把密钥,并不够。要重建正确的花费条件,还需要其他参与密钥的公开数据、它们的排列、要求的签名数量及派生规则。因此,除了秘密备份,还应保存钱包配置,例如包含所有必要 xpub 的公开 descriptor。它不赋予花费权限,却可能是恢复必需的资料。Master fingerprint 用八个十六进制字符标识起始密钥,帮助匹配配置,但不是唯一的身份证明:不同密钥可能拥有相同 fingerprint。 [4] [5]

公钥用于验证对应私钥生成的签名。BIP32 还加入 chain code,一个用于派生更多密钥的 32 字节值。两者共同构成扩展公钥。它的可传输表示还携带版本和树中位置的数据:深度、直接父级的 fingerprint,以及子级编号。这不等于从钱包第一把密钥出发的完整路径。因此,xpub 既不是单个收款地址,也不是账户密码,本身还不包含交易清单。观察钱包需要到链上查找对应地址的交易。 [1]

BIP32 的 CKDpub 函数以父级公钥、它的 chain code 和子级索引作为输入。通过 HMAC-SHA512 这种密码学计算,产生用于下一把公钥和新 chain code 的数据。可公开派生的索引范围是 0 到 2³¹−1。Hardened 索引从 2³¹ 开始,在路径中通常用撇号或 h 标记;仅靠 xpub 的 CKDpub 无法派生它们。重复允许的步骤,会得到后代,而不是所导出密钥的同级或祖先。如果出现 BIP32 描述的罕见无效结果,实现应继续尝试下一个索引。普通用户无需亲自计算;关键是正确传递配置。 [1]

标准 BIP32 记录在编码成文本之前占 78 字节:版本 4、深度 1、父级 fingerprint 4、子级编号 4、chain code 32、密钥数据 33。Base58Check 添加校验和,把它编码为 111 个字符。Bitcoin 主网的公钥版本以 xpub 开头,测试版本以 tpub 开头;对应私钥版本以 xprv、tprv 开头。Tpub 不表示 Taproot。前缀来自版本字节,不能完整描述地址规则。导入软件还必须验证公钥是否有效,而不是只检查开头的字母或长度。 [1] [3]

要获得更完整的理解,请将本词条与以下词条结合阅读: HD Wallet, Watch-only Wallet, Bitcoin 隐私, Derivation Path, Bitcoin, Output Descriptor. 反向关联还来自: HD Wallet, Cold Storage, Watch-only Wallet, Output Descriptor.

DOC · 001BIP 32 — Hierarchical Deterministic Wallets规范 DOC · 002BIP 380 — Output Script Descriptors General Operation规范 DOC · 003SLIP-0132 — Registered HD Version Bytes规范 DOC · 004Bitcoin Core — Output Descriptors文档 DOC · 005Trezor — What Is a Public Key (XPUB)?文档 DOC · 006BIP 44 — Multi-Account Hierarchy for Deterministic Wallets规范
修订日期: 来源优先 · 非投资建议