深入 SmartBugs 源码:从 CLI 参数到 Docker 任务调度的执行全流程

发布时间:2026/8/16 15:32:37
深入 SmartBugs 源码:从 CLI 参数到 Docker 任务调度的执行全流程 深入 SmartBugs 源码从 CLI 参数到 Docker 任务调度的执行全流程【免费下载链接】smartbugsSmartBugs: A Framework to Analyze Ethereum Smart Contracts项目地址: https://gitcode.com/gh_mirrors/smar/smartbugsSmartBugs 是一个开源的以太坊智能合约安全分析框架能够统一调度 Mythril、Slither、Oyente 等 30 分析工具。本文带你深入 SmartBugs 源码完整梳理从命令行参数解析、配置合并、任务组装到 Docker 容器并行调度的执行全流程帮助新手快速看懂框架内部运作机制。SmartBugs 执行全流程一张图看懂整体架构SmartBugs 的源码核心位于sb/包中整个执行链路可以浓缩为 6 个关键阶段┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ CLI 入口 │──▶│ 配置合并 │──▶│ 文件收集 │──▶│ 任务组装 │──▶│ 并行调度 │──▶│ 结果解析 │ │ cli.py │ │settings │ │smartbugs│ │smartbugs│ │analysis │ │parsing │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ ▼ ▼ Docker 执行 结果文件 docker.py result.*每个阶段各司其职sb/cli.py负责解析参数sb/settings.py负责配置合并sb/smartbugs.py负责文件收集与任务组装sb/analysis.py负责多进程调度sb/docker.py负责容器执行sb/parsing.py负责结果标准化。第一步SmartBugs 入口与 CLI 参数解析程序从哪里开始执行SmartBugs 的入口非常简洁无论是运行python -m sb还是直接执行smartbugs命令最终都会调用sb/cli.py中的main()函数# sb/__main__.py import sb.cli if __name__ __main__: sb.cli.main()真正干活的是sb/cli.py中的cli_args()函数它使用 Python 标准库argparse构建命令行解析器并把参数划分为四个分组逻辑非常清晰。四大参数分组速览输入选项input-t/--tools指定分析工具、-f/--files指定合约文件支持 glob 通配符和DIR:前缀、-c/--configuration指定配置文件、--main只分析同名合约、--runtime分析部署后的字节码而非部署代码执行选项execution--processes设置并行进程数、--timeout设置每个任务的超时秒数、--cpu-quota与--mem-limit限制 Docker 容器资源、--continue-on-errors出错后继续执行输出选项output--runid设置运行标识、--results指定结果目录、--json输出解析后的 JSON、--sarif额外输出 SARIF 格式、--quiet静默模式信息选项information-v/--version显示版本、--debug开启调试日志值得注意的是cli_args()中凡是值为None的参数都会被丢弃这正是命令行参数优先级最高这一设计的实现基础。第二步配置合并的优先级顺序与模板展开机制三级配置的合并顺序SmartBugs 的配置采用低优先级在前、高优先级在后的覆盖式合并在sb/cli.py的cli()函数中实现站点级配置site_cfg.yaml项目根目录用户级配置~/.smartbugs/cfg.yaml命令行-c指定的配置文件命令行直接传入的参数优先级最高freeze() 冻结与模板变量展开配置合并完成后sb/smartbugs.py的main()会调用settings.freeze()把所有模板变量一次性展开。默认的runid是${YEAR}${MONTH}${DAY}_${HOUR}${MIN}会自动替换成类似20260815_0840的时间戳结果目录默认模板为results/${TOOL}/${RUNID}/${FILENAME}其中的$TOOL、$FILENAME等变量则留到生成每个任务时再逐个替换相关实现见sb/settings.py的resultdir()方法。第三步工具加载与三种分析模式匹配SmartBugs 之所以能统一调度众多工具靠的是sb/tools.py的load()函数。每个工具在tools/工具名/config.yaml中声明自己的配置例如 Mythril 的配置就同时声明了solidity、bytecode、runtime三种模式。alias 别名机制有些工具目录只是别名比如tools/slither/config.yaml里只有一个alias: [slither-0.11.3]load()发现alias字段后会自动递归加载指向的真实工具配置这就是为什么你可以在命令行中写slither而无需关心具体版本。三种模式与文件类型的对应关系solidity模式分析.sol源码文件bytecode模式分析.hex部署字节码runtime模式分析.rt.hex运行时字节码或使用--runtime参数另外工具配置中的command和entrypoint是string.Template模板执行时会把$FILENAME、$TIMEOUT、$BIN、$MAIN等变量替换为实际值见sb/tools.py中的command()与entrypoint()方法。第四步文件收集与任务组装的完整过程collect_files匹配合约文件sb/smartbugs.py的collect_files()用glob递归匹配文件模式只接受.sol和.hex后缀还支持.sbd清单文件——里面每一行是一个文件路径可以批量列出待分析合约。collect_tasks文件 × 工具 任务任务组装是框架的核心逻辑简单说就是每个文件 × 每个匹配模式的分析工具 一个任务solc 版本匹配对于.sol文件先通过sb/solidity.py提取 pragma 版本约束再用sb/semantic_version.py匹配可用的编译器版本匹配不到会直接报错结果目录去重多个任务可能生成相同的结果目录disambiguate()会自动追加_2、_3后缀解决冲突Docker 镜像预加载ensure_tool_is_loaded()会检查镜像是否已存在不存在则先docker pull第五步多进程并行调度的核心实现任务队列与工作进程sb/analysis.py的run()是调度中枢采用multiprocessing的spawn模式保证 Linux 和 macOS 行为一致把所有任务随机打乱后放入任务队列队尾放入 N 个None哨兵启动 N 个analyser工作进程N 即--processes参数工作进程不断从队列取任务执行遇到None哨兵即退出进度统计与 ETC 预估框架还维护了tasks_started、tasks_completed、time_completed三个共享计数器post_analysis()根据已用时间 ÷ 已完成任务 × 剩余任务 ÷ 进程数实时估算剩余完成时间ETC让你在跑大批量任务时心里有数。第六步Docker 容器中的任务执行细节临时目录挂载与命令组装sb/docker.py的execute()负责在容器内运行分析工具细节非常讲究创建临时目录把合约文件复制进去字节码模式还会做0x前缀清洗将工具脚本目录bin/和 solc 编译器一并复制到临时目录临时目录以只读/读写方式挂载到容器的/sb路径默认禁用容器网络network: none避免分析工具意外访问外网超时控制与三连重试容器运行后调用container.wait(timeout...)实现超时控制超时则强制stop。由于 Docker 偶发连接错误sb/analysis.py的execute()还会在失败后等待 3~8 分钟再重试最多重试 3 次。结束后容器会被kill和remove清理干净不留垃圾进程。第七步结果解析、输出与常见参数速查动态加载 parser 解析结果分析完成后sb/parsing.py会按工具动态加载对应的tools/工具/parser.py把工具的原始输出result.log和result.tar解析成统一的findings / infos / errors / fails四类结果开启--sarif时还会通过sb/sarif.py额外生成result.sarif文件方便接入 CI 安全扫描流水线。结果文件清单每个任务的结果目录下最终会生成result.log工具日志、result.tar工具原始输出、result.json解析结果、result.sarif可选、smartbugs.json任务元数据。常用命令速查表使用场景推荐命令单工具分析smartbugs -t mythril -f samples/0.8.24/SimpleDAO.sol多工具并行smartbugs -t mythril slither oyente -f samples/0.8.24/*.sol控制并行度追加--processes 4 --timeout 600输出解析结果追加--json或--sarif覆盖重跑追加--overwrite总结SmartBugs 源码给我们的启发回顾整个执行全流程SmartBugs 源码的设计有三点很值得学习插件化——新增一个分析工具只需在tools/下放一个config.yaml和parser.py配置分层——站点、用户、命令行三级配置合并思路清晰容器化隔离——所有分析工具都在 Docker 中运行既保证了环境一致性又通过超时和资源限制保护了宿主机。如果你想亲手跑一遍源码可以执行git clone https://gitcode.com/gh_mirrors/smar/smartbugs获取项目然后按照doc/installation.md安装依赖再对照本文的流程一步步打断点观察相信你对智能合约安全分析框架的理解会再上一个台阶。【免费下载链接】smartbugsSmartBugs: A Framework to Analyze Ethereum Smart Contracts项目地址: https://gitcode.com/gh_mirrors/smar/smartbugs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考