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

BIP-320 nVersion 位通用

把区块头 nVersion 的第 13–28 位共 16 位预留为通用用途,并将它们移出 version bits 软分叉信号的含义范围。本 BIP 目前处于草案状态。

一、档案卡

档案卡
编号BIP-320
标题nVersion bits for general purpose use
作者BtcDrak <[email protected]>
指定日期2018-03-01
类型Specification(规范类)
状态Draft(草案)
接替文档Proposed-Replacement: BIP-323
阅读版https://bips.dev/320
官方原文https://github.com/bitcoin/bips/blob/master/bip-0320.mediawiki

二、放在哪一族

区块头与软分叉信号族。区块头的 nVersion 字段一身二任:一边是版本号本身,一边自 BIP-9 以来被 version bits 机制借用作矿工软分叉信号位。BIP-320 处理的正是这两任之间的冲突:把一部分位正式划出信号用途,留给矿工自由使用。

它的上下游关系清楚:

BIP-9:Version bits with timeout and delay,信号机制本身

BIP-8:Version bits with lock-in by height,另一套部署参数

BIP-310:Stratum 协议扩展;矿工与矿池协商滚动哪些位,走的就是本 BIP 划出的这片空间

BIP-323:本 BIP 的提议接替者,把预留从 16 位扩大到 24 位

三、它要解决什么

3.1 矿工想用这些位,节点却会误报

原文动机说得很直接:矿工出于各种目的想使用 nVersion 字段的一些位;但因为这些位被用来协调矿工激活的软分叉,全节点软件在这些位被用于软分叉信号以外的目的时,会发出“未知软分叉”的误报警。

解法不是禁止矿工用,而是先把一部分位预留给通用用途,再让节点软件更新为忽略这些位,从此不再误报。原文算过账:预留 16 位之后,还剩下足够 13 个软分叉用 version bits 并行信号的空间。

3.2 例一:nonce 空间不够用

原文举的第一个例子是挖矿硬件:现有硬件能在不到 200 毫秒内耗尽 32 位 nonce 字段,控制器不得不非常频繁地向每颗挖矿芯片分发新任务,消耗大量带宽与 CPU。多滚一些位可以大幅缓解这个问题;而过多地滚动 nTime 并不理想,因为它会在更长时间尺度上扭曲时间戳。

3.3 例二:AsicBoost 需要两位

第二个例子是 version-rolling 形式的 AsicBoost:它需要 nVersion 字段中的两位来计算四路碰撞。任意两位都可以用,挖矿设备可以经由 Stratum 的 “version-rolling” 扩展与矿池协商具体用哪两位——这正是 BIP-310 规范的机制。

四、规则本身

4.1 预留范围与掩码

区块头 nVersion 字段中第 13 位到第 28 位(含两端)、共 16 位(0x1fffe000)预留为通用用途,并从 BIP-8 与 BIP-9 的规范中移除。判断软分叉信号时应对 nVersion 施加掩码 0xe0001fff,使第 13–28 位对软分叉信号与未知软分叉警告一律被忽略。

4.2 不指定具体用途

原文明确:本规范不为任何特定目的预留特定位。划出的是一片“通用”空间,具体哪一位给哪种用途,由矿工、矿池与相关协议(如 Stratum 的 version-rolling 协商)自行约定,不归本 BIP 管。

4.3 参考实现与兼容性

原文给出作者仓库中的一笔提交作为参考实现。向后兼容方面:

五、谁必须动

普通持币人:无事可做。本 BIP 只动区块头位的解释,不涉及地址、交易与钱包。

全节点:这是主要的行动方——更新软件,在评估 version bits 信号与未知软分叉警告时对 nVersion 施加掩码,忽略第 13–28 位。不升级的节点在共识上仍能跟随链,只是可能对正常挖矿活动发出误报警。

全节点与矿工:矿工可以在预留范围内滚动 nVersion 位以扩大 nonce 空间或做 AsicBoost,与矿池之间通过 BIP-310 的协商确定具体用位;出块时不应指望这些位还能传达软分叉立场。

共识层:本 BIP 不改变区块有效性规则,原文明确其不需要软分叉部署。它改的是信号解释的约定:哪些位还算“投票”,哪些位从此只是矿工的自由空间。

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

状态为 Draft(草案),且原文带有 Proposed-Replacement 标记,指向接替它的 BIP-323:后者认为 16 位仍不够用,主张预留 24 位。因此读 BIP-320 要注意两点:一是它仍是草案而非已生效规则;二是这条线上的现行讨论已经推进到 323,本篇是理解来龙去脉的起点。

常见误读:

“把 16 位划为通用,等于比特币放弃了 16 个软分叉信号位。”

原文的口径不是放弃,而是划界:划走 16 位后仍留有足够 13 个软分叉并行使用 version bits 的空间;而且不这样划界,矿工的正常滚动行为会不断触发节点的未知软分叉误报,反而让真正的信号警告失去可信度。

七、延伸

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