
躲避子弹:以太坊状态问题
这篇文章的目的是正式公开一个对以太坊平台的严重威胁,其危险性清晰而明确,直到 “柏林” 硬分叉才解除。
状态
我们先来了解一些以太坊和 “状态” 的背景知识。
以太坊状态是一棵 帕特里夏-默克尔树(particia-merkle trie,一种兼有前缀树规则的默克尔树)。本文不会深入过多细节,你只要知道,随着状态数量的增长,这个树结构的分支会变得越来越密。以太坊区块链上每多一个账户,这棵树就多一个叶子节点。在树的根节点与叶子节点,是许多所谓的 “中间” 节点。
为了查找某个账户,或者说在这棵庞大的树上找到某片 “叶子”,需要解析 6 ~ 9 个哈希值,从根节点开始,经由中间节点,最终解析到一个能够给予我们所需数据的哈希值。
用大白话来说:无论什么时候要在这棵树上查找某个账户,都要经过 8 ~ 9 次解析操作。每次解析操作都是一次数据库查询,而每一次数据库查询都意味着不确定数量的多次硬盘操作。硬盘操作的次数很难估计,但是因为状态树的 “键(key)” 是密码学哈希值(抗碰撞的),所以这些键都是随机的,这对所有数据库来说都属于最坏的情况。
随着以太坊状态的增加,就有必要提高访问状态树的操作的 Gas 消耗量。早在 2016 年 10 月,我们就曾用 “橘子口哨(Tangerine Whistle)” 分叉(纳入 EIP 150,在区块高度 246 3000 激活)做过这样的事。EIP 150 大幅提高了特定操作的 Gas 消耗量,并引入了一系列的措施来保护网络免于 DoS 攻击;这是在所谓的 “上海攻击” 之后推出的。
另一次这样的 Gas 消耗量提升是在 “伊斯坦布尔” 分叉的时候,在区块高度 906 9000 (2019 年 12 月)激活,引入了 EIP 1884。1884 的内容包括:
-
SLOAD 操作码的 Gas 消耗量从 200 提高到 800 gas
-
BALANCE 消耗量从 400 提高到 700 gas (还加入了一个更便宜的 SELFBALANCE 操作码)
-
EXTCODEHASH 消耗量从 400 提升到 700 gas
问题(们)
在 2019 年 3 月,Martin Swende 测量了 EVM 操作码的性能。这一研究后来导致了 EIP-1884 的创建。在 1884 激活的几个月前,这篇以 “Broken Metre” 为名的论文发表(2019 年 9 月)。两位以太坊安全研究员 —— Hubert Ritzdorf 和 Matthias Egli —— 与这篇论文的作者之一 Daniel Perez 展开了合作,并 “武器化” 了一个漏洞,并提交给了以太坊的 bug 悬赏项目。那是在 2019 年 10 月 4 日。我们建议你完整地阅读他们提交的报告,写得非常好。在一个专门讨论跨客户端安全性的频道里,来自 Geth 客户端、Parity 客户端和 Aleth 客户端的开发者被告知了这份报告,就在同一天。该漏洞的本质是触发随机的树查找。一个非常简单的变体是:
在他们的报告里,研究员通过 eth_call RPC 端点对同步到主网的节点执行了这一负载,下面是它们消耗 1000 万 gas 所需的时间。
-
使用 EXTCOEHASH (名义 Gas 消耗量是 400)耗尽 1000 万 gas
-
Parity:约 90 秒
-
Geth:约 70 秒
-
使用 EXTCODESIZE (名义 Gas 消耗量是 700)消耗 1000 万 gas
-
Parity:约 50 秒
-
Geth:约 38 秒
(译者注:此处的意思是,如果一个 1000 万 gas 的区块全用这两个操作码填满,则节点需要这么长时间才能处理完这个区块)
显而易见的是,EIP-1884 确实减少了攻击的效果,但还是远远不够的。那时候离大阪 Devcon 已经很近了。在 Devcon 期间,关于这一问题的知识在主网的客户端开发者之间传开来。我们也会晤了 Hubert 和 Mathias,还有 Greg Markou(他来自 Chainsafe 团队,一直在做 ETC 的工作)。ETC 区块链的开发者们也收到了这份报告。随着 2019 年接近尾声,我们发现,这问题比我们之前以为的还要棘手,恶意的事务可能导致出块时间延长到以分钟计。更难办的是,开发者社区已经对 EIP-1884 感到不满,它打破了一些合约,而且用户和矿工都希望提高区块的 Gas Limit。此外,仅仅两个月之后,到了 2019 年 12 月,Partiy Ethereum 就宣布要退出了,OpenEthereum 项目接管了 Parity 客户端的代码维护工作。于是大家创建了一个新的客户端协作频道,Geth、Netheremind、OpenEthereum 和 Besu 的开发者继续合作。
解决方案
我们意识到,只有双管齐下才能解决这个问题。一方面,我们要改进以太坊协议,也就是在协议层解决这个问题;最好是不要打破合约,也不要惩罚 “善意” 的行为,但又能防止攻击。另一方面,我们可以依靠软件工程,改变客户端内的数据模式和结构。
协议层工作
处理此类攻击的第一个思路是这个。在 2020 年2 月,其正式版本作为 EIP 2583 发布。该提案背后的观念是增加一个惩罚措施,每次树查找导致 miss (“未找到”)时就触发。不过,Peter 找出了一个绕过它的办法 ——“shielded relay” 攻击 —— 使得本质上惩罚有了一个上限(约为 800)(译者注:此处没有单位,疑为 gas)。惩罚 miss 方法的问题在于,必须先有查找的过程,然后才能确定要不要实施惩罚。但如果剩余的 gas 已不足于实施惩罚,则(从协议的角度看)一个没有得到充分支付的消耗流程又已经执行了。即使这会导致抛出错误,这些状态读取也可以封装到嵌套调用中,使得外部调用者可以重复执行攻击而不必支付(完整的)惩罚。因此,这个 EIP 也被抛弃了,我们要寻找更好的替代方案。
-
Alexey Akhunov 研究了 Oil 的概念 —— 一种次级的 “Gas”,但与 Gas 完全不同的是,它对执行层是不可见的,而且可能导致事务全局回滚(transaction-global revert)。
-
Martin 提了一个类似的提案,称为 “Karma”,在 2020 年5 月。
虽然这许多方案都有进展,Vitalik Buterin 提议仅仅提高 Gas 消耗量,并维护一个 “访问清单”。在 2020 年 8 月,Martin 和 Vitalik 开始迭代后来成为 EIP-2929 及其同伴 EIP-2930 的想法。EIP-2929 在根本上解决了许多上面提到的问题。
-
与 EIP-1884 相反;1884 是无条件提高 Gas 消耗量,但 2929 仅提高访问新对象的 Gas 消耗量。这使得净成本仅增加了不到一个百分点。
-
同样地,与 EIP-2930 配合后,就不会打破任何合约。
-
它还可以通过提高 Gas 消耗量来进一步调整(也不会打破合约)
在 2021 年 4 月 14 日,这两个 EIP 都在 “柏林” 分叉时激活。
开发工作
Peter 尝试用动态的状态快照解决这个问题,时值 2019 年 10 月。快照是一个次级的数据结构,用来以扁平格式(flat format)存储以太坊状态。快照可在 Geth 节点正常运行期间创建,无需下线专门执行。快照的好处是,它可以作为状态访问的一种加速结构:
-
不再是执行 O(log N) 次硬盘读取(还要乘以 LevelDB 的开销)来访问一个账户/存储项,快照可以提供直接的,O(1) 级别的访问时间(再乘以 LevelDB 的开销)。
-
快照还支持以每个条目 O(1) 的复杂度迭代账户和存储项,这使得远程节点可以检索连续的状态数据,比以往便宜非常多。
-
快照的存在还支持其它更奇怪的用途,比如离线修剪状态树,以及迁移到另一种数据格式。
弊端是,快照等于是完全复制了账户和存储项的未经处理(raw)的数据。若在主网环境中使用,这意味着需要额外 25 GB 的固态硬盘空间。动态快照的想法从 2019 年中就有了,当时的主要目标是启用 “快照同步”。那时候 Geth 团队还在开发许多 “大项目”:
-
离线的状态修剪
-
同态快照 + 快照同步
-
通过共享状态实现 LES 状态分散
不过,后来他们决定一心一意做快照功能,推迟了其他项目。这些工作为后来的 snap/1 同步算法打下了基础。这一算法已在 2020 年 3 月合并到了代码库中。有了 “动态快照” 功能,我们就能喘口气了。如果以太坊网络遭到攻击,那会是很痛苦的,但至少,我们能通知用户打开快照功能。生成快照需要花一些时间,而且还没有办法同步快照,但网络至少能继续运行了。
结合
在 2021 年 3 月/4 月, snap/1 协议已经在 geth 客户端推出,节点能够使用新的、基于快照的算法来同步区块链了。虽然还不是默认的同步模式,这是使快照能不仅作为攻击保护措施,也能显著提高用户体验的一部。在协议层,“柏林” 升级已于 2021 年 4 月激活。在我们的 AWS 监控环境中,我们的基准测试结果如下:
-
“柏林” 前,没有快照,处理 2500 万 gas:14.3 秒
-
“柏林” 前,有快照,处理 2500 万 gas:1.5 秒
-
“柏林” 后,没有快照,处理 2500 万 gas:约 3.1 秒
-
“柏林” 后,有快照,处理 2500 万 gas:约 0.3 秒
这个(粗糙)的数字表明,“柏林” 升级使攻击的效率降低了 5 倍,而快照使之降低了 10 倍,最终使其影响降低了 50 倍。我们估计,在当前的主网上(区块为 1500 万 gas),不使用 快照的 geth 节点可能可以做到只需 2.5 ~ 3 秒就能执行一个区块。随着状态的增长,这个数字会继续恶化(对于不使用快照的节点来说是如此)。如果 gas 返还机制被用来造成单个区块的实际 gas 使用量提升,这个恶化的倍数(最大)是 2 倍。在 EIP-1559 实施后,区块的 Gas Limit 会有更高的弹性,在短时间内可爆发出最大 2 倍的恶化乘数。至于实施这种攻击的可行性,攻击者买断一个区块的成本大概在几个 ETH 这样的级别(1500 万 gas,100 Gwei 的价格,乘出来就是 1.5 ETH)。
为何要在此时公开
这一威胁在很长时间里都是 “公开的秘密” —— 因为疏忽,它至少被公开披露过一次;而且在核心开发者会议中也多次提到它,虽然没有公开细节。因为我们已经激活了 “柏林” 升级,也因为 geth 客户端已经默认使用快照功能,我们认为,威胁已经足够低,而透明化才是更重要的了。所以是时候把幕后的工作都公开了。重要的是,社区得到了一次理解和思考这些影响用户体验(这些 EIP 会提高 Gas 消耗量,也会限制返还机制的效果)的变更的机会。
比推快讯
更多 >>- 全网比特币合约未平仓头寸达 698 亿美元,24 小时增长 5.73%
- 25 倍做空 ETH 巨鲸暂未被清算,但已非常危险
- 巨鲸 James Wynn 晒图其比特币 40 倍多单仓位价值已超 3.95 亿美元
- 25 倍做空 ETH鲸鱼再次减仓,将清算价提高至 2556.6 美元
- 山寨币市场反弹,MOODENG、DEGEN 均涨超 30%
- 美国财长贝森特:若各国不真诚谈判,或将收到 4 月 2 日水平关税函
- Coinbase CEO 去年个人安保费用高达 620 万美元
- 数据:PYTH、ZKJ、PIXEL 等代币将于下周迎来大额解锁,其中 PYTH 解锁价值约 3.38 亿美元
- 美财长贝森特回应穆迪下调美国信用评级:我不太相信穆迪
- Raydium LaunchLab 上线以来创建代币数超 11.9 万枚,毕业率为 0.21%
- BNB Chain 生态项目 B(BUILDon)的交易量占比超过 USD1 链上总交易量的 52%
- 巨鲸 James Wyn 的 Hyperliquid 多单仓位已累计浮盈 2041 万美元
- 某巨鲸 15 分钟前将 700 枚 BTC 转入 Binance
- Bybit 用户因 Apple ID 漏洞触发人脸认证失败,逾 10 万美元提币受阻
- Michael Saylor 再次发布比特币 Tracker 信息,或暗示再次增持 BTC
- 分析师:比特币或将于下周创历史新高,目标价位为 11.6 万美元
- TRUMP 官方:奖励积分计划已上线,用户可连接钱包参与
- CNBC:TRUMP 晚宴参与者或以非美国人居多
- 过去 24 小时 BSC 链上 DEX 交易量超越 Solana 与以太坊之和,排名第一
- 巨鲸 James Wynn:BTC 已不太可能回落至 10 万美元以下
- Base 过去 7 日活跃地址数达 978 万,EVM 链中排名第一
- 某鲸鱼从币安提取 4200 亿枚 PEPE 后,累计提取量已达 2.21 万亿枚
- 《比特币标准》作者将资助开发者处理 BTC 链上垃圾数据
- Willy Woo:比特币当前仍具上涨空间,预计 15 至 20 年后复合年增长率或稳定在 8%
- AI 概念币实时 mindshare 榜:VIRTUAL、FARTCOIN、AIXBT 分列前三
- 某鲸鱼过去 25 个小时从 Binance 提取 2.209 万亿枚 PEPE 到链上,价值 2916 万美元
- CESS DeShare 公测用户突破 220 万
- Jupiter DAO:Huma Finance 投票将于今晚 11 时 30 分开启,为期 4 天,HUMA 代币总供应量为 100 亿枚
- 币安:已向成功领取 REX 用户额外分发 3860 个 REX 代币空投
- 退休艺术家遭假冒 Coinbase 客服诈骗,损失 200 万美元加密货币
- 英伟达寻求拓展大型科技公司之外的业务
- DOGE 巨鲸过去 1 个月增持超 10 亿枚代币,当前价格在关键支撑位区间震荡
- 当前主流 CEX、DEX 资金费率显示市场转向谨慎看多
- Webull Pay 已选择 Coinbase 作为其加密货币合作伙伴
- 交易员挖矿小企鹅表示,已基于大级别行情判断买入现货
- 德克萨斯州比特币储备法案即将进入二读阶段
- 风投公司 A100x 推出 5000 万美元二期基金,支持 AI、数字资产和区块链领域早期公司
- 交易员 ash 总结 Believe 平台适合做二段的标的筛选标准
- cbBTC 流通供应量突破 4 万枚,封装比特币市占率扩大至 22.7%
- 加密 KOL Ansem 预测:2030 年比特币将达 50 万美元
- Tim Draper:我一直在不断买入更多比特币
- 分析:SOL 在 1 月达到历史峰值时与 2021 年 ETH 估值相似
- GROK 现已支持在网页端生成图表
- 数据:CryptoPunk #3609 以 440 枚 ETH 价格售出,约 108.7 万美元
- Avalanche 昨日活跃地址数达 64.8 万,5 月月活创历史新高
- 24 小时现货资金流入/流出榜:TRX、UNI、TRUMP 流入居前
- 一地址 18 小时前花费约 1600 美元买入 2320 万枚 BULL,短线卖出获利 7.14 万美元
- RootData:ZRC 将于一周后解锁价值约 413 万 美元的代币
- 英伟达将调整对华芯片出口
- 《富爸爸穷爸爸》作者:预计比特币今年会涨到 25 万美元
比推专栏
更多 >>观点
比推热门文章
- 【比推周末重点新闻回顾】比特币现货 ETF 昨日净流入 2.6 亿美元,持续 3 日净流入;美参议员:稳定币法案 GENIUS 最早或将于下周在参议院获批;分析师:比特币长期持有者开始获利了结,该群体或预判价格接近顶部
- 全网比特币合约未平仓头寸达 698 亿美元,24 小时增长 5.73%
- 25 倍做空 ETH 巨鲸暂未被清算,但已非常危险
- 巨鲸 James Wynn 晒图其比特币 40 倍多单仓位价值已超 3.95 亿美元
- 25 倍做空 ETH鲸鱼再次减仓,将清算价提高至 2556.6 美元
- 山寨币市场反弹,MOODENG、DEGEN 均涨超 30%
- 美国财长贝森特:若各国不真诚谈判,或将收到 4 月 2 日水平关税函
- Coinbase CEO 去年个人安保费用高达 620 万美元
- 数据:PYTH、ZKJ、PIXEL 等代币将于下周迎来大额解锁,其中 PYTH 解锁价值约 3.38 亿美元
- 美财长贝森特回应穆迪下调美国信用评级:我不太相信穆迪