ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EIP-100 详解:以太坊 Byzantium 难度调整算法如何将叔块纳入平均出块时间目标

EIP-100 详解:以太坊 Byzantium 难度调整算法如何将叔块纳入平均出块时间目标 EIP-100 详解以太坊 Byzantium 难度调整算法如何将叔块纳入平均出块时间目标【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs导读本文围绕 EIP-100Change difficulty adjustment to target mean block time including uncles 展开系统讲解这条 Final 状态的 Core 类 EIP 如何把叔块uncle纳入以太坊难度调整算法使系统从以中位数时间为目标转向以包含叔块在内的平均出块时间为目标从而保证发行速率高度可预测且无法通过操纵叔块率来抬升。读完本文你将掌握 EIP-100 的公式变更细节、其数学动机与近似策略、它与 Homestead 时期难度公式EIP-2的演进关系以及它在 Byzantium 硬分叉EIP-609中的实际激活参数与后续延展EIP-649、EIP-1234。一、背景为什么要改难度调整公式以太坊采用工作量证明PoW共识通过难度调整算法difficulty adjustment algorithm让出块时间稳定在目标值附近。在 Homestead 硬分叉之前及之中难度算法基于中位数时间思想设计。该算法的核心逻辑如下EIP-100 文档开篇给出的当前公式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)))其中//为整数除法向下取整BLOCK_DIFF_FACTOR为 2048见 EIP-2 规范MIN_DIFF为最小难度下限任何调整都不得使难度低于它。这一公式存在一个结构性缺陷它只统计父块与子块的时间差完全没有考虑叔块的存在。以太坊的 GHOST 协议允许矿工在区块中包含叔块未被主链包含但被近亲区块引用的失效区块而叔块的产出与奖励机制使得出块节奏实际上由主链区块 叔块共同决定。当叔块率较高时主链上的区块间隔会被拉长而难度算法仍以主链区块间隔为唯一输入导致实际包含叔块在内的平均出块时间偏离目标值。更严重的是操纵风险如果矿工刻意制造timestamp parent_timestamp 1的区块Homestead 时代两月前真实发生过区块时间分布会被扭曲——中位数仍保持在 13 秒但均值开始上升一旦 51% 的矿工这样做均值理论上可以趋近无穷大详见 EIP-2 的 Rationale。因此需要一个能感知叔块、以包含叔块的平均出块速率为目标的公式。二、规范一行公式的变更EIP-100 的规范极其聚焦仅改动adj_factor一行如果block.number BYZANTIUM_FORK_BLKNUM将第一行改为adj_factor max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)对比变更前后阶段adj_factor公式时间差除数叔块感知HomesteadEIP-2max(1 - ((timestamp - parent.timestamp) // 10), -99)10无ByzantiumEIP-100max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)9有变更要点可拆解为两点引入叔块项(2 if len(parent.uncles) else 1)。当父块包含至少一个叔块时常数项从 1 变为 2。这里的parent.uncles指父块头中通过unclesHash引用的叔块列表——该信息仅来自区块头而非完整区块体这正是 EIP-100 选择近似公式的关键动机后文详述。时间差除数从 10 改为 9(timestamp - parent.timestamp) // 9。这一微调用于抵消叔块对出块时间统计的稀释使包含叔块在内的整体出块时间基本维持不变。第二条语句child_diff的计算保持不变BLOCK_DIFF_FACTOR、MIN_DIFF等常量与下限保护逻辑均沿用 Homestead 时期的设计。三、设计动机与数学原理3.1 目标恒定且不可操纵的平均出块速率EIP-100 的 Rationale 明确指出新公式保证难度调整算法以包含叔块在内的恒定平均出块速率为目标。这样做的收益有两点发行速率高度可预测以太坊的 ETH 发行由主链区块奖励 叔块奖励 侄块奖励组成。如果算法只盯着主链区块间隔叔块率波动会直接扰动总发行速率把叔块纳入目标后总发行速率趋于恒定。无法通过操纵叔块率抬高发行在旧公式下矿工可以通过调整叔块产出/包含策略间接影响难度曲线从而变相操纵发行速率新公式让难度对叔块数作出即时反应封堵了这类操纵路径。3.2 精确公式与近似公式的取舍EIP-100 给出一个精确版本的公式adj_factor max(1 len(parent.uncles) - ((timestamp - parent.timestamp) // 9), -99)文档论证了该公式在约3/4194304的容差内数学上等价于如下假设一个包含k个叔块的区块等价于k1个时间戳完全相同的连续区块。换言之叔块被折算成主链区块的一部分参与难度计算这是实现恒定平均出块速率最朴素的方式。但精确公式依赖len(parent.uncles)即需要知道父块实际包含多少个叔块。叔块数量只能从完整区块体中获取——虽然可以从区块头的unclesHash与空哈希比对判断是否包含叔块却无法从区块头得知具体数量。对轻客户端等只处理区块头的场景而言精确公式无法使用。因此 EIP-100 选择了近似公式adj_factor max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)即用二元判断父块是否含叔块替代父块含多少个叔块有叔块则常数项取 2无叔块则取 1。虽然损失了精确计数但只需区块头即可计算与空哈希比对unclesHash即可且几乎达到同样的效果——这是对链上可验证性与计算近似之间的一次务实权衡。3.3 除数 10 → 9补偿叔块带来的时间稀释为什么把时间差除数从 10 改成 9EIP-100 的 Rationale 给出了量化说明在给定当时约 7% 的叔块率下出块时间应下降约 3%从而基本保持出块时间不变。直觉解释旧公式以 10 秒为一个难度步进单位隐含目标约 10 秒级的区块间隔配合难度步进实现约 15 秒的实际出块时间。当叔块被计入出块速率后若除数仍为 10包含叔块的平均速率会略高于目标将除数收紧到 9相当于对每个时间差步进更敏感抵消叔块带来的统计偏差使主链区块间隔 叔块间隔的整体均值回落至期望水平。文档强调这只是约 3% 级别的微调目的是让含叔块的平均出块时间尽量贴近原先的目标。3.4 延续 Homestead 的粗粒度与下限保护值得注意EIP-100 并未推翻 Homestead 确立的两个设计原则见 EIP-2粗粒度coarse-grained以(timestamp - parent.timestamp) // 9的整数步进作为输入而非直接使用时间差避免矿工把时间差精确设为 1 以制造难度略高、必然胜出分叉的区块下限保护max(..., -99)的 -99 上限确保当两个区块因客户端安全漏洞等黑天鹅事件相隔极远时难度不会无限跌落。EIP-100 在引入叔块感知的同时完整继承了这两个原则只在常数项与除数上做最小化改动——这也是该 EIP 能以一行公式变更完成共识层调整的重要原因。四、在 Byzantium 硬分叉中的激活4.1 属于 Byzantium 的 Core EIPEIP-100 是 Standards Track / Core 类 EIP经 EIP-609Hardfork Meta: Byzantium 纳入 2017 年的 Byzantium 硬分叉。EIP-609 文档中明确列出了其依赖与包含关系包含的 EIP 列表EIP-100、EIP-140REVERT、EIP-196 / EIP-197alt_bn128 椭圆曲线预编译、EIP-198大整数模幂预编译、EIP-211RETURNDATASIZE / RETURNDATACOPY、EIP-214STATICCALL、EIP-649难度炸弹推迟与区块奖励削减、EIP-658收据状态码激活条件主网区块高度 ≥ 4,370,000Ropsten 测试网 ≥ 1,700,000。EIP-100 与 EIP-649 在 Byzantium 中同批生效二者共同作用于出块节奏EIP-100 改变难度调整的斜率EIP-649 用伪区块号推迟指数难度炸弹冰河期并削减区块/叔块/侄块奖励。4.2 与 EIP-2 的演进关系EIP-100 的直接前身是 EIP-2Homestead Hard-fork Changes 第 4 条对难度算法的修订。EIP-2 将难度公式从基于中位数 13 秒改为block_diff parent_diff parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99) int(2**((block.number // 100000) - 2))其中int(2**((block.number // 100000) - 2))为指数难度调整分量即难度炸弹。EIP-2 的 Rationale 指出新公式以均值为目标并证明长期平均出块时间超过 24 秒在数学上不可能。EIP-100 正是沿着这条均值目标化路线前进EIP-2 解决了时间戳攻击导致的均值漂移EIP-100 则进一步把叔块纳入均值计算补上发行速率可预测性的最后一块拼图。五、后续演进难度炸弹、奖励削减与最终去向EIP-100 所定义的难度调整框架在 Byzantium 之后被多次延展EIP-649Metropolis Difficulty Bomb Delay and Block Reward Reduction与 EIP-100 同批在 Byzantium 激活。它引入fake_block_number max(0, block.number - 3_000_000)推迟难度炸弹约 1.4 年同时将区块奖励调整为 3 ETH3_000_000_000_000_000_000wei叔块奖励为(8 - k) * new_block_reward / 8k block.number - uncle.number侄块奖励为new_block_reward / 32。注意EIP-649 修改的是难度公式中的指数分量冰河期而 EIP-100 修改的是线性调整分量adj_factor二者互不冲突、并行生效。EIP-1234Constantinople Difficulty Bomb Delay and Block Reward Adjustment在 Constantinople 分叉中将难度炸弹再推迟约 12 个月fake_block_number max(0, block.number - 5_000_000)区块奖励降至 2 ETH。其文档明确说明实现逻辑与 EIP-649 无异印证了 EIP-100/649 确立的调整框架在后续分叉中的延续性。EIP-1227 / EIP-1276这两条提案未最终成为主网规则从另一个方向切入——直接移除int(2**((block.number // 100000) - 2))指数分量以彻底消除难度炸弹同样未触碰 EIP-100 的adj_factor线性调整逻辑。从中可以清晰看到一条主线EIP-100 负责如何随出块时间与叔块数调整难度后续 EIP 只负责何时引爆/推迟指数炸弹、奖励定多少难度调整的线性核心在 PoW 时代长期保持稳定直至以太坊转向 PoS。六、实现要点与验证EIP-100 的规范只有一处公式变更客户端实现时只需在共识代码的难度计算函数各客户端通常命名为calc_difficulty中按分叉区块号分流新旧公式def calc_difficulty(block, parent): if block.number BYZANTIUM_FORK_BLKNUM: # EIP-100父块含叔块则常数项为 2否则为 1时间差除数为 9 adj_factor max((2 if len(parent.uncles) else 1) - ((block.timestamp - parent.timestamp) // 9), -99) else: # HomesteadEIP-2常数项恒为 1时间差除数为 10 adj_factor max(1 - ((block.timestamp - parent.timestamp) // 10), -99) child_diff int(max(parent.difficulty (parent.difficulty // 2048) * adj_factor, min(parent.difficulty, MIN_DIFF))) return child_diff关键实现约束叔块判断只需区块头parent.uncles的二元信息可由区块头中的unclesHash与空哈希sha3(rlp([]))比对得出这正是近似公式选型的直接原因//为整数除法(timestamp - parent.timestamp) // 9向下取整保留粗粒度特性详见 EIP-2 对//的显式定义下限保护保留adj_factor下限为 -99child_diff不得低于min(parent.difficulty, MIN_DIFF)。由于 EIP-100 与 EIP-649 同在 Byzantium 激活且共识规则变更必须全节点同步升级任何客户端实现都须以 4,370,000主网为分叉阈值做新旧逻辑分流并在分叉前后区块上做差量验证。EIP-1 中定义的 Core EIP 流程EIP Purpose and Guidelines要求此类共识级变更必须有客户端的实际实现才能进入 Final 状态——EIP-100 正是通过这条流程完成标准化并随 Byzantium 上线的。七、总结EIP-100 以最小化的一行公式改动完成了以太坊难度调整算法的一次关键升级维度变更前Homestead变更后Byzantium常数项恒为 1含叔块为 2否则为 1时间差除数109调整目标主链区块间隔包含叔块在内的平均出块速率输入数据仅区块头时间戳区块头时间戳 叔块哈希仍仅需区块头发行速率可被叔块率间接扰动高度可预测、不可操纵它把叔块从难度算法的盲区变成输入让 ETH 发行速率进入可预测区间同时用有/无叔块的近似替代叔块计数的精确保住了轻客户端只需区块头即可验证的特性。此后 EIP-649、EIP-1234 等提案在奖励与炸弹维度上反复调整而 EIP-100 确立的难度调整线性核心一直稳定工作到 PoS 合并——这正是这条 2016 年提案的生命力所在。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表