协议演进 / 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 引入描述符,是因为只备份私钥不够:恢复出的钱包不知道该派生哪些脚本与地址。但原文指出,描述符仍不携带恢复资金实际需要的操作参数,例如:

缺了这些信息,恢复时实现只能从某个通用起始区块扫起,或依赖带外约定;间隔上限设得太低,还可能直接漏掉资金。

BIP-393 的办法:把这类元数据以紧凑的注解形式直接写进描述符字符串,所用字符都已在 BIP-380 的校验和字符集之内。

四、规则本身

4.1 一般形式

带注解的描述符长这样:

SCRIPT?key=value&key=value#CHECKSUM

问号 ? 分隔脚本表达式与注解;每条注解是一个用 = 连接的键值对,多条之间用 & 分隔;校验和按 BIP-380 的原算法、覆盖 # 之前的整个字符串(包括注解)计算。

4.2 语法约束

因此大写键、空值、缺值、负数、非整数、前导零、空键、尾随 &、重复键、多个问号等写法全部无效,原文逐一给出了无效示例。

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 的文件头列为接替文档,说明“元数据怎么跟描述符走”这一问题上,仓库目前指向的是注解路线,而不是二进制容器路线;但接替关系只是文档层面的指向,不等于注解语法已经定型。

常见误读:

“注解会改变描述符派生的地址,多写几个参数就多出一些账户。”

不对。原文明说注解传达的是操作元数据,目的是协助恢复资金,并不改变描述符产出的脚本。同一条描述符加上或去掉注解,派生的脚本与地址完全相同,变的只是恢复时从哪扫、扫多远。

七、延伸

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