消耗一千万 gas 的 EXTCODEHASH (400 gas)
消耗一千万 gas 的 EXTCODEHASH (700 gas)
显而易见,EIP-1884 的更改确实在降低该攻击的影响上起到了帮助,但还远远不够。 当时已经临近在大阪的开发者大会。在开发者大会上,这个问题的信息分享给了主网的客户端开发者。我们也和 Hubert、Mathias 以及 Greg Markou (来自 Chainsafe,当时也在进行一些 ETC 的工作) 见面了。ETC 的开发者也收到了这份报告。 随着 2019 年临近尾声,我们知道这个问题比之前预期的要严重,恶意交易可能将区块时间提升到分钟范围。更糟的是,开发者社区对 EIP-1884 感到不满,因为 EIP-1884 破坏了一些合约流程,而且用户和矿工都非常希望提高区块的 gas limit。 此外,仅两个月后的 2019 年 12 月,Parity Ethereum 宣布停止运维,而 OpenEthereum 接管了代码库的维护工作。 随后搭建了一个新的客户端协调频道,Geth、Nethermind、OpenEthereum 和 Besu 的开发者在此继续进行协作。 解决方案我们意识到要解决这个问题,必须要双管齐下。一种方法是通过以太坊协议以某种方式在协议层解决该问题。最好不要破坏合约,并且避免波及「良好」行为,但仍要设法防止攻击。 第二种方式是通过软件工程来解决,修改客户端中的数据模型和结构。 协议层的工作关于如何处理这些类型的攻击的第一个版本在这里。2020 年 2 月,正式发布为 EIP 2583。其理念是,每当一次 Trie 查找导致未命中时,施加一次罚款。 但是,Peter 找到了应对方法,即「shielded relay」攻击,可以有效地限制这种惩罚的上限 (约为 800)。 对未命中查询进行惩罚的问题在于,首先需要进行查找,以确定是否施加惩罚。但是如果剩余的 gas 不足以支付罚款,已执行了未付费的消耗。即使确实会导致抛出异常,也可以将这些状态读取包装到嵌套调用中,允许外部呼叫者继续重复攻击而无需支付 (全部) 罚款。 因为这个原因,这个 EIP 被放弃了,我们也在寻找更好的替代方案。
在对这些不同机制进行迭代的同时,Vitalik Buterin 提议直接提高 gas 成本,并且保留访问列表。2020 年 8 月,Martin 和 Vitalik 开始完善 EIP-2929 及配套的 EIP-2930。 EIP-2929 有效地解决了许多之前的问题。
|