[论文解读] How to Save My Gas Fees: Understanding and Detecting Real-world Gas Issues in Solidity Programs
本文首次对实际应用中的Solidity智能合约气体浪费进行了实证研究,识别了根本原因与修复策略,并提出了PeCatch——一种静态分析工具,可检测出383个此前未知的气体低效问题,准确率达94.4%,覆盖了54个真实气体浪费中的41个,显著优于现有工具在检测覆盖率和精度方面的表现。
The execution of smart contracts on Ethereum, a public blockchain system, incurs a fee called gas fee for its computation and data storage. When programmers develop smart contracts (e.g., in the Solidity programming language), they could unknowingly write code snippets that unnecessarily cause more gas fees. These issues, or what we call gas wastes, can lead to significant monetary losses for users. This paper takes the initiative in helping Ethereum users reduce their gas fees in two key steps. First, we conduct an empirical study on gas wastes in open-source Solidity programs and Ethereum transaction traces. Second, to validate our study findings, we develop a static tool called PeCatch to effectively detect gas wastes in Solidity programs, and manually examine the Solidity compiler's code to pinpoint implementation errors causing gas wastes. Overall, we make 11 insights and four suggestions, which can foster future tool development and programmer awareness, and fixing our detected bugs can save $0.76 million in gas fees daily.
研究动机与目标
- 对实际应用中的Solidity智能合约中的气体浪费进行实证研究,重点关注根本原因与修复策略。
- 识别并分类与Solidity独特数据存储机制(栈、内存、存储、calldata)相关的气体浪费模式。
- 开发一种名为PeCatch的静态分析工具,能够以高准确率和高覆盖率检测气体浪费。
- 通过提供可操作的洞察与检查器,提升工具链、语言设计与开发者对气体优化的认知。
- 使开发者能够通过检测并修复此前未知的气体低效代码模式,降低气体费用。
提出的方法
- 对5个流行Solidity项目中的100个气体浪费实例进行了实证研究,通过手动分析提交日志以识别根本原因与修复策略。
- 根据Solidity的数据存储区域将气体浪费分为四类:栈、内存、存储和calldata,各类具有不同的气体成本特征。
- 设计PeCatch为一种静态分析工具,采用基于规则的检查器,专门用于检测8种特定的气体浪费模式,包括Non-Overflow、And-in-If、Ret-Local、Alloc-Loop、Re-Sload、Bool-Field、Calldata-Para等。
- 通过精确的静态分析技术(包括路径条件分析与跨过程检查)实现PeCatch的实现,以最大限度减少误报。
- 在基准程序上评估PeCatch,测量执行时间(4秒至7分钟),并与Slither、Python-Opt和GasSaver对比检测准确率与覆盖率。
- 未来计划扩展PeCatch,包括支持跨过程分析、路径条件优化,以及对低级操作码和类型特定值的支持。
实验结果
研究问题
- RQ1实际应用中Solidity智能合约的气体浪费的根本原因是什么,特别是与Solidity独特数据存储机制相关的?
- RQ2开发者目前如何修复气体浪费问题,其解决方案中常见的模式是什么?
- RQ3现有静态分析工具在多大程度上能够检测Solidity程序中的实际气体浪费模式?
- RQ4新开发的静态分析工具PeCatch是否能够以更高的准确率和更低的误报率,检测出比以往工具更多的气体浪费?
- RQ5PeCatch的主要局限性是什么?未来版本如何提升对复杂或边缘情况气体浪费模式的检测覆盖率?
主要发现
- PeCatch在实证研究中检测到了54个气体浪费中的41个,表明其对实际气体浪费模式的覆盖率达到75.9%。
- PeCatch的误报率低于1.5%,显著低于Slither(62.5%)、Python-Opt(300%)和GasSaver(9.5%)。
- PeCatch在流行Solidity库中识别出383个此前未知的气体浪费,凸显了未被发现的气体低效问题的普遍性。
- 该工具的执行时间在每个基准程序上为4秒至7分钟之间,表明其可集成到日常开发工作流中。
- PeCatch在检测Solidity特有气体浪费模式(如Non-Overflow、And-in-If、Re-Sload)方面优于现有工具,这些模式被Slither和GasSaver所遗漏。
- PeCatch的主要局限性包括:由于缺乏跨过程分析、路径条件复杂性,以及对特定操作码(如mstore8)和值(如type(uint256).max)支持不完整,导致遗漏了13个气体浪费。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。