区块链(09):为何最长链未必有最多累计工作
两条有效历史竞争同一个后继位置时,“哪条包含更多块”不是足够的选择依据。工作量证明先要求头部摘要满足目标,区块还须符合交易和上下文规则;对通过验证的候选链,比较所累积的工作。区块链(08):钱包、描述符与 PSBT 的签名边界 的钱包只负责本地支出,不决定其他节点应当选择哪条历史。
模型假设是共同的合成创世哈希、可验证的前哈希连接和人为定义的“相邻时间间隔为 1 则目标除以 4”规则。Python SHA-256 穷举 nonce 得到两条分支:三块较易分支的 toy 工作量为 2+2+2=6,两块分支的 toy 工作量为 2+8=10。两分支共享第一块,短分支在第二块的目标变严。test_pow.py 还验证篡改目标、父哈希、头摘要、非满足目标的 nonce、时间戳都不能伪造更强候选。
flowchart LR
G[合成创世] --> C[共同块: 工作2]
C --> A1[慢分支块2: 工作2] --> A2[慢分支块3: 工作2]
C --> B1[快分支块2: 工作8]
A2 --> RA[总工作6]
B1 --> RB[总工作10]
这不是 Bitcoin 难度调整、区块头序列化或真实哈希目标分布;把玩具时间规则照搬到节点上会产生无效区块。Bitcoin 区块还要核对区块体、Merkle 承诺、币基交易、奖励与手续费、难度上下文等规则。矿工提出候选块并承担工作成本,矿池可以协调模板和收益分配;钱包、矿池、矿工与独立验证全节点不必是同一进程。即使一条候选链当前更强,后来出现另一条有效且累计工作更多的分支仍可触发重组,确认不是无条件的最终性。
有效历史先于权重比较
toy 验证器从共同创世出发依次检查:区块高度与父哈希必须连续,时间戳符合教学规则,目标等于由祖先算出的期望;按冻结字段编码后,摘要要等于哈希运算的输出且满足目标。单块工作人为取 floor(2^256/(target+1))。当第二块与前块的 toy 时间间隔为 1,目标缩小四倍,工作由 2 提高到 8;两块历史的合计 2+8=10,比另一条三块历史的 2+2+2=6 更高。不能从这段代码推出 Bitcoin 的难度调整周期、coinbase 奖励或真实区块头编码。
若攻击者直接填一个极小的目标“宣称”超高工作,却不符合该祖先允许的目标,它不能进入有效候选集合。摘要满足目标也不够;实际节点还会拒绝断开的父哈希、虚构交易承诺或不合法的 UTXO 花费。toy 只测了头与允许目标,尚无区块体与脚本,所以它仅说明本模型不会先取最大工作再补验头;并不证明 Core 对上述其他失败分支的行为。
命令 python3 examples/blockchain/run_pow_evidence.py 保存 toy 头摘要、目标、nonce、源码 SHA、真实退出码和 2 项断言到 examples/blockchain/evidence/09/。没有 Bitcoin Core 和真实 regtest 矿工网络,出块、奖励、调整周期的真实值均 NOT_RUN。本段从 toy 输出只能推出模型选择结果,不能声称观察到 Bitcoin 历史重组。
练习一:两条已有效的候选链分别含 3 个工作量 2 的块和 2 个工作量 8 的块,哪个更强?答案:在同一共同起点后比较累积和,分别为 6、16,后者更强;先核查每块是否满足该高度允许的目标。练习二:把最后一个区块的目标字段直接写成 1 以“申报高难度”,为何不能胜出?答案:节点按历史规则计算允许目标,声明字段不匹配首先被拒绝;有限模型测试 target not allowed。
可迁移原则:资源权重的比较只能在先验证有效性的候选对象之间进行。参考入口:Bitcoin 白皮书第 4–5 节、Core chain proof 源码入口(当前访问失败;release、完整 SHA 与上游测试待核)。导航:区块链(08):钱包、描述符与 PSBT 的签名边界 · 09 · 区块链(10):交易池与 P2P 为什么不能当共识账本。






