节点选链看最重不是最长:累计工作量怎么决定哪条是正史 图 1
节点选链看最重不是最长:累计工作量怎么决定哪条是正史 · 图 1

一、“最长链”是简化说法

白皮书和早期材料常说节点跟随”最长的链”。实现里真正执行的规则更准确的说法是:在所有尚未被标记为无效的候选链尖里,选累计工作量最大的那条。节点源码的选链函数注释写得直白:返回”包含最多工作量的链的链尖”。区块数量相同、难度贡献不同,结论就会不同——十条低难度块和一条高难度块比,后者可能更重。把”最长”当教条的人会在难度剧烈变化的时段得到错误预期。

节点选链看最重不是最长:累计工作量怎么决定哪条是正史 图 2
节点选链看最重不是最长:累计工作量怎么决定哪条是正史 · 图 2

二、工作量是什么单位

每写下一个有效区块,链就按该区块难度对应的预期尝试次数累加一份工作,单位习惯叫 work 或 chainwork,量纲大致是”猜多少次哈希”。难度越高的时期出的块,每块贡献的工作越大。这个数值可以从 RPC getblockheader 的结果里读到,叫 chainwork,是个十六进制大数。发行流程里就正式使用它:每个大版本发布前要按选定高度取该点的累计工作量,编译进二进制作为”最低链工作量”下限——新节点用它抵御被伪造轻链拖住的攻击。也就是说,工作量不只是选链尺子,也是节点的防欺骗底线。

三、选链循环在做什么

节点维护一张所有已知区块的树。收到新区块头,它挂到树上;每次需要决定”当前最可信的链尖”时,选链循环从候选集合里挑工作量最大者,验证通过后把状态机迁移过去——需要回退多少层就回退多少层,把撤销的块逐块断开,再把正史块逐个接上。被标记无效的分支(校验失败或手动 invalidateblock)会被排除出候选,并连带其上的后代一起降级,直到找到一条不再经过无效块的链尖。整个过程是确定性的:同样看到这些区块的节点,必然选中同一条链。

四、重组那天你会看到什么

当更重的侧链反超,正史的一部分区块被撤销,这些区块里打包的交易回到未确认池排队——交易没丢,只是回到”待入账”状态,除非其中有输入已在另一侧被花掉而变成冲突交易。反过来被接上来的侧链块里的交易突然”到账”。这就是为什么依赖未确认转账的收款方危险:你看到的余额本来就建立在”当前最重”这个随时可改的判断上。确认数的意义也随之清晰:它不是物理定律,而是”这条链被推翻所需的工作量大概相当于再挖多少个块”的风险计价。

五、给普通读者的三条结论

第一,看链尖状态请读 chainworkgetchaintips,别用肉眼数块数。第二,大额收款的等待标准按重组概率设,而不是”反正规则是最长链”。第三,遇到本地节点突然回滚很多层,先怀疑同步异常或非法链数据,而不是世界末日:节点只是在选择它所见过的最重的历史。

补充:读链尖状态的实操组合

给运维一个固定组合:getblockchaininfochainworkheaders 高度看当前主张,getchaintips 列出所有可见分支的高度、工作量和状态,两者对不上就说明有分支在暗处生长。难度剧烈波动的时段(比如算力大规模迁移前后)把 chainwork 的增速记成曲线,比盯瞬时出块间隔更能反映网络真实状态。最后提醒一句:任何声称”权威”的单节点观察都只是这台节点的视角,结论涉及安全判断时至少交叉两台不同网络路径下的节点,这和区块浏览器要多源核验是同一条原则的节点版。