协议演进 / BIP/比特币改进提案 / BIP-85

BIP-85 从 BIP32 密钥链派生确定性熵

从一个 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 码序列。原文已定义的应用包括:

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。路径参数记错,派生出的就是另一份熵。主备份要管的不只是主种子本身,还包括“派生过哪些应用、各用什么参数”这份清单。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。