在我们发布【链必验】新版本之后,目前已有大批开发者前来试用,今天,我们还需要详细介绍这款工具。
【链必验】智能合约自动检测工具,可用来检测区块链智能合约漏洞。平台针对每个用户模拟了一条单独的测试链,用户可以自主在测试链上对智能合约进行部署、测试和验证,是集智能合约开发、测试、验证于一体的综合平台。
在验证的过程中,平台采用形式化验证等技术,对执行环境进行建模,通过数学推理等方法对安全属性进行验证,发现合约在运行时可能出现的安全问题,协助合约开发者发现合约中的潜在安全隐患,定位漏洞产生的位置,增强合约的安全性。主要包含四大方面的检测:代码规范检测、标准规范检测、函数调用检测、业务逻辑安全检测。
Web3.0世界,最不可或缺的,便是智能合约。今天,跟着我们一起来学习这款智能合约自动检测工具,一起解锁Web3.0世界。
ONE 代码规范检测
1.内存ABIEncoderV2数组
等级:ERROR
描述:0.4.7-0.5.9版本solc编译器存在一个BUG,此BUG会导致abi.encode接口处理多维数组时产生错误结果。
样例
在编译器版本为0.5.9时,嵌套数组badArr的返回值是错误的,为 [[1, 2], [2, 3], [3, 4]]。在编译器版本为0.6.7时,嵌套数组badArr的返回值是正确的,为 [[1, 2], [3, 4], [5, 6]]。
修复建议:避免使用0.4.7-0.5.9编译器,或禁止使用0.4.7-0.5.9编译器中的abi.encode接口。
2.多重构造函数
等级:ERROR
描述:在0.4.22版本的编译器中,合约允许合约同时存在两个格式的构造函数(以constructor关键字声明构造函数,或以合约名声明函数)。因此构造函数中的变量存在相互覆盖的危险。
样例
constructor()中初始化x为1,而Test()初始化x为2,位置靠后定义的构造函数会失效,因此x最终会被初始化为1。
修复建议:只使用一种构造函数。
3.公开的mapping嵌套结构变量
等级:ERROR
描述:公开的变量有一个默认的只读getter函数,但公开的mapping嵌套引用结构将导致非法的getter函数。
样例
公开的mappingm嵌套了引用类型struct,将导致针对public变量的默认的读取方法m[1].a失败。
修复建议:避免使用public mapping嵌套引用类型,或者使用pragma experimental ABIEncoderV2。
4.从右到左读写控制字符
等级:ERROR
描述:Unicode [U+202E] 强制编译器从右到左读取,与正常顺序相反,可能误导使用者。
样例
_f函数期待输入值i,j,m依次传递给a,b,c由于有U+202E的存在,输入函数需要以j,i,m的顺序给出。
修复建议:避免使用U+202E字符。
5.状态变量覆盖
等级:ERROR
描述:合约的继承包括状态变量的继承,在子合约中重载基类合约的状态变量可能会造成变量的使用逻辑错误。
样例
合约Test是Base的子合约,Test中a的定义重载了Base中的状态变