协议演进 / BIP/比特币改进提案 / BIP-88
BIP-88
定义一套可被软件无歧义解析的 BIP32 路径模板记法,用一段模板同时写清多条派生路径的允许范围与越界判定。本 BIP 目前处于已完成状态。
一、档案卡
| 编号 | BIP-88 |
|---|---|
| 标题 | Hierarchical Deterministic Path Templates |
| 作者 | Dmitry Petukhov <[email protected]> |
| 指定日期 | 2020-06-23 |
| 层级 | Applications(应用) |
| 类型 | Informational(信息类) |
| 状态 | Complete(已完成) |
| 阅读版 | https://bips.dev/88 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0088.mediawiki |
二、放在哪一族
派生路径的“元语言”一族:它不新增任何派生方案,而是给已有的方案提供统一的描述与约束方式。
BIP-32:路径格式本身——本 BIP 的模板正是加在它之上
BIP-43、BIP-44、BIP-45、BIP-49、BIP-84:各类具体派生方案——都是模板可以描述的对象
原文还提到两个近邻:walletsrecovery.org 曾用自创的 | 记法罗列各钱包的路径(仅供人看、未成规范);Bitcoin Core 关于描述符的讨论中出现过 xpub...{0,1}/* 的写法,其 {0,1}/* 部分正对应本 BIP 的部分模板。与单签路径族里 BIP-87 处理“多签用哪条路径”不同,BIP-88 处理的是“怎样把一批路径的边界一次写清、且机器能判”。
三、它要解决什么
BIP32 路径格式足够通用,各家又在其上自创了不少定制方案;即便都用现成 BIP,不同厂商对路径的取舍也不一致。用户换钱包恢复时,常遇到新钱包派生出不同地址、找不回币的摩擦——这个问题普遍到需要 walletsrecovery.org 这样的专门网站来登记各钱包用过的路径。
更深一层是安全:不受约束地乱用派生路径可能丢钱。典型情形是找零输出被发到发送方不认识的路径派生出的地址上,整笔找零就可能再也找不回来。
笨办法是把知名路径逐条硬编码进软件与固件里检查,但这样互操作性差、可扩展性也差:厂商没法用适合自己非通用场景的自定义路径,只能硬套知名路径,或逐个去说服其他厂商支持。
BIP-88 给出的灵活办法是:定一套标准的“BIP32 路径模板”记法,简洁地写明对路径的约束。钱包作者可以用它声明自家软件使用的路径,改善换钱包与恢复旧钱包的体验;设备与应用也可以据此执行应用专属的路径限制(例如按应用配置不同的模板档案,当然要防止恶意或错误的档案被装上)。知名模板可以预置在设备里,用户也可关掉与自己无关的那些。
四、规则本身
4.1 模板结构
模板以可选前缀 m/ 开头,随后是一段或多段以 / 分隔的区段(section);实现可以限制区段数量。每段由一个“索引模板”加可选的硬化标记(' 或 h)组成。索引模板有三种:
- 单位索引模板:一个 0 到 2147483647 的整数,只匹配该值;
- 通配索引模板:单个
*,匹配 0 到 2147483647 的任意值; - 区间索引模板:
{内以逗号分隔若干“索引区间”,再以}收尾;区间可以是单个值(单位区间),也可以是起-止(非单位区间)。
索引模板后跟硬化标记,表示该段所有取值都要加上 2147483648 再匹配。解析结果可表示为“区段的列表,每段是 (range_start, range_end) 区间的列表”。
4.2 无歧义约束(节选)
为保证同一模板只有一种写法、机器解析不产生歧义,原文定了一组细则,例如:
- 模板内不得出现空白;逗号只能出现在区间之间;
- 只匹配单个值的区间必须写成单位区间;
0-2147483647不许这样写,必须改用*; - 非单位区间右端必须大于左端;多区间时,后一区间的起点必须大于前一区间的终点;
- 大于 0 的整数不得带前导零;
- 某段出现硬化标记时,其前面所有段也必须带硬化标记且用同一种标记(同为
h或同为'); - 不得有结尾斜杠或重复斜杠。
原文另给出两条可选的加强规则,使“匹配同一路径集合的模板”在字符串层面也唯一,从而可以直接比字符串判等。
4.3 完整模板与部分模板
以 m/ 开头的是完整模板,匹配整条路径;不以 m/ 开头的是部分模板,匹配路径的一部分(适用于前缀固定、后缀动态等场景)。完整模板可与部分模板拼接成更长的完整模板;部分与部分可拼成更长的部分;两个完整模板不可拼接。实现必须支持完整模板的解析与匹配;对部分模板的解析、匹配与拼接则为可选。
4.4 匹配算法
把待匹配路径表示为整数列表(非硬化索引取 0 至 2147483647,硬化索引取 2147483648 至 4294967295):
- 路径长度与模板长度不同,直接失败;
- 对每个位置的值,若它落在该段所有区间之外(小于每个区间的起点或大于每个区间的终点),失败;
- 否则匹配成功。
4.5 例与形式化规范
原文示例:m/{44,49,84}'/0'/0'/{0-1}/{0-50000} 一条模板同时覆盖 BIP-44、49、84 的外部与内部链,并把地址索引上限压到 50000。
规范还附有 TLA+ 写成的形式化规范(解析器的有限状态机与匹配公式),可配合 TLC 检查器生成测试数据;原文写作时已有三份实现(C 的 FSM 实现、兼容 micropython 的 Python FSM 实现,以及 python-bitcointx 中的非 FSM 实现)。只由单位索引模板构成的完整模板,本身就是一条合法的 BIP32 路径。
五、谁必须动
普通持币人:无直接动作。受益点在换钱包、恢复旧钱包时,新软件能凭模板准确知道旧软件用过哪些路径。
钱包开发者:可用模板声明自家路径集合,也可让软件按模板校验即将使用的路径是否越界,而不是把知名路径逐条硬编码。
硬件设备与固件厂商:可预置知名模板、按应用加载路径限制档案,在签名环节挡下异常路径——尤其是防止找零落到未知路径。
全节点与矿工、共识层:无须改动,本 BIP 与链上规则无关。
六、现在算不算数,以及一个常见误读
状态为 Complete(已完成),表示这份信息类规范已经定稿,可供软件实现采用;它不创造新的派生方案,也不要求任何钱包改用某种路径。
常见误读:“BIP-88 是一套新的派生路径方案,我的钱包应该改用它派生地址。”
不对。BIP-88 只定义“怎样书写和判定路径的约束”,即模板这门记法;具体用 44’、84’ 还是自定义路径,仍由各派生方案与钱包决定。模板管的是边界,不是地址本身。
