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

BIP-142 隔离见证地址格式

为原生隔离见证的 P2WPKH 与 P2WSH 定一种沿用 Base58 的新地址格式:在旧地址布局中塞入见证程序版本字节,靠地址版本字节区分 20 与 32 字节程序。本 BIP 目前处于已关闭状态。

一、档案卡

档案卡
编号BIP-142
标题Address Format for Segregated Witness
作者Johnson Lau <[email protected]>
指定日期2015-12-24
层级Applications(应用)
类型Specification(规范类)
状态Closed(已关闭)
阅读版https://bips.dev/142
官方原文https://github.com/bitcoin/bips/blob/master/bip-0142.mediawiki

二、放在哪一族

SegWit 地址格式族,是 BIP-141 落地时必须配齐的一块:共识定了见证程序长什么样,钱包之间还得有一种统一的地址写法,用户才能把“付给这个见证程序”说出口、写下来。

它与同族文档的关系:

BIP-141:隔离见证(共识层)。本 BIP 的地址只服务于它定义的 P2WPKH 与 P2WSH 两种输出,其 scriptPubKey 都是 OP_0 后跟一个推送:20 字节哈希或 32 字节哈希。

BIP-13:P2SH 地址格式。本 BIP 在理据中以它为参照:P2SH 地址 2012 年已定义,用见证嵌套进 P2SH 的过渡办法,多数既有钱包无须升级即可付给 SegWit 兼容钱包。

BIP-16:Pay to Script Hash。嵌套路线所依靠的机制;P2WSH 地址被原文类比为见证版的 P2SH 地址——前者只管付给单个公钥,后者可承载任意复杂的 SegWit 交易。

BIP-173:原生见证输出的 Base32 地址格式,被 BIP-141 列入参考文献。BIP-142 状态已关闭,今天的原生 SegWit 地址不应再按本页的 Base58 写法去构造,本页是为存档与对照而读。

三、它要解决什么

动机只有一句:为原生隔离见证交易定义标准收款地址,以推动这种更高效交易方式的早期采用。

背景在理据部分说得更细。BIP-141 给了两种用见证程序的方式:原生的 scriptPubKey(版本字节推送加见证程序推送,除此之外无他),与见证嵌套进 P2SH 的方式(scriptPubKey 外观是普通 P2SH 输出)。后者靠 BIP-13 已在 2012 年定义的 P2SH 地址即可过渡,多数现有钱包不用升级就能付款;但它占用更多区块空间,原文定位它只是让过渡更平滑的短期方案,最终所有用户都应转用更高效的原生见证程序为主要付款方式。

障碍在于地址生态的惯性:原文说,Base58 的 scriptPubKey 模板地址尽管不理想,却是整个生态——钱包、区块浏览器、商户、交易所到终端用户——通行的标准;此前虽有更好的付款方式被提出或部署,都没有它普及。因此作者判断,为 P2WPKH 与 P2WSH 提出一种尽量沿袭旧地址习惯的新格式,是让钱包与服务采用原生见证程序最容易的路,对区块链扩容也格外重要。

四、规则本身

4.1 编码布局

新地址面向 BIP-141 的 P2WPKH 与 P2WSH 交易编码,方式与既有地址格式相似,做 Base58 编码,内容依次为:

[1 字节地址版本]
[1 字节见证程序版本]
[0x00]
[20 或 32 字节哈希]
[4 字节校验和]

校验和是对前面各项序列化做双重 SHA256 后取前 4 字节。

地址版本字节按类型与网络分四种:

其后紧跟的见证程序版本是 1 字节,取值 0(0x00)到 16(0x10);BIP-141 只定义了版本 0,版本 1 到 16 留作未来扩展。再其后是一个 0x00 填充字节,用途是保证每个见证程序版本都有唯一前缀。填充之后才是程序哈希:P2WPKH 地址为 20 字节,P2WSH 地址为 32 字节。

4.2 长度与前缀

按此方案生成的地址长度恒定:20 字节哈希的地址共 36 个字符,32 字节哈希的地址共 53 个字符。

不同见证程序版本有唯一前缀,原文给出完整对照表。例如版本 0 时:20 字节主网地址前缀为 p2、测试网为 QW,32 字节主网为 7Xh、测试网为 T7n;版本 1 到 16 各有自己的一组四前缀(主网与测试网、20 与 32 字节各一)。付款方光看前缀,就能分辨这是哪个见证版本、多长的程序。

4.3 一个完整的例子

原文例子取一个公钥,按 P2PKH 模板编码时 scriptPubKey 为:

DUP HASH160 <010966776006953D5567439E5E39F86A0D273BEE> EQUALVERIFY CHECKSIG

对应的版本 1 地址是 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM。

同一公钥编码为 P2WPKH 时,scriptPubKey 变为:

OP_0 <010966776006953D5567439E5E39F86A0D273BEE>

用 0x06 作地址版本、0x00 作见证程序版本、再加 0x00 填充,等价的 P2WPKH 地址是 p2xtZoXeX5X8BP8JfFhQK2nD3emtjch7UeFm。

4.4 兼容性

原文把话说得很直白:本提案不是向后兼容的。旧实现会把新地址类型报为无效、拒绝据此创建交易。

它倒是向前兼容的:未来版本的 20 与 32 字节见证程序都可以沿用这套格式,因为见证程序版本字节与唯一前缀机制已在格式里留好了位置。

五、谁必须动

普通持币人:按本 BIP 的历史定位,若钱包采用这套格式,持币人收款时给出的是以 p2 等前缀开头的新地址,付款方钱包不认就付不了。本页今天只作存档读,不要再拿它生成收款地址。

钱包开发者:这是原定的实现方。要按四种地址版本字节编解码、在地址中装入见证程序版本与填充字节、校验双 SHA256 校验和,并对旧实现不认新地址这一不兼容点做产品提示。

全节点与矿工:无须为地址格式改动。地址是应用层的编码约定,不进共识;节点验证的是 scriptPubKey 本身,而不是用户之间转述的地址串。

共识层:不动。本 BIP 只借用 BIP-141 已定义的输出形式,不提出任何共识规则。

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

状态为 Closed(已关闭)。这套 Base58 新地址没有成为原生 SegWit 的通行地址格式——BIP-141 的参考文献把地址出口指向 BIP-173 的 Base32 格式。本页的价值在于存档:它完整记录了在 SegWit 定稿前夕,生态曾认真考虑过一条“尽量不动用户习惯”的地址路线,以及这条路线具体的编码长相。

读关闭的提案要分清两层:它描述的 P2WPKH 与 P2WSH 输出本身是现行共识的一部分,真实有效;被关闭的是把它们写成这种 Base58 地址的那层编码约定。

常见误读:

“地址以 p2 开头也是 SegWit 地址的一种,钱包应该都认。”

不对。本页地址格式状态是 Closed,不是通行标准;旧实现按原文就会把这类新地址报为无效。见到 p2 开头的 36 字符或 53 字符串,应把它当作本 BIP 的历史方案来识别,而不是当作今天可放心付款的原生 SegWit 地址去使用。

七、延伸

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