EIP100 - undefined
# 规格
目前,计算区块难度的公式包括以下逻辑:
adj_factor = max(1 - ((timestamp - parent.timestamp) // 10), -99)
child_diff = int(max(parent.difficulty + (parent.difficulty // BLOCK_DIFF_FACTOR) * adj_factor, min(parent.difficulty, MIN_DIFF)))
...
1
2
3
2
3
如果 block.number >= BYZANTIUM_FORK_BLKNUM
, 我们将第一行更改为以下内容:
adj_factor = max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)
1
# 基本原理
这个新公式确保了难度调整算法的目标是稳定的平均区块生成率,包括叔块,从而确保高度可预测的发行率,不能通过操纵叔块率向上操纵。计算包含的叔块的确切数量的公式:
adj_factor = max(1 + len(parent.uncles) - ((timestamp - parent.timestamp) // 9), -99)
1
可以很容易地看出(在 ~3/4194304
的容差范围内)在数学上等同于假设一个具有 k
个叔块的块等价于一系列 k+1
块,它们都以完全相同的时间戳出现,这可能是实现所需效果的最简单的方法。但是由于确切的公式取决于完整的区块而不仅仅是区块头,我们使用一个近似公式来实现几乎相同的效果,但好处是它只取决于区块头(因为您可以对比叔块哈希值和空白哈希)。
将分母从 10 更改为 9 可确保出块时间大致保持不变(实际上,鉴于当前的叔块率 7%,它应该减少约 3%)。
# 参考
- EIP 100 问题及讨论: https://github.com/ethereum/EIPs/issues/100
- https://bitslog.wordpress.com/2016/04/28/uncle-mining-an-ethereum-consensus-protocol-flaw/