Pre:
熟悉一下SLITHER
该工具的使用,主要想用它的graph
来帮助阅读sol源码
介绍:
Slither是一个用Python 3编写的智能合约静态分析框架,提供如下功能:
自动化漏洞检测。提供多项的漏洞检查模型,模型列表详见:link
自动优化检测。Slither可以检测编译器遗漏的代码优化项并给出优化建议。
代码理解。Slither能够绘制合约的继承拓扑图,合约方法调用关系图等,帮助开发者理解代码。
辅助代码审查。用户可以通过API与Slither进行交互。
安装与启动:
docker安装:
1 | # 安裝 docker image: |
docker共享目录volume:
1 | # docker里创建目录: |
我是使用图形化工具共享目录
1 | # 共享源文件目录 |
SLITHER使用:
检查solc版本:
1 | # 查看已安装的solc版本列表 |
漏洞检测:
1 | # 开始扫描 |
报错,不支持相对导入 import "../ERC20.sol";
修改import语句,成import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
1 | # 指定 --solc-remaps 来告诉编译器 openzeppelin 的具体位置 |
扫描结果:
输出合约继承关系图:
1 | # 输出合约继承关系 --print inheritance-graph |
执行结果:
生成的是.dot文件
使用在线工具,转换一下.dot
格式的文件,来输出图形
图示说明:
-
如果合约具有多重继承,则在连接线将按声明顺序标记。
-
以橙色突出显示的函数会覆盖父函数。(看override的情况)
-
不直接相互覆盖(但由于多重继承而冲突)的函数将在受影响的合约节点底部以灰色字体突出显示。
-
以红色突出显示的变量掩盖了父变量声明。
-
类型变量contract以蓝色字体在括号中指定合约名称。
Useful!!!
输出合同的快速摘要:
1 | # --print contract-summary |
这跟继承关系差不多,呈现的方式有些不一样。
更多打印功能,可看slither Printer documentation,这个工具还是蛮实用和有趣的,So cool ~
输出可读的合同摘要:
1 | # --print human-summary |
内容大概有:代码总行数、汇编代码总行数、漏洞检测汇总信息等。