news 2026/10/3 1:44:25

从 Solidity 到 SlithIR:构建实用智能合约静态分析器(Slither 的设计与实践指南)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从 Solidity 到 SlithIR:构建实用智能合约静态分析器(Slither 的设计与实践指南)

【免费下载链接】publications

Publications from Trail of Bits

项目地址:https://gitcode.com/GitHub_Trending/pu/publications
点击查看免费下载

本篇技术指南以 Trail of Bits 在 2021 年 Dagstuhl"智能合约严格方法"研讨会上发表的演讲《Building a Practical Static Analyzer for Smart Contracts》为核心,系统讲解 Slither 静态分析框架的设计思想、SlithIR 中间表示的作用,以及它在漏洞检测、合约理解、代码审查与优化发现四大场景中的落地用法。读完本文,你将掌握 Slither 的架构脉络,理解为什么安全导向的中间表示是高级分析的关键,并能够通过它的 Python API 编写属于你自己的合约定制分析。

演讲背景与资料定位

该演讲由 Trail of Bits 的 Josselin Feist 于 2021-10-27 在 Dagstuhl Seminar on Rigorous Methods for Smart Contracts(智能合约严格方法研讨会)上发布,配套幻灯片位于仓库的 2021-10-27-dagstuhl-slither.pdf。演讲围绕一个核心问题展开:如何构建一个既"实用"(practical)又能支撑高级程序分析技术的智能合约静态分析器,其答案是 Slither 框架与其安全导向的中间表示 SlithIR。

本次演讲在 Trail of Bits 关于 Slither 的一系列公开资料中处于承上启下的位置:往前有 WETSEB 2019 学术论文(《Slither: A Static Analysis Framework For Smart Contracts》)、EthCC 2019 演讲 与 RunEVM 2019 的 SlithIR 专题演讲;往后则有 PyChain 2022 的 Python API 实战、TrustX 2023 的 Solidity/Vyper 双语言静态分析 以及 2025 年的 Slither MCP 集成 与 基于 Slither 的变异测试。这些材料共同勾勒出 Slither 从"静态分析框架"走向"可扩展安全分析平台"的演进路径。

Slither 是什么:面向 Ethereum 智能合约的静态分析框架

按演讲中的定义,Slither 是一个为 Ethereum 智能合约提供丰富信息(rich information)的静态分析框架。它的核心工作方式是:先把 Solidity 智能合约转换成一种名为SlithIR的中间表示,再在这个 IR 之上应用业界通用的程序分析技术(如污点跟踪 taint tracking),从而在不实际部署运行合约的前提下,系统性地回答"这个合约有哪些问题、它是怎么写的、哪里可以更优化"这类问题。

演讲将其价值归纳为四大主要应用场景(four main use cases):

  1. 自动化漏洞检测——框架内置一套开箱即用的安全问题检测器(security issue detectors);
  2. 提升对合约的理解——帮助开发者/审计者快速把握合约结构;
  3. 辅助代码审查——为人工审查提供信息支撑;
  4. 自动检测代码优化点——发现 gas 浪费等可优化位置。

这四大场景覆盖了从"自动发现"到"人工复核"再到"持续改进"的完整安全闭环。值得强调的是,Slither 的设计目标从第一天起就不是一个"孤立的检测工具",而是一个供人使用、也供程序二次开发的分析框架——这正是本次演讲以"Building a Practical Static Analyzer"(构建一个实用的静态分析器)为题的原因。

为什么需要中间表示:SlithIR 的设计动机

要理解 Slither 的架构,必须先理解 SlithIR。Solidity 是一门语法丰富、带有大量语法糖的高级语言,直接在其语法树上做分析会面临两个问题:一是语义复杂,容易漏报;二是表达式嵌套深,难以精确跟踪数据依赖。Slither 的做法是把 Solidity 代码降级(lower)为一条更简单、更贴近三地址代码(three-address code)形式的中间表示 SlithIR。

从仓库中的实际用例可以清楚看到 SlithIR 的设计粒度。在 PyChain 2022 演讲附带的 detect.py 中,分析者直接遍历每个函数的节点(node),并读取节点上的 IR 指令(node.irs),通过类型判断Transfer操作:

from slither import Slither slither = Slither("AlarmClock.sol") from slither.slithir.operations import Transfer from slither.analyses.data_dependency.data_dependency import is_dependent from slither.core.declarations.solidity_variables import SolidityVariableComposed alarm = slither.get_contract_from_name("AlarmClock")[0] for func in alarm.functions: for node in func.nodes: for operation in node.irs: if isinstance(operation, Transfer) and is_dependent( operation.call_value, SolidityVariableComposed("tx.gasprice"), func ): print(f"{node.expression} uses tainted input, tx.gasprice, in {func}")

