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

BIP-148 Segwit 部署的强制激活

以旗帜日方式强制区块为隔离见证信号,逾期拒绝不信号的区块,促成既有 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)计。本篇在下述条件下处于生效状态:

一旦 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,那是为第一次部署到期失败准备的另一套方案。

七、延伸

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