发现分叉 | Detecting Forks
在出现上面提到的两种分叉中,未更新的节点都可能使用和发布不正确的信息,导致一些会出现经济损失的情况。特别的,未更新的节点会传播并接受那些被已更新节点认定为无效的交易,这些交易将永远不会成为全网最长区块链的一部分。未更新节点也可能拒绝传播已被或将要被加到最佳区块链的区块和交易,这样它们提供的就是不完整的信息。
Bitcoin Core 包含了通过监控区块链工作量证明而发现硬分叉的代码。如果一个未更新的节点接收到的区块链头证明至少有六个区块比这个节点认定的最佳区块链有更多的工作量证明,这个节点就会在 getinfo
RPC 命令结果中报错并且在开启了 -alertnotify
时运行 -alertnotify
。这提醒运营人员这个未更新节点无法切换到那个本应该是最佳的区块链上去。
完整的节点同时会检查区块和交易的版本好。如果最近的几个区块或者交易的版本比节点使用的要高,这可以假定为该节点没有在使用当前的一致性规则。Bitcoin Core 0.10.0 通过 getinfo
RPC 命令报告这一情况,并且如果 -alertnotify
被设置了会运行 -alertnotify
。
在以上的情况中,明显地来自一个未使用当前一致性规则节点的区块和交易数据是一定不应该被信赖的。
连接到完全节点的 SPV 客户端可以通过连接多个完全节点确保他们在同一区块高度来判定是否出现了硬分叉,要加上或减去一些账户的区块因为存在交易的延时和陈旧的块。如果出现了分叉,客户端可以与具有短链的节点断开连接。
SPV 客户端最好也对区块和数据的版本号增长做监控,从而确保它们在使用同样的一致性规则处理接受交易和创建新的交易。