协议演进 / BIP/比特币改进提案 / BIP-85
BIP-85
从一个 BIP32 主密钥按固定路径确定性地派生出熵,再喂给其他钱包生成各自的助记词或根密钥,做到一份主备份管多个钱包。本 BIP 目前处于已部署状态。
一、档案卡
| 编号 | BIP-85 |
|---|---|
| 标题 | Deterministic Entropy From BIP32 Keychains |
| 作者 | Ethan Kosakovsky <[email protected]>, Aneesh Karve <[email protected]> |
| 指定日期 | 2020-03-20 |
| 层级 | Applications(应用) |
| 类型 | Informational(信息类) |
| 状态 | Deployed(已部署) |
| 阅读版 | https://bips.dev/85 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0085.mediawiki |
二、放在哪一族
种子与熵管理族。它站在两份基础文档之上:
BIP-32:分层确定性钱包——本 BIP 的派生引擎
BIP-39:助记词——本 BIP 最常见的派生目标之一
同族近邻还有 BIP-85 自己列出的各类“下游标准”:Bitcoin Core 以 WIF 作 hdseed、Electrum 有自己的助记词方案、Monero 等其他币种又有各自的助记词方案。本 BIP 不取代它们,而是站在它们上游:先用 BIP32 统一产出“初始熵”,再由各目标钱包按自己的标准把熵变成助记词或根密钥。
三、它要解决什么
3.1 一份备份管不了所有钱包
现实中有多个互不兼容的标准。多数钱包用 BIP-39:熵先编码为助记词,助记词哈希后得到 BIP39 种子,再生成 BIP32 根密钥。但 BIP32 根密钥无法反推回 BIP39 助记词;而多数钱包又只接受助记词恢复、不接受扩展私钥,于是用户只有两条路:所有钱包共用同一份助记词,或每个钱包各存一份助记词。
两条路都不好。共用意味着把主种子暴露给安全性较弱的环境(手机热钱包、JoinMarket 服务器、闪电网络节点等);各存一份则备份数量膨胀——尤其是做了异地冗余、分片备份的用户,每加一份种子,保管成本与出错概率都上升,人也容易在后续备份上偷懒。
3.2 思路:熵也可以派生
所有助记词/种子方案的起点都是同一样东西——初始熵。既然 HD 密钥链本身就是从初始熵派生的,就可以用 BIP32 反过来派生出新的初始熵,喂给目标钱包自己的标准去生成它的助记词或根密钥。再借用类似 BIP-44 的分类法按应用编号分格,不同应用、不同序号的熵互不混淆。
这样,主备份只需一份;子钱包的种子都是它的确定性产物,丢了可以重新派生,不必逐个另行保管。
四、规则本身
4.1 核心算法
前提只有一个 BIP32 主根密钥;它从何而来(直接生成还是经 BIP39 等助记词)不在本规范关心范围。
每个应用按一条全硬化派生路径,从主根密钥派生出一个私钥 k,再做一次变换:
HMAC-SHA512(key = "bip-entropy-from-k", msg = k)
得到 512 比特(64 字节)熵;各应用按自己需要的比特数截断使用。
多走一步 HMAC 不是多余的:其一,即使实现误用了非硬化派生,子密钥泄漏也不会连累父树;其二,这一步在语义上把“私钥”明确转换成“熵”,避免 k 被挪作他用(例如同时当私钥或随机数)产生不可预见的交互。原文为核心算法与 BIP85-DRNG 都给出了测试向量。
4.2 路径格式与应用编号
通式为:
m / 83696968' / {app_no}' / {index}'
app_no 应带语义,通常取对应 BIP 编号或 ASCII 码序列。原文已定义的应用包括:
- BIP39 助记词(39’):路径再细分为
m/83696968'/39'/{language}'/{words}'/{index}',语言有代码表(英文 0’、日文 1’、简体中文 4’、繁体中文 5’ 等),词数 12/15/18/21/24 对应熵 128/160/192/224/256 比特; - HD-Seed WIF(2’):取熵的高 256 比特作私钥,编码为压缩 WIF,用作 Bitcoin Core 钱包的 hdseed;
- XPRV(32’):64 字节摘要的前 32 字节作链码、后 32 字节作私钥(注意顺序与 BIP32 相反),子编号、深度、父指纹强制为零,拼成一个新的 xprv;输入为测试网根密钥时可输出 tprv;
- HEX(128169’):截取 16 至 64 字节的原始十六进制熵;
- 密码(707764’ / 707785’):把 64 字节熵分别作 Base64 / Base85 编码后切片,得到指定长度的确定性密码;
- RSA(828365’):用下文的 DRNG 驱动 RSA 密钥生成,另有 GPG 子密钥的编号与时间戳约定(创建时间须固定为创世区块时间 1231006505);
- 骰子(89101’):按面数与次数从 DRNG 产出点数序列,可用于 PIN、数字秘密或自定义字母表口令;
- Nostr(128002’):取熵的前 32 字节作 secp256k1 私钥,编码为 NIP-19 的 nsec;identity 与 account_index 的 0’ 均保留,实际签名密钥从 1’ 起。
4.3 BIP85-DRNG
有些用途(如 RSA 密钥生成)需要的随机输入远超 64 字节,且事先算不出总量。为此原文定义 BIP85-DRNG-SHAKE256:以 BIP85 产出的恰好 64 字节熵为种子,喂入 SHAKE256(SHA-3 标准)得到可无限读取的确定性随机流。
4.4 兼容性
原文明示:本规范与任何既有规范都不向后兼容;但它只依赖 BIP32,且不关心根密钥的来源,因此 BIP39、Electrum 式助记词等初始化方案产生的钱包都可以作为它的下游。
五、谁必须动
普通持币人:只需守好一份主种子。子钱包种子按路径重新派生即可恢复,不必为每个钱包单独做纸面/金属备份;代价是主种子一旦泄漏,所有派生出的子种子都随之泄漏,保管等级必须按最高标准。
钱包开发者:实现全硬化路径派生、HMAC-SHA512 变换与截断规则,并按应用编号表对接 BIP39、WIF、XPRV、密码等下游格式;实现须通过原文测试向量。
全节点与矿工:无须改动。
共识层:无变化。本 BIP 纯粹是钱包本地的熵管理约定,链上不可见。
六、现在算不算数,以及一个常见误读
状态为 Deployed,表示该方案已被实际部署使用。它是一份 Informational(信息类)文档:提供一套可互操作的做法,但不强制任何钱包采用。
常见误读:“用了 BIP-85,我的子钱包种子就不用备份了,所以子种子丢了也无所谓。”
只对了一半。子种子确实可以从主种子按路径重新派生,前提是你还记得它用的是哪个应用编号、语言、词数与 index。路径参数记错,派生出的就是另一份熵。主备份要管的不只是主种子本身,还包括“派生过哪些应用、各用什么参数”这份清单。