这段代码演示了两个关键点:

  • SlithIR 将操作扁平化为可枚举的指令:转账被表示为Transfer操作,其call_value字段是可供数据依赖分析直接消费的操作数;
  • 通用程序分析技术可以直接套用:is_dependent()是一个数据依赖/污点判定函数,用来检查"转账金额是否依赖tx.gasprice"这类危险模式(gasprice 由矿工/交易发起方控制,可能被操纵)。

换句话说,SlithIR 的价值在于把 Solidity 的复杂语义"翻译"成一套足够简单、足够精确、让分析算法可以信任的指令集。演讲与 SlithIR 专题演讲 一致强调:SlithIR,这个安全导向的中间表示,是支撑高级分析(advanced analyses)的关键组件。没有它,污点跟踪等分析只能停留在语法层,精度和召回率都难以保证。

四大应用场景的实战展开

场景一:自动化漏洞检测(Detectors)

演讲指出的第一个用途是开箱即用的漏洞检测:Slither 内置一组安全检测器,覆盖重入、整数溢出、未检查返回值、权限缺失、危险 delegatecall 等常见 Solidity 缺陷类别。从仓库中的演进资料看,这套检测能力在后续持续扩充——PyChain 2022 演讲 提到 Slither 已包含近 100 条检测规则(nearly 100 rules),覆盖常见错误与安全漏洞;TrustX 2023 演讲 则把检测能力扩展到 Vyper 语言,说明这套"IR + 检测器"的架构具有跨语言可移植性。

场景二与场景三:提升合约理解、辅助代码审查(Printers)

Slither 的第二个与第三个用途——理解合约与辅助审查——由框架的printers(打印器)承担。EthCC 2019 版演讲的 Takeaways 明确指出:"Slither's printers will help to review contracts"(Slither 的打印器将帮助你审查合约)。Printers 以不同视角把合约"打印"成易读的信息视图:继承关系、函数可见性、状态变量读写、调用图等,让审计者在阅读源码之外获得结构化的俯瞰视角。

仓库中的示例脚本可以直观说明这类信息视图的内容。在 TruffleCon 2019 工作坊的 print_basic_information.py 中:

import sys from slither import Slither # Init slither slither = Slither('coin.sol') for contract in slither.contracts: # Print the contract's name print(f'Contract: {contract.name}') # Print the name of the contract inherited print(f'\tInherit from{[c.name for c in contract.inheritance]}') for function in contract.functions: # For each function, print basic information print(f'\t{function.full_name}:') print(f'\t\tVisibility: {function.visibility}') print(f'\t\tContract: {function.contract}') print(f'\t\tModifier: {[m.name for m in function.modifiers]}') print(f'\t\tIs constructor? {function.is_constructor}')

可见 Slither 的 API 把合约建模为Slither → contracts → functions → nodes的对象层级,审计者可以像翻阅元数据一样枚举继承、可见性、修饰器与构造函数信息——这正是"提升理解、辅助审查"的编程式实现。

场景四:自动检测代码优化

第四个用途是自动发现优化机会。静态分析天然适合识别"可以省 gas"的模式(如可复用的常量计算、冗余的状态读取、可合并的存储操作等),Slither 将这类发现与漏洞检测放在同等重要的位置,因为对高频链上调用而言,gas 优化直接关系成本与竞争能力。演讲的 Takeaways 同样将"发现漏洞和优化"并列("will find vulnerabilities and optimizations")。

用 Python API 构建自定义分析:从本地文件到链上合约

演讲为研究者准备的第三项关键能力是Python API——"Researchers can leverage its Python API to build custom static analyses"。这意味着你不必依赖内置检测器,而是可以把 Slither 当作一个可编程的分析后端。

自定义污点分析:detect.py

前述 detect.py 已经展示了一个完整的最小示例:加载本地 Solidity 文件(AlarmClock.sol),在 SlithIR 层面过滤Transfer操作,再用is_dependent判定转账金额是否受tx.gasprice影响。这种"IR 指令过滤 + 数据依赖判定"的组合,就是自定义安全规则的标准范式。

直接分析链上合约:mainnet.py

同一演讲还附带了 mainnet.py,展示 Slither 的输入不限于本地源码,还可以直接以链上合约地址为分析对象:

