协议演进 / 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 字节。
地址版本字节按类型与网络分四种:
- P2WPKH:主网 6(0x06),测试网 3(0x03);
- P2WSH:主网 10(0x0A),测试网 40(0x28)。
其后紧跟的见证程序版本是 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 地址去使用。
七、延伸
- 阅读版:https://bips.dev/142
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0142.mediawiki
- 相关:BIP-141 隔离见证(共识层)、BIP-13 P2SH 地址格式、BIP-16 P2SH、BIP-173 原生见证地址格式
- 仓库总目录:https://github.com/bitcoin/bips
