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

BIP-391 二进制输出描述符

借用 PSBT 的键值映射格式,把 BIP-380 输出描述符连同密钥与元数据装进一个紧凑的二进制容器,便于钱包之间传递与备份。本 BIP 目前处于已关闭状态。

一、档案卡

档案卡
编号BIP-391
标题Binary Output Descriptors
作者SeedHammer <[email protected]>
指定日期2026-01-27
层级Applications(应用)
类型Specification(规范类)
状态Closed(已关闭)
接替文档Proposed-Replacement: BIP-393
阅读版https://bips.dev/391
官方原文https://github.com/bitcoin/bips/blob/master/bip-0391.mediawiki

二、放在哪一族

输出描述符与钱包备份族。BIP-380 定义了输出脚本描述符的文本语法:钱包用一段字符串说清“该派生哪些脚本与地址”。但描述符要在不同钱包、硬件设备之间传递、备份时,纯文本并不顺手,BIP-391 就是给它配的二进制容器格式。

它与同族文档的关系:

BIP-174:PSBT(部分签名比特币交易),其键值映射格式被本 BIP 直接借用

BIP-380:输出描述符的文本定义,本 BIP 编码的对象

BIP-389:多路径派生,密钥引用后可跟随其派生路径规则

BIP-393:描述符注解,给出了处理钱包元数据的另一种方法,现为本 BIP 的接替文档

三、它要解决什么

BIP-380 描述符是一段文本字符串。原文指出,它单独用于钱包之间传递时有三个不足:

而 BIP-174 的 PSBT 格式恰好现成:自带描述性结构、元数据位置,且密钥有紧凑的二进制表示。原文预期多数钱包已经实现 PSBT,因此在此之上再做一层容器,实现负担较低。

原文也交代了为什么不走其他路:PSBT 本身不是通用容器,所以不直接扩展 BIP-174,而是借用其编码另立格式——描述符在备份、初始化钱包软件等签名流程之外同样有用;Blockchain Commons 的旧格式 BCR-2020-010 已因使用保留的 CBOR 标签被弃用,新格式 BCR-2023-010 则是在 BIP 流程之外设计发布的,且基于更复杂的 CBOR 编码,不如 PSBT 的键值映射易审查、易在嵌入式设备上实现。

四、规则本身

4.1 整体结构

二进制输出描述符(Binary Output Descriptor,BOD)由三部分组成:固定文件头、一个描述该描述符的全局键值映射、以及每个密钥各一个的键值映射:

<bod> := <magic> <global-map> <key-map>*
<magic> := 0x62 0x6F 0x64 0xFF

其中键值对(keypair)的定义沿用 BIP-174。

4.2 全局映射

已定义两种全局类型:

描述符字符串中的所有密钥表达式都必须写成引用形式 @<index>,index 是密钥映射列表的 0 基下标;下标越界无效,带内联密钥的描述符同样无效。原文给出的理由是:允许内联密钥会诱使实现省略对被引用密钥的解析,产生不兼容。密钥引用之后可按 BIP-389 跟派生路径。

原文没有把描述符本身进一步二进制化:描述符语言复杂且仍在演进,为它维护一套二进制对应格式代价大、还会滞后于新特性;真正的体积大头是 base58 密钥,而密钥已经二进制编码且可被多次复用。

4.3 密钥映射

已定义两种密钥类型:

4.4 测试向量与实现

原文给出有效与无效测试向量,包括一个带名称与起始区块的 2-of-3 多签描述符,以及密钥引用越界、名称非合法 UTF-8、带内联密钥等无效情形。参考实现是一个 Go 实现,原文注明其仅供开发与测试、只校验 BOD 格式本身而不校验描述符,且不要用于生产环境。

五、谁必须动

普通持币人:无直接变化。这是一种备份与传递格式,不改变地址与交易。

钱包开发者:若要支持 BOD,需实现 PSBT 风格键值映射的读写、密钥的 @<index> 引用替换,以及起始区块、名称等元数据的处理。原文明确这是一个全新格式,没有既有兼容负担。

全节点与矿工:不涉及。BOD 不上链,节点无感。

共识层:不修改任何共识规则。

六、现在算不算数,以及一个常见误读

状态为 Closed。原文的变更日志写明:0.0.1 版为 2026-02-02 的初稿;0.0.2 版(2026-04-21)已撤回(Withdrawn),原因是 BIP-393 提出了处理钱包元数据的另一种方法。文件头也据此标注接替文档为 BIP-393。因此这份文档保留在仓库中供查考,但不应再按它实现新功能;处理描述符元数据,应看 BIP-393 的注解方案。

常见误读:

“ BIP-391 把描述符改成了二进制,文本描述符过时了。”

不对。它编码的仍是 BIP-380 的文本描述符本体——原文特意不把描述符语言本身二进制化,只把密钥改用二进制编码、再套上 PSBT 风格的容器。而且它本身已被关闭并由 BIP-393 接替,连这条容器路线也没有走下去。

七、延伸

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