矿机的额外随机数从哪来:BIP-323 划走的 24 个版本位 图 1
矿机的额外随机数从哪来:BIP-323 划走的 24 个版本位 · 图 1

矿工想要产出一个区块,本质上是在一个 80 字节的区块头里不断改数字重算哈希,直到撞出低于难度的值。可改的格子就那么几个:交易根、时间戳、难度目标、还有一个 4 字节的版本字段。跑在矿池体系里的专用矿机大多只拿区块头干活(专业说法是”只挖头”),每当矿池分派的活儿算完,它就得等新任务才能换交易根——于是大家盯上了版本字段里的空位。BIP-323 就是把其中 24 个位正式划给矿机当随机数用的提案,目前状态 Draft(草案)。这篇讲清楚版本字段的位怎么分、这 24 位从谁手里来、以及对普通用户意味着什么。

版本字段原本的两用途

版本字段的前三个位固定为 1,中间一段留给软分叉投票信号,尾部几位也有约定——投票与提示这两套机制(BIP-8 与 BIP-9)都靠解析这个字段判断矿工在支持哪个提案。过去曾有一份把 16 个版本位划作通用随机数的早期提案,其思路是让这些位不参与信号解析。

为什么 16 个位不够用

提案给出的理由很工程化:已经有矿机开始把时间戳字段的低位拿来当额外随机数用——这意味着矿机宁可去动”一秒只能挪一次”的时间戳,也不肯等新任务。时间戳被高频拨动会带来两个问题:区块时间戳精度被滥用,以及矿机仍然受限于每秒一次的拨动节奏。与其禁,不如给够:把版本字段第 5 位到第 28 位(含两端)共 24 位正式划为随机数空间,够矿机自己排几分钟到几小时的活儿。

掩码 0xe000001f 怎么读

规范原文要求软分叉信号解析时给版本字段套上这个掩码。把十六进制展开:二进制里 0xe000001f 保留的是最高的三个固定 1 位与最低的五个位,被清零忽略的中间第 5 位到第 28 位(共 24 位)就是本提案预留的随机数区。翻译成人话:节点今后判断”这个区块在投票支持哪个升级”时,必须无视这 24 位的任何花样。同时规范强调,未来的软分叉也不该再用这些位做激活信号——位子一旦给了矿机,就不能再要回去。

为什么宁可动用版本位也不动时间戳

拿时间戳充当额外随机数的隐患值得展开。共识规则允许区块时间戳在一定范围内偏离真实时间,于是矿机软件把低位时间戳每哈希一轮就加一,等效于免费多了几千到几百万次尝试。代价有三处:区块时间精度被系统性推向边界,链上按时间排序的协议更依赖这个字段的诚实度;节点要花费带宽反复接受时间戳微调的候选头;而且时间戳每秒才允许有意义地前进一次,超出后即失效。BIP-323 在理由部分明确说”在版本字段里做这件事优于用时间戳”——把随机数从时间语义里剥离回纯数字空间,时间戳回归报时本职。

状态是 Draft:还没生效的规则只能预测影响

这份提案 2026 年 4 月才写进讨论稿,它自己声明的前提是:写作时正在被投票的软分叉没有一个用到这 24 位。也就是说,提案试图在”和平时期”圈地,避免将来与某个信号提案抢位。但 Draft 距离部署很远:矿机固件、矿池协议、节点实现三方都要跟上。在提案被实际采纳前,链上的版本字段高位该置位照旧置位。

普通用户需要做什么:几乎什么都不用做

矿工与矿机圈的内政,对钱包用户只有一个薄侧面:任何解析区块头版本字段的工具(自建的浏览器脚本、投票状态看板)要按掩码读,否则矿机置位的版本值可能被老节点误读成”在支持某个不存在的软分叉”并触发未知提案告警。验证一笔交易是否被某高度区块收录,用区块哈希逐层回溯的手动方法在 ‘钱包恢复时少了一串地址:派生路径、扫描窗口与找零导致的两种看不见’ 讲过,同一套区块定位思路正好用来观察版本字段各段的实际取值。其余时间,把它当一条矿机效率优化就好——它不改变地址、不改变交易、也不改变你钱包里的任何东西。