英文链接:https://www.ergoforum.org/t/hardening-hard-fork-post-mortem/599
应@kushti的请求,我现在给大家说明一下今天在硬分叉升级期间发生的事情。有一些BUG导致矿工无法出块,现已修补好这些BUG,矿工可以出块。
version2ActivationDifficultyHex中出现往返编码失败(Round-Trip Encoding Failure)
进行硬分叉的主要原因是为了切换到新的工作量证明。从理论上讲,新的工作量证明应该会增加挖矿难度,因此,在进行工作量证明切换时调整了难度。
新的难度是使用以下指令设置的预定义值:
version2ActivationDifficultyHex = "6f98d5555555"
Ergo区块头的编码受比特币区块头编码的启发,其中难度是使用更短的4字节值而不是256位目标值进行编码的。
但是,在对区块头进行编码时将此值转换为nBits时,它会失去一定精度,并且对区块头进行解码会导致产生不同的难度值,从而使验证失败。
修复方法是使用以下指令:
version2ActivationDifficultyHex = "6f98d5000000"
version2ActivationHeight中出现差一错误(Off-By-One)
严格来说,激活高度可以是任何合理的高度,那么为什么这是一个差一错误呢?原因与上述难度调整有关。
在Ergo中,每个时段(Epoch)都会发生难度调整。一个时段是1024个区块长。会根据前8个时段中使用的区块时间戳自动调整难度,以获取120秒(即2分钟)的目标区块间隔时间。
难度调整的关键在于,它发生在新时段的第一个区块中,即高度n * 1024 + 1
。不幸的是,选择的激活高度为417792 = 408 * 1024
,这意味着在一个时段的最后一个区块应用了难度调整。
修复方法是调整代码,以便将v2难度调整也应用于下一个区块,即新时段的第一个区块。
这两个修复都是强制性的,因为它们涉及对共识非常关键的修复。
因此,所有节点必须更新以发布v4.0.4。