from slither import Slither from slither.slithir.operations import Transfer from slither.analyses.data_dependency.data_dependency import is_dependent from slither.core.declarations.solidity_variables import SolidityVariableComposed slither = Slither("0x4e201a5a5534bb334a3d7df4c82cd5db3bd82f29") for contract in slither.contracts: for func in contract.functions: for node in func.nodes: for operation in node.irs: if isinstance(operation, Transfer) and is_dependent( operation.call_value, SolidityVariableComposed("tx.gasprice"), func ): print(f"{node.expression} uses tainted input, tx.gasprice, in {func}")

除传入参数从文件路径换成合约地址外,其余代码完全一致——这意味着同一套自定义分析脚本可以无差别地应用于"审计前源码"与"已部署合约"两种对象,对于需要复核链上存量合约安全状况的场景尤其有价值。

更复杂的自定义检查:继承覆写检测

工作坊练习 exercise1/solution.py 展示了另一种典型的自定义分析——检测子合约是否覆写了基类函数(这类覆写往往是权限或记账逻辑被绕过的根源):

from slither.slither import Slither slither = Slither('coin.sol') coin = slither.get_contract_from_name('Coin') # Iterate over all the contracts for contract in slither.contracts: # If the contract is derived from MyContract if coin in contract.inheritance: # Get the function definition mint = contract.get_function_from_signature('_mint(address,uint256)') # If the function was not declarer by coin, there is a bug ! if mint.contract != coin: print(f'Error, {contract} overrides {mint}')

这里的思路是:先通过get_contract_from_name拿到基类对象,遍历所有继承它的合约,再用get_function_from_signature按签名取出函数、检查其声明所属的合约(mint.contract)是否仍为基类——一旦发现"函数被别的合约覆写",即输出错误。这展示了 Python API 在跨合约关系分析上的表达能力。

工业与学术影响:从一场演讲到一个分析生态

演讲的最后一部分讨论 Slither 的工业与学术影响。仓库中的资料可以完整佐证这条影响路径:

  • 学术层面:WETSEB 2019 论文 是 Slither 的正式学术出处,此后演讲材料在 EthCC 2019、RunEVM 2019 与本次 Dagstuhl 2021 相继展开,构成了"论文 → 专题演讲 → 严格方法研讨会"的完整学术传播链;
  • 工程教育层面:TruffleCon 2019 工作坊 把 Slither 与 Echidna(模糊测试)、Manticore(符号执行)组合成一整套"程序化智能合约安全"课程,说明 Slither 被设计为与其他动态分析工具互补协作的生态成员,而不仅仅是独立工具;
  • 生态扩展层面:2025 年仓库新增的 Slither MCP 集成 将静态分析结论作为"ground truth"提供给 LLM 驱动的工作流,变异测试(slither-mutate) 则把分析能力反哺到测试质量评估——从源码结构可以推断,Slither 的开放性(IR 可编程 + Python API)是这些扩展得以低成本实现的前提。

Takeaways:三个可以带走的关键结论

综合本次演讲与其配套资料,可以提炼出三条核心结论:

  1. Slither 快速且精确,能同时发现漏洞与优化点。它以静态分析的方式在 Solidity 合约上系统性地找出安全缺陷与 gas 优化机会,是"自动化审计"的可靠起点;
  2. SlithIR 是高级分析的基石。安全导向的中间表示把 Solidity 降级为可分析的指令集,污点跟踪等通用程序分析技术因此得以直接应用——理解 SlithIR 是理解 Slither 一切能力的关键;
  3. Python API 让分析可定制、可扩展。研究者既可以使用开箱即用的检测器,也可以像仓库中的 detect.py 与 mainnet.py 那样,针对自己的代码库构建专属静态分析。

对希望继续深入的学习者,建议按以下路径阅读仓库资料:先读 WETSEB 2019 论文 建立理论框架,再看本次 Dagstuhl 演讲幻灯片 与 SlithIR 专题演讲 理解 IR 设计,最后用 TruffleCon 2019 工作坊 与 Python API 演讲 的配套代码动手实践。需要注意的是,仓库内的脚本以教学演示为目的,实际使用 Slither 时请以当前发布版本的 API 为准。

【免费下载链接】publications

Publications from Trail of Bits

项目地址:https://gitcode.com/GitHub_Trending/pu/publications
点击查看免费下载
上一篇:终极HTTP命令行工具htty:10个技巧快速掌握Web API调试
下一篇:TypeStat:将JavaScript转化为更优秀的TypeScript

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 1:42:02

【车牌识别】基于matlab GUI模板匹配车牌库识别【含Matlab源码 416期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞💞💞💞💞💞💥💥💥💥💥💥 ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进; 🍎个人主页:海神之光 🏆代码获取方式: 海神之光Matlab王…

作者头像 李华