硬分叉事后说明

author img

Eva Qing

2021.02.03

blog photo

英文链接: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

https://github.com/ergoplatform/ergo/releases/tag/v4.0.4

分享转发

相关阅读