协议演进 / BIP/比特币改进提案 / BIP-148
BIP-148
以旗帜日方式强制区块为隔离见证信号,逾期拒绝不信号的区块,促成既有 BIP9 部署激活。本 BIP 目前处于已激活状态。
一、档案卡
| 编号 | BIP-148 |
|---|---|
| 标题 | Mandatory activation of segwit deployment |
| 作者 | Shaolin Fry <[email protected]> |
| 指定日期 | 2017-03-12 |
| 层级 | Consensus (soft fork)(共识(软分叉)) |
| 类型 | Specification(规范类) |
| 状态 | Deployed(已激活) |
| 阅读版 | https://bips.dev/148 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0148.mediawiki |
二、放在哪一族
软分叉激活机制族中很特殊的一篇:它自己不引入任何新的协议功能,只负责“催”另一个部署生效。被它催的,是 BIP-9 版本位框架下名为 “segwit” 的既有部署——即 BIP-141、BIP-143、BIP-147 这一包规则。
同族关系:
BIP-16:P2SH,当年以预定旗帜日(flag day)方式激活;原文明确说本篇效仿的正是这种做法
BIP-9:版本位部署框架,既有 segwit 部署跑在它上面
BIP-149:隔离见证(第二次部署),同一作者的后续备选方案,针对“第一次部署到期仍失败”的情形
理解本篇,关键在于分清三层:功能(141/143/147)、部署窗口(BIP9)、以及本篇的强制信号规则。
三、它要解决什么
原文的动机部分先列了隔离见证的好处:扩大区块容量、修复交易可锻性、让脚本更容易升级等。随后点明处境:既有 segwit 部署自 2016 年 11 月 15 日启动、到 2017 年 11 月 15 日到期,采用的是矿工信号达到阈值才锁定、激活的常规路径;若信号迟迟不足,这套规则就会在到期时无声失效。
作者的希望写得很明确:最好是矿工响应本篇、赶在本篇真正生效之前就主动让 segwit 提前激活;否则,本篇将强制既有部署在 2017 年 11 月 15 日午夜之前完成激活。
办法不是再开一次新部署,而是改变“什么样的区块算数”:在本篇生效窗口内,不为 segwit 信号的区块会被运行本篇的节点直接拒绝。矿工若想让自己的区块被这部分节点接受,就只能信号——信号率被这样推上去,既有部署便按它自己的 BIP9 规则锁定并激活。
四、规则本身
4.1 先说清术语
原文所称的“既有 segwit 部署”,指使用位 1(bit 1)、运行于 2016 年 11 月 15 日至 2017 年 11 月 15 日之间的 BIP9 “segwit” 部署,目标是激活 BIP-141、BIP-143 与 BIP-147。
4.2 生效窗口与自动停用
全部时间均按中位过去时间(median past time)计。本篇在下述条件下处于生效状态:
- 时间在 2017 年 8 月 1 日午夜(时间戳 1501545600)至 2017 年 11 月 15 日午夜(时间戳 1510704000)之间;
- 且既有 segwit 部署在此前(1501545600 之前)尚未锁定或激活。
一旦 segwit 被锁定,本篇即停止生效——它的目的达到之后,规则自行退场。
4.3 强制信号规则
本篇生效期间,所有区块的 nVersion 头部必须:把最高 3 位设为 001,并按既有 segwit 部署的要求置起位字段中的 (1«1)。不满足这一信号要求的区块,将被拒绝。
原文给出的参考实现正是这一判定:先检查 segwit 是否已锁定或已启用;若都没有、且当前中位过去时间落在上述窗口内,则逐块检查版本位与 segwit 信号位,缺一即以 “bad-no-segwit” 拒绝该区块。
4.4 向后兼容
本篇与既有 “segwit” 位 1 部署完全兼容,用的就是同一个部署窗口与同一个信号位,不需要发布一套新的部署参数。
4.5 历史先例(原文的论证)
原文的理由部分回顾了 BIP-16(P2SH):它当年就是在预定旗帜日由节点开始执行新规则而成功激活,且问题相对很少。本篇的推论是:在既有部署的最后一个月里孤立(orphan)不信号的区块,可以在不另发新部署的前提下,促成既有部署激活。
五、谁必须动
普通持币人:是否“动”取决于是否运行执行本篇的节点软件。持币人本人不产生区块,规则不直接约束钱包的收付行为;但运行此类节点的用户,等于用自己的验证规则为强制信号投票。
钱包开发者:不涉及钱包功能。本篇不改变交易格式、地址或签名。
全节点与矿工:节点一方是规则的执行者——在窗口内拒绝不信号的区块;矿工一方是被约束者——想让区块被执行本篇的节点接受,就必须按要求置起版本位与 segwit 信号位。原文希望的结果,是矿工在窗口到来之前就主动信号,让本篇不必真正发力。
共识层:本篇是一次有明确起止的临时共识收紧(软分叉方向):它收紧的是“区块头必须信号”这一接受条件,且自带停用条件,不改动 segwit 本身的任何一条规则。
六、现在算不算数,以及一个常见误读
状态为 Deployed,中文状态记为已激活。理解它的现状要连着它的设计看:这是一条“用完即退场”的规则——窗口止于 2017 年 11 月 15 日,且 segwit 一经锁定它便停止生效。因此今天它不作为一条日常执行的共识规则存在,它的意义在于激活史上:它代表了一种不依赖再开新部署、由节点强制信号以推动既有部署落地的路径。原文之后的历史细节不在本篇原文范围内,本页不另行展开。
常见误读:
“BIP-148 是隔离见证的第二次部署。”
不对。本篇反复强调它作用于“既有”部署:不新设部署名、不新设信号位、不改时间窗口,只是给旧部署加了一条带截止日的强制信号规则。真正以“第二次部署”为题的是同作者的 BIP-149,那是为第一次部署到期失败准备的另一套方案。
七、延伸
- 阅读版:https://bips.dev/148
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0148.mediawiki
- 相关:BIP-141 隔离见证(共识层)、BIP-16 P2SH、BIP-9 版本位、BIP-149 隔离见证(第二次部署)
- 仓库总目录:https://github.com/bitcoin/bips
