协议演进 / BIP/比特币改进提案 / BIP-393
BIP-393
在描述符末尾用类似 URL 查询字符串的语法挂上起始区块、间隔上限等恢复用元数据,不改变描述符产出的任何脚本。本 BIP 目前处于草案状态。
一、档案卡
| 编号 | BIP-393 |
|---|---|
| 标题 | Output Script Descriptor Annotations |
| 作者 | Craig Raw <[email protected]> |
| 指定日期 | 2026-03-17 |
| 层级 | Applications(应用) |
| 类型 | Specification(规范类) |
| 状态 | Draft(草案) |
| 依赖 | BIP-380 |
| 阅读版 | https://bips.dev/393 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0393.mediawiki |
二、放在哪一族
输出描述符与钱包恢复族。BIP-380 的描述符解决了“恢复时该派生哪些脚本与地址”,BIP-393 在同一根字符串上再补一层:恢复时实际需要的操作参数。
它也是 BIP-391 的接替文档:BIP-391 曾想用一整套二进制容器承载描述符与元数据,其变更日志写明在 BIP-393 提出另一种处理钱包元数据的方法后撤回;BIP-391 的文件头现标注 Proposed-Replacement 为 393。两条路线对照着读,能看出取舍:一个另造容器,一个只给原字符串加尾巴。
相关的还有 BIP-32(间隔上限针对其派生钱包)与 BIP-352(标签索引上限针对静默支付钱包)。
三、它要解决什么
BIP-380 引入描述符,是因为只备份私钥不够:恢复出的钱包不知道该派生哪些脚本与地址。但原文指出,描述符仍不携带恢复资金实际需要的操作参数,例如:
- 从哪个区块高度开始扫描区块链;
- 连续多少个未使用地址之后可以停下(gap limit,间隔上限);
- 对 BIP-352 静默支付钱包,要扫描到的最大标签索引。
缺了这些信息,恢复时实现只能从某个通用起始区块扫起,或依赖带外约定;间隔上限设得太低,还可能直接漏掉资金。
BIP-393 的办法:把这类元数据以紧凑的注解形式直接写进描述符字符串,所用字符都已在 BIP-380 的校验和字符集之内。
四、规则本身
4.1 一般形式
带注解的描述符长这样:
SCRIPT?key=value&key=value#CHECKSUM
问号 ? 分隔脚本表达式与注解;每条注解是一个用 = 连接的键值对,多条之间用 & 分隔;校验和按 BIP-380 的原算法、覆盖 # 之前的整个字符串(包括注解)计算。
4.2 语法约束
- 每个键在一条注解表达式中至多出现一次;每条描述符只许一个
?; - 键:一个或多个小写 ASCII 字母(
a–z); - 值:非负十进制整数,除
0本身外不得有前导零; - 注解键名采用缩写,以缩短写进二维码与备份材料中的描述符长度。
因此大写键、空值、缺值、负数、非整数、前导零、空键、尾随 &、重复键、多个问号等写法全部无效,原文逐一给出了无效示例。
4.3 已定义的注解键
| 键 | 含义 | 说明 |
|---|---|---|
bh |
起始区块高度 | 钱包首次收到资金的区块高度;实现应从此高度开始扫描 |
gl |
间隔上限 | 对 BIP-32 派生密钥钱包,连续派生多少个未使用地址后停止 |
ml |
最大标签索引 | 对 BIP-352 静默支付钱包,要扫描到的最大标签索引 |
4.4 语义
- 注解值是声明的下限:表示导出该描述符时恢复全部资金所需的最小值。在钱包的生命周期内这些值可以变大(例如用过的地址多了,间隔上限随之增长),但不应变小。
- 键值对的顺序不影响解读;但校验和是对字面字符串计算的,换顺序就会换出另一个校验和。
- 遇到不认识的注解键,实现必须忽略它,且不得因此拒绝整条描述符。
4.5 校验和为何不用改
分隔符 ?、=、& 本就都在 BIP-380 定义的 INPUT_CHARSET 里,所以现有校验和算法无需任何修改,直接把注解部分一并算入即可。
五、谁必须动
普通持币人:无直接变化。注解只是帮钱包在恢复时少走弯路,不改变地址与资金。
钱包开发者:导出备份时可附上 bh、gl、ml 等注解;导入时应据此扫描,并遵守“未知键忽略、不拒绝”的规则。不支持注解的旧解析器无法直接解析带注解的描述符,但可转换:删去第一个 ? 到 # 之间的内容,再按 BIP-380 重算校验和,即得普通描述符。
全节点与矿工:不涉及。描述符与注解都不上链。
共识层:不修改任何共识规则。
六、现在算不算数,以及一个常见误读
状态为 Draft。它在兼容性上是普通描述符的严格超集:没有任何注解的合法描述符依然合法、原样不变。原文没有给出各钱包的采用情况,不应臆测。同时它已被 BIP-391 的文件头列为接替文档,说明“元数据怎么跟描述符走”这一问题上,仓库目前指向的是注解路线,而不是二进制容器路线;但接替关系只是文档层面的指向,不等于注解语法已经定型。
常见误读:
“注解会改变描述符派生的地址,多写几个参数就多出一些账户。”
不对。原文明说注解传达的是操作元数据,目的是协助恢复资金,并不改变描述符产出的脚本。同一条描述符加上或去掉注解,派生的脚本与地址完全相同,变的只是恢复时从哪扫、扫多远。
七、延伸
- 阅读版:https://bips.dev/393
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0393.mediawiki
- 相关:BIP-32 分层确定性钱包、BIP-352 静默支付、BIP-380 输出描述符、BIP-391 二进制输出描述符(被本 BIP 接替)
- 仓库总目录:https://github.com/bitcoin/bips
