密码学 30:PoW、哈希链接与共识——签名为什么不能决定共同历史
同一笔尚未花费的输出,持有人先签了付给甲的交易 A,又签了付给乙的交易 B。两个签名都能通过,两个交易却不能在同一条有效历史里都花费它。如果有人给你 A 的交易哈希,甚至给你一个包含 A 的 Merkle 路径,能据此说“甲一定收到了钱”吗?不能。这里缺少的不是第三种签名算法,而是节点对交易规则、区块链接、累积工作和自己接受哪条历史的判断。
签名回答授权,共识回答冲突后的共同视图
钱包的签名把特定 sighash 预映像和控制该输出的密钥绑定。节点还须检查该输出在其要扩展的历史中存在、未被花费,且整笔交易满足脚本和金额规则。A 与 B 均可各自带一个有效签名;在包含 A 的状态下,B 引用的 UTXO 已被消费,因此不能再作为同一有效链的花费。反过来,存在分别以 A、B 为候选的两个竞争区块,不能只看任一个区块里的签名就决定全网以后接受哪个。
1 | |
这里的“累计工作”不是一台服务器给出的投票数。区块头承诺前一个区块的哈希、交易集合的根等数据;挖矿者尝试不同候选头使其哈希低于当期目标。找到合格头需要搜索,其他人用同一规则验证则较容易。链接将篡改旧头或交易集合传播到后续头:修改一个交易后,原区块承诺的根变了;要让另一条历史被节点接受,攻击者还要满足每个受影响的区块和链选择所需的工作及其余规则。
PoW 不是解密,也不自行判定某笔交易合法。一个有足够工作却含无效花费的区块仍会被完全验证的节点拒绝。另一头,“看起来更长”只是区块数量;难度可能不同,不能把“最长链”四个字误当作只数高度。节点对符合规则的分支比较累积工作,并按其共识规则追踪当前可接受的历史;区块竞争还可能造成重组。确认数表达一定条件下对被替换风险的下降,既不是密码学上的立即最终性,也不等于现实商品交付。
最小可失败实验:两个候选都能找到工作
examples/cryptography/30_history_work.py 把前驱哈希、带长度的合成交易文本与 nonce 拼成教学块,用双 SHA-256 搜索小目标 2^240。对“花同一个输出给甲”和“花给乙”分别找到合格 nonce:两者验证工作都通过,内容不同,也都不能替你作链选择。把选定前驱哈希换成一个使原 nonce 不满足目标的值,不重新搜索就失败。这里“小目标”和字段编码刻意不是 Bitcoin 区块头格式,更不涉及真实交易。签名 A、B 的独立对照见 27 的真实 ECDSA 原语与教学 UTXO 模型。
1 | |
这两项测试只检查在该模型下哈希搜索、验证和改链接的反例。Bitcoin Core 官方包在此环境尚未成功下载校验;真实 regtest 两条冲突交易、候选区块和重组均 NOT_RUN。不能把脚本输出的 two_conflicting_local_candidates_have_work=true 写作“共识已通过”。即使将来运行 regtest,也须另外核对真实节点怎样检查各输入、区块头与累计工作。
回到钱包经 HTTPS RPC 广播的路径:TLS 只能防止这段网络上的冒充或篡改,节点返回交易哈希只表示某节点说它见到的字节。钱包签名不能预言矿工采纳哪笔冲突交易;一次包含证明若没有可信区块头,仍可能由攻击者配一条假历史。真正的链验收要分别识别签名字节、节点状态、包含证明、可信头与确认策略;即使均满足,也不会从链上哈希推导出“商家已发货”。
练习及答案
画图题: 两条分支各有一个有效签名,X 包含 A,Y 包含 B。画出接收 X 的节点在 X 之后尝试接受 B 的位置,另画出接收 Y 的节点为何可能给出不同临时观察。删掉检查 UTXO 未花费这一步会怎样?
答案: 在每个分支里都先验签并检查该分支上的 UTXO。X 已花费该输出,X 后再接 B 应因同一 outpoint 消费而失败;Y 后反之。若删未花费检查,同一历史可能把 A、B 都计入有效支出,违反独占花费规则。两分支各自暂时包含不同有效交易不等于它们能同时成为一条共同有效历史;之后还需区块和累积工作规则决定节点选择。
实验变更题: 在 30_history_work.py 把两笔文本改成同一笔,candidates_differ 会怎样?若只改 target 为 0,是否还能挖出区块?把旧 nonce 连同原哈希移植到新前驱为什么不可靠?
答案: 两次搜索输入完全相同,确定性过程得到相同 nonce/哈希,差异断言失败。目标为零时任何非负摘要都不小于零,有限搜索最终报错。改前驱后待哈希字节变了,旧 nonce 不再有原来的摘要;偶然再次低于非零教学阈值也不能推出所有新前驱都有效。accepts 重新计算的才是被核对的字节。
资料与衔接
- Bitcoin 白皮书 §§2–5、8;Bitcoin Core 开发文档:Block Chain。实际节点规则以冻结实现及其网络参数核对,本篇未执行节点。
- 27:Bitcoin 交易的签名字节 · 29:Merkle 包含与可信根。





