术语表 /协议与升级
软分叉
- 软分叉是什么?
- 软分叉(soft fork)是收紧比特币规则的一种升级方式,按新软件规则有效的区块,在旧软件看来依然有效,因此网络得以升级,而无人被迫离开这条链。
比特币实际部署过的每一次升级都是这样运作的。规则变得更严格,意味着旧节点仍然接受新区块,因为这些区块没有违反旧节点所知的任何规则。2012年4月至2021年11月之间的软分叉为比特币带来了脚本哈希地址、时间锁、SegWit 和 Taproot,而且没有一次让任何钱包被抛下。
运作方式
软分叉会缩小有效区块的范围,因此升级后的网络产生的一切区块,在旧规则下本来就是合法的。
使这一点成为可能的诀窍在于,比特币的脚本语言有意留出了一些口子。十个操作码被定义为空操作,执行后直接成功而不做任何事;而一种尚无人定义的输出类型,则被视为任何能满足其条件的人都可以花费。软分叉就是从这些口子之一穿过:取一个旧节点直接放行的东西,再给它附加一项真正的要求。OP_NOP2 在2015年12月成为 OP_CHECKLOCKTIMEVERIFY,OP_NOP3 在2016年7月成为 OP_CHECKSEQUENCEVERIFY,而对于2014年的节点来说,两者在仍能通过的脚本中依然是空操作。
其结果是各方分工不同。未升级的节点继续验证它们所知的每一条规则,并与所有人保持在同一条链上。升级后的节点验证得更多。矿工是真正必须行动的一方,因为未升级的矿工可能构造出升级后节点拒绝的区块,丢掉奖励,并把跟随他们的人拖入注定失败的分支。
这就是为什么难点在于激活而不是代码。如果大部分算力执行新规则,违反该规则的区块就会成为孤块,收紧得以固定下来。如果不是这样,网络就会沿着软分叉本来要避免的断层分裂。比特币尝试过几种确立这一多数的方式:对区块版本的绝对多数计数、BIP-9的版本位方案、BIP-8的超时选项,以及用于 Taproot 的为期三个月的 Speedy Trial 窗口。
软分叉还可以用硬分叉做不到的方式撤销。由于新规则是旧软件从未要求过的限制,放弃它会让所有人回到一条所有版本仍然视为有效的链上。
购买比特币时为何重要
坦率地说,软分叉正是比特币升级从未让普通持有者付出任何代价的原因。
没有迁移,没有截止日期,也没有可能错过的公告。存放在2013年创建的 P2PKH 地址中的比特币,今天用同一个密钥和同样的软件仍可花费,此后的每一次软分叉都小心地保持了这一点。与您使用的任何其他金融平台相比,这是该系统最被低估的一项特性。
您能察觉到的是滞后,而且出现在边缘环节。协议激活一种新的输出类型;钱包要花一年才将其设为默认;交易所要更久才允许您提币到该类型地址;有些则始终不支持。在本站评测的交易所中,支持向 bech32 地址发送目前已属常规,而支持 bech32m 的 Taproot 目标地址仍参差不齐,这是一项从第一天起就已是共识规则的变更,却滞后了四年。决定您能否真正使用一项新功能的,是这一差距,而不是协议本身。
由此得出的实用规则很简单。请备好一个较旧类型的地址,供尚未跟进的平台使用,并在假定某种格式可用之前先查看提币页面。提币地址被拒绝只是麻烦;而就一个已被接受却随后失败的地址提交支持工单,则更糟。
Pay to script hash,让多重签名变得可用的软分叉
P2SH 是最早值得研究的软分叉,因为它以缩影的形式展示了这一模式。
在2012年4月之前,向多重签名安排付款,意味着付款人必须把整段脚本放进他们所注资的输出里。这让发送方要为他人的安全策略负责,产生了体积庞大的输出,也使得印刷或口述地址成为不可能。BIP-16将这一切替换为脚本的20字节哈希,并包装成以数字3开头的地址。
对运行旧规则的节点来说,输出脚本是一次哈希比较,当花费者压入匹配的数据时即成功。对运行新规则的节点来说,被压入的数据随后会作为脚本执行,并且本身也必须得到满足。新规则严格来说更强,因此旧节点接受每一笔有效的新花费,这正是软分叉的定义。
激活过程十分混乱,此后这种情形不断重演。一项竞争性提案 BIP-17使开发者意见分裂;截止日期从2月1日推迟到2012年4月1日;矿工则通过在所挖区块中写入字符串 "/P2SH/" 来表示支持。现存几乎所有以3开头的地址,包括交易所为充币提供的地址,都源自那场争论。
软分叉 vs BIP
BIP 是一份文档;软分叉是节点所执行的规则。BIP-341是 GitHub 仓库中的一个文本文件,任何人都可以写出,而 Taproot 则是在2021年11月14日的区块709,632成为共识规则的内容。这一区别很重要,因为大多数 BIP 从未激活,BIP-17和各类契约提案都在其列;还因为一次软分叉往往同时涉及多份文档,SegWit 就涉及 BIP-141、BIP-143、BIP-144和 BIP-147。在想说一项已激活的规则时说出 BIP 编号,在谈话中无伤大雅,但在您想弄清自己的节点实际执行什么时,则会造成误导。