原文标题:《化险为夷:以太坊的状态问题》 本篇博文的目的在于正式揭露以太坊平台在柏林硬分叉之前的一个严重且显而易见的问题。 State 状态我们先从以太坊和及其「状态」的背景开始梳理。 以太坊的状态由 patricia-merkle trie 组成,一种前缀树。本文不会深入技术细节,简单来说随着状态增长,树的分支会越来越密集。每个加入的账户都是一片新叶子。在树根之间和叶子之间,存在大量的「中间」节点。 为了查找某个特定账户,或是说这颗巨树中的一片「叶子」,从树根再通过中间节点,需要按序解决 6-9 个哈希才能最终对我们所寻找的数据进行哈希计算。 简而言之,每执行一次查找账户的 trie 查询,都要执行 8-9 个解析操作。每次解析操作都是一次数据库查询,而每次数据库查询都可能是任意数量的实际磁盘操作。磁盘操作的数量难以预估,但是由于 trie 密钥是加密哈希 (抗冲突),因此密钥是「随机的」,这对任何数据库来说都是最糟糕的情况。 随着以太坊的发展,一直以来都有必要提高树访问操作的 gas 费用。2016 年 10 月,在经历了「上海攻击」时间之后,以太坊网络在区块高度 2,463,000 进行了 Tangerine Whistle 硬分叉,其中包含 EIP 150,大举提升了某些操作的 gas 成本,并引入了大量更改以防御 DoS 攻击。 另一次对 gas 费用的提升是在 2019 年 12 月的 Istanbul 升级中,激活了 EIP 1884。 EIP-1884 针对 gas 费用引入了以下改动:
出现的问题2019 年 3 月,Martin Swende 当时在进行一些 EVM 操作码性能的测定。之后的 EIP-1884 就是基于该调查而成的。在 EIP-1884 被激活的前几个月,Broken Metre 发布了这篇论文 (2019/9)。 两位以太坊安全研究员,Hubert Ritzdorf 和 Matthias Egli,与论文的作者之一 Daniel Perez 将一个漏洞「武器化」,提交给了以太坊的漏洞赏金 (bug bounty) 项目。这是在 2019 年 10 月 4 日。 建议大家阅读这份他们提交的完整文档,写得很详尽。 同日,在一个专门用于讨论跨客户端安全性的频道中,来自 Geth、Parity 和 Aleth 的开发者都得知了这份文档。 这个漏洞的本质在于触发随机的 trie 查询。以下是一个简单的示例: 在其报告中,研究员们通过 eth_call 对同步了主网的节点执行了这个 payload,以下是他们执行过程中的数据,耗费了一千万 gas: (责任编辑:admin) |