资讯动态

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

发布时间:2026/10/3 1:44:37 来源:尧图企业网站定制
【免费下载链接】publicationsPublications 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自动化漏洞检测——框架内置一套开箱即用的安全问题检测器security issue detectors提升对合约的理解——帮助开发者/审计者快速把握合约结构辅助代码审查——为人工审查提供信息支撑自动检测代码优化点——发现 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 检测器的架构具有跨语言可移植性。场景二与场景三提升合约理解、辅助代码审查PrintersSlither 的第二个与第三个用途——理解合约与辅助审查——由框架的printers打印器承担。EthCC 2019 版演讲的 Takeaways 明确指出Slithers printers will help to review contractsSlither 的打印器将帮助你审查合约。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 contracts name print(fContract: {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(fError, {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三个可以带走的关键结论综合本次演讲与其配套资料可以提炼出三条核心结论Slither 快速且精确能同时发现漏洞与优化点。它以静态分析的方式在 Solidity 合约上系统性地找出安全缺陷与 gas 优化机会是自动化审计的可靠起点SlithIR 是高级分析的基石。安全导向的中间表示把 Solidity 降级为可分析的指令集污点跟踪等通用程序分析技术因此得以直接应用——理解 SlithIR 是理解 Slither 一切能力的关键Python API 让分析可定制、可扩展。研究者既可以使用开箱即用的检测器也可以像仓库中的 detect.py 与 mainnet.py 那样针对自己的代码库构建专属静态分析。对希望继续深入的学习者建议按以下路径阅读仓库资料先读 WETSEB 2019 论文 建立理论框架再看本次 Dagstuhl 演讲幻灯片 与 SlithIR 专题演讲 理解 IR 设计最后用 TruffleCon 2019 工作坊 与 Python API 演讲 的配套代码动手实践。需要注意的是仓库内的脚本以教学演示为目的实际使用 Slither 时请以当前发布版本的 API 为准。赞分享【免费下载链接】publicationsPublications from Trail of Bits项目地址https://gitcode.com/GitHub_Trending/pu/publications点击查看免费下载相关推荐终极Slither静态分析工具指南区块链智能合约安全检测的10个关键技巧 终极Slither静态分析工具指南区块链智能合约安全检测的10个关键技巧 在区块链智能合约开发中 Slither静态分析工具 是保护你的数字资产免受攻区块链教育上一篇终极HTTP命令行工具htty10个技巧快速掌握Web API调试下一篇TypeStat将JavaScript转化为更优秀的TypeScript创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