深入 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),仅供参考

相关新闻

4步搞定Zotero PDF中文翻译插件:英文文献轻松变中文,双语对照随心读

4步搞定Zotero PDF中文翻译插件:英文文献轻松变中文,双语对照随心读

4步搞定Zotero PDF中文翻译插件:英文文献轻松变中文,双语对照随心读 【免费下载链接】zotero-pdf2zh PDF2zh for Zotero | Zotero PDF中文翻译插件 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf2zh Zotero PDF2zh 是一款专为 Zotero …

2026/10/25 7:50:07 阅读更多 →
OpenMower自动回桩充电原理揭秘:Docking状态机的完整工作流程解析

OpenMower自动回桩充电原理揭秘:Docking状态机的完整工作流程解析

OpenMower自动回桩充电原理揭秘:Docking状态机的完整工作流程解析 【免费下载链接】open_mower_ros 项目地址: https://gitcode.com/gh_mirrors/op/open_mower_ros OpenMower是一套基于ROS的开源自动割草机系统,其中最令人惊叹的功能之一&#x…

2026/10/25 16:26:16 阅读更多 →
当具身巡检机器人走进工厂:工业爬虫的5个升级方向与能力迁移路径

当具身巡检机器人走进工厂:工业爬虫的5个升级方向与能力迁移路径

很多做工业数据采集的开发者最近都有同一个疑问:巡检机器人都能自主跑现场读仪表、查异响、测温度了,做工业爬虫的是不是要被替代了? 答案恰恰相反。具身智能不是工业爬虫的终结者,而是把工业数据采集的边界,从比特世界…

2026/10/24 9:08:23 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →