跳转到正文
buybitcoinsmart

术语表 /地址与密钥

扩展密钥

又称 xpub、xprv、扩展公钥、扩展私钥、Extended key。

扩展密钥是什么?
扩展密钥由一个普通的比特币密钥和一个32字节的链码组成,软件正是凭借这一组合,才能派生出其下的整个密钥分支。

规定于 BIP-32。

xpub 不是公钥。它是一个78字节的结构:版本、深度、父密钥指纹、子密钥索引、32字节的链码和密钥本身,经 Base58Check 封装后得到一个111个字符的字符串。把一个 xpub 交给会计师,对方就能读取该分支上的每个地址以及这些地址曾收到的每一聪,却无法花费任何资金。

运作方式

之所以需要扩展密钥,是因为单独的密钥无法产生子密钥。BIP-32中的派生过程会将父密钥的链码、其密钥材料和一个索引一起进行哈希运算,链码提供额外的熵,使同级密钥彼此互不相关。去掉链码,就没有可供派生的基础了。

序列化格式固定为78字节,顺序严格:4字节版本、1字节深度、4字节父密钥指纹、4字节子密钥索引、32字节链码和33字节密钥数据。私钥扩展密钥会在其32字节的秘密值前补一个零,使两种形式占用相同的长度。版本字节形成可读的前缀:0x0488B21E 对应 xpub,0x0488ADE4 对应 xprv,测试网的对应前缀为 tpub 和 tprv。

有两种派生函数作用于这些密钥。公钥派生函数仅凭 xpub 即可计算非强化子密钥,支付处理商正是以此在一台不存放任何可花费资金的网络服务器上生成成千上万个收款地址。私钥派生函数可计算任何子密钥,包括强化索引,并且需要 xprv。

您还会遇到 ypub、zpub 和 vpub。它们来自 SLIP-0132,这一约定沿用同样的78字节结构,通过不同的版本字节来表明脚本类型。Bitcoin Core 从未采用该约定,BIP-380中的输出脚本描述符则以完整写出脚本类型的方式取而代之,例如 wpkh([1a2b3c4d/84h/0h/0h]xpub.../0/*)。

购买比特币时为何重要

扩展公钥是您可能被要求共享的、在技术上并非秘密的信息中最敏感的一种,而这类请求往往看起来很平常。

导出扩展公钥有三种正当理由。其一,设置仅观察钱包,让手机可以显示硬件钱包的余额。其二,向自托管的支付处理商提供其应从中提取收款地址的分支。其三,组建多重签名钱包:每位共同签名人提供一个 xpub,日后重建钱包时每一个都不可或缺,即使所有助记词都完好无损。

除此之外的一切请求都应保持怀疑。本站评测的交易所没有一家需要扩展密钥才能向您发送提币,它们只需要一个地址。客服人员以验证钱包为由索要 xpub,往好处说也是在对您做用户画像。索要 xprv 的人要的就是您的资金,正确的做法是终止对话。

这种信息披露还具有人们往往低估的永久性。xpub 揭示的不只是今天的余额,而是该分支上过去和未来的每一笔付款,因为持有者可以在您不再与其联系之后很久继续派生新地址。它无法撤销。要撤销这一披露,就需要生成新的助记词并转移每一笔资金,且您拥有的每一个输入都要支付手续费。

这里有一个特别需要说明的陷阱。如果有人持有您的扩展公钥,又获得了任何一个非强化子私钥,就可以重建父级扩展私钥,并花费整个分支的资金。BIP-32在其自身的安全说明中就指出了这一点。这正是账户层级采用强化派生的原因,也说明为什么从现代钱包中导出单个密钥(少数工具仍提供这一功能)是一种危险的便利,而非实用的便利。

会计师能用您的 xpub 做什么,不能做什么

把扩展公钥交出去后,界限十分清晰。假设您从硬件钱包导出 m/84'/0'/0' 的账户扩展公钥,并通过电子邮件发给替您报税的人。

对方可以派生该账户下的每一个收款地址和每一个找零地址,在任何区块浏览器上逐一查询,并重建一份完整的、带日期的资金进出记录。对方可以精确到聪汇总您当前的余额,并持续观察其变化。对方可以派生您尚未使用的地址,并在您使用这些地址的那一刻看到它。

对方无法签署任何交易。强化子密钥从公钥一侧无法推导,因此同级账户(例如 m/84'/0'/1')对其不可见,主密钥同样如此。对方无法凭这些信息恢复任何私钥,除非您另外交出了其下的某个单独密钥,而这正是上文所述的失败情形。

扩展密钥 vs 公钥

公钥是 secp256k1 曲线上的一个点,压缩后为33字节,用于验证签名。扩展公钥是同一个点,再加上一个32字节的链码和四个描述其位置的字段,它可以产生数十亿个后续公钥。公开一个公钥,披露的只是一个输出的信息。公开一个扩展公钥,披露的则是整个钱包。

扩展密钥 vs 钱包导入格式

xprv 与钱包导入格式(WIF)字符串都以 Base58 编码密钥材料,二者的相似之处也仅此而已。WIF 字符串包含一个私钥、一个网络字节和一个校验和,适用于转移单个旧式密钥,导入后恢复的恰好是锁定在该密钥上的资金。xprv 则包含一个密钥,以及使其能够重新生成无限分支的链码和位置信息。二者的不对称之处恰是人们容易出错的地方:把 WIF 清扫到现代钱包中属于例行的整理操作,而把 xprv 粘贴到不熟悉的软件中,则会一次性交出其下的全部资金。

请勿混淆

常见问题

分享我的 xpub 安全吗?

任何人都无法用它花费资金,但可以看到全部信息。扩展公钥会暴露该分支下的每个地址及其完整的支付历史,这种暴露是永久的,也无法撤销访问权限,因此只应将其分享给仅观察钱包、支付处理商,或您自行选定的多重签名共同签署方。

xpub、ypub 和 zpub 有什么区别?

只有版本字节不同,它们用于标示脚本类型:xpub 对应传统路径,ypub 对应 BIP-49下的封装 SegWit,zpub 对应 BIP-84下的原生 SegWit。它们源自 SLIP-0132,而非 BIP-32,输出脚本描述符是其现代替代方案。

别人能通过我的 xpub 推算出我的私钥吗?

仅凭 xpub 不能。但如果对方同时获得了其下任何一个非强化子私钥,就可以,因为两者结合即可还原父级扩展私钥。因此,切勿从 HD 钱包中导出单个密钥。

交易所会需要我的扩展密钥吗?

不会。提币只需要一个地址,因此平台或客服人员索要 xpub 是在收集超出所需的信息,而任何索要 xprv 的行为都是想夺取您的比特币。

接着阅读

相关术语

地址与密钥中的更多术语

阅读本页英文版