协议演进 / BIP/比特币改进提案 / BIP-392
BIP-392
为静默支付定义 sp() 描述符与 spscan、spspend 两种密钥编码,让静默支付钱包能纳入现有的描述符备份与互操作体系。本 BIP 目前处于草案状态。
一、档案卡
| 编号 | BIP-392 |
|---|---|
| 标题 | Silent Payment Output Script Descriptors |
| 作者 | Craig Raw <[email protected]> |
| 指定日期 | 2026-02-06 |
| 层级 | Applications(应用) |
| 类型 | Specification(规范类) |
| 状态 | Draft(草案) |
| 依赖 | BIP-341、BIP-350、BIP-352、BIP-380 |
| 阅读版 | https://bips.dev/392 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0392.mediawiki |
二、放在哪一族
输出描述符与静默支付两族的交汇处。BIP-352 定义了静默支付:用一个静态地址收款,链上却不留下可关联的痕迹;BIP-380 定义了输出脚本描述符框架,钱包靠它统一表示“该派生哪些脚本”、实现互操作与备份恢复。BIP-392 做的就是把前者接入后者。
它依赖的文档:
BIP-341:Taproot,描述符最终产出的输出类型
BIP-350:Bech32m 编码,两种新密钥编码都用它
BIP-352:静默支付协议本身,定义扫描密钥与花费密钥的角色
BIP-380:输出脚本描述符总框架
此外,花费密钥还可以是 BIP-390 定义的 musig() 聚合密钥表达式(见第四节)。
三、它要解决什么
BIP-352 只定义了静默支付协议本身,没有规定钱包该如何用描述符来表示一个静默支付钱包。结果是:各钱包若各写各的表示方法,静默支付钱包就无法像普通描述符钱包那样跨软件导入导出、统一备份恢复。
BIP-392 补上这一层:给出一种标准化的描述符写法,让静默支付输出能纳入既有的描述符基础设施,钱包互操作与备份恢复都沿用现成机制。
四、规则本身
4.1 两种新密钥编码
原文定义两种密钥表达式,都采用 Bech32m 编码,数据部分先是一个字符 q(表示静默支付版本 0),再跟载荷;序列化规则沿用 BIP-352 的定义。
spscan:编码扫描私钥与花费公钥。载荷为扫描私钥的序列化拼接花费公钥的序列化。人类可读前缀:主网spscan,测试网tspscan。spspend:编码扫描私钥与花费私钥。载荷为两个私钥的序列化拼接。人类可读前缀:主网spspend,测试网tspspend。
区别在于是否含花费私钥:只有 spscan 的一方能发现收款、不能动钱;spspend 则扫描与花费都能做。
4.2 sp() 表达式
新增顶层脚本表达式 sp(),只能用作顶层描述符,不能嵌进 sh()、wsh() 等其他表达式。
单参数形式 sp(KEY):KEY 必须是 spscan 或 spspend 编码的密钥,可带密钥来源信息(指纹与派生路径);若带来源信息,它所指的,是按 BIP-352 推荐的子路径派生扫描与花费密钥的深度——扫描用 1h/0,花费用 0h/0。
双参数形式 sp(KEY,KEY):第一个是扫描密钥,必须是单个私钥(例如 WIF 压缩私钥或 xprv 扩展私钥)——因为扫描必须用到扫描私钥;第二个是花费密钥,可以是 BIP-380 或其他密钥表达式 BIP 定义的任一表示单个密钥的表达式,公钥私钥均可,例如 BIP-390 的 musig() 聚合密钥。
任何 sp() 表达式下都不允许未压缩密钥,因为 BIP-352 只允许压缩公钥。
4.3 产出什么脚本
sp() 描述符与发送方的输入公钥结合后,按 BIP-352 产出 P2TR 输出脚本,即 BIP-341 的 Taproot 输出。原文指出,这些输出在链上与普通 Taproot 输出无法区分。
4.4 用法
- 只看钱包(watch-only):用
spscan编码,或用双参数形式且花费密钥为公钥; - 完整钱包:用
spspend编码,或用双参数形式且花费密钥为私钥。
五、谁必须动
普通持币人:无直接变化。是否使用静默支付收款仍取决于钱包是否支持 BIP-352;本 BIP 影响的是钱包如何记录与备份这种钱包。
钱包开发者:需实现 sp() 顶层表达式、spscan/spspend 的编解码与校验(包括拒绝未压缩密钥、拒绝嵌套使用),才能让静默支付钱包以描述符形式导入导出。
全节点与矿工:不涉及。产出的是标准 Taproot 输出,节点无感。
共识层:不修改任何共识规则。
六、现在算不算数,以及一个常见误读
状态为 Draft。原文的参考实现与测试向量两节都标注 TBD(待定),说明这份规范还远未定型:写法已成文,但钱包是否、以及何时按它实现,原文没有给出任何采用情况,不应臆测。它也不改变 BIP-352 本身的地位——静默支付协议与它的描述符表示是两件事。
常见误读:
“有了 BIP-392,静默支付就有了新地址格式。”
不对。spscan、spspend 与 sp() 都是给钱包内部与备份用的描述符语法,不是对外收款的地址;收款方对外给出的仍是 BIP-352 的静默支付地址,最终上链的也只是普通 Taproot 输出。
七、延伸
- 阅读版:https://bips.dev/392
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0392.mediawiki
- 相关:BIP-341 Taproot、BIP-350 Bech32m、BIP-352 静默支付、BIP-380 输出描述符、BIP-390 MuSig2 描述符
- 仓库总目录:https://github.com/bitcoin/bips
