前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你用Echidna测试智能合约

手把手教你用Echidna测试智能合约

作者头像
Tiny熊
发布2022-04-11 13:42:19
8810
发布2022-04-11 13:42:19
举报
文章被收录于专栏:深入浅出区块链技术

本文作者:darren94me[1]

随着 Web3 的迅猛发展,各种智能合约[2]层出不穷,某些智能合约中的漏洞很致命的:无论是以代币还是以太币的形式,合约可以管理重要的财产资源,漏洞造成的损失将可能以数百万美元计。不过,以太坊区块链上的代码比任何单个合约都更重要:智能合约库代码。

除了使库产生不正确的结果之外,此类漏洞可能会产生其他后果;如果攻击者可以强制库代码意外恢复,那么他们就有了潜在的拒绝服务攻击的机会。如果攻击者可以使库函数进入失控循环,他们可以将拒绝服务与昂贵的 gas 消耗结合起来。

下面介绍下 Echidna 的使用。

准备

  • 下载 docker,并且安装。
  • 下载对应的仓库
代码语言:javascript
复制
docker pull trailofbits/eth-security-toolbox
  • 建立测试目录,并且进入当前目录。
代码语言:javascript
复制
docker run -it --rm -v $PWD:/code trailofbits/eth-security-toolbox

rm:在容器启动时设置--rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统

控制台出现如下,则说明安装成功。

代码语言:javascript
复制
┌──        ┌──┐      ──┬──
├─         └──┐        │
└──THEREUM─┴──┴ECURITY─┴OOLBOX

https://github.com/trailofbits/eth-security-toolbox

by   ################
    ##########TRAIL#
         ####
        ####    ###########
       ####    ###########
      \###    ####     ####
     /\\# of ####     ####
    /  \    ############
    \__/   ####      ####
          \###      ####
         /\\#########
        /__\\##BITS#

Security Tools and Resources Installed:

https://github.com/trailofbits/echidna
https://github.com/trailofbits/etheno
https://github.com/trailofbits/manticore
https://github.com/trailofbits/slither
https://github.com/trailofbits/rattle
https://github.com/trailofbits/not-so-smart-contracts
  • 查看编译版本
代码语言:javascript
复制
solc --version

solc, the solidity compiler commandline interface
Version: 0.8.9+commit.e5eed63a.Linux.g++
  • 切换 solidity 版本
代码语言:javascript
复制
ethsec@36ba204276db:/code$ solc-select install  0.7.6
Installing '0.7.6'...
Version '0.7.6' installed.
ethsec@36ba204276db:/code$ solc-select use 0.7.6
Switched global version to 0.7.6
ethsec@36ba204276db:/code$ solc --version
solc, the solidity compiler commandline interface
Version: 0.7.6+commit.7338295f.Linux.g++

测试入门

参考源码:https://github.com/darrenli6/echidna_example

  • 测试
代码语言:javascript
复制
ethsec@36ba204276db:/code$ echidna-test TestEchidna.sol --contract TestCounter
  • 测试过程中,如果等待时间长,我们可以限制测试次数。
代码语言:javascript
复制
ethsec@36ba204276db:/code$ echidna-test TestEchidna.sol --test-limit 500  --contract TestCounter
  • 如果我们想要测试失败结果,在合约内部加入如下逻辑,返回 false 即可
代码语言:javascript
复制
function echidna_test_fails() public view returns(bool){
      return false;
   }

测试进阶

  • 测试

源码[3]

当执行第六次的时候,就出现 failed.

  • 测试 assert[4]
代码语言:javascript
复制
ethsec@36ba204276db:/code$ echidna-test TestEchidna4.sol   --contract TestAssert --check-asserts

当输入 10 的时候,会出现失败。

  • 测试绝对数函数

源码[5]

代码语言:javascript
复制
ethsec@36ba204276db:/code$ echidna-test TestEchidna4.sol   --contract TestAssert --check-asserts
  • 测试时间戳 block.timestamp

源码[6]

代码语言:javascript
复制
ethsec@36ba204276db:/code$ echidna-test TestEchidnaTestTimeAndCaller.sol  --test-limit 5000

当修改源码为

代码语言:javascript
复制
uint delay =70 days;

说明 Echidna 无法快进 70 天,因此没有修改 pass 的状态。

  • 设置快进时间,time.yaml,可以快进 70 天
代码语言:javascript
复制
ethsec@36ba204276db:/code$ echidna-test TestEchidnaTestTimeAndCaller.sol  --test-limit 5000 --config time.yaml

参考资料

[1]

darren94me: https://learnblockchain.cn/people/4859

[2]

智能合约: https://learnblockchain.cn/2018/01/04/understanding-smart-contracts

[3]

源码: https://github.com/darrenli6/echidna_example/blob/master/TestEchidna2.sol

[4]

assert: https://github.com/darrenli6/echidna_example/blob/master/TestEchidna3.sol

[5]

源码: https://github.com/darrenli6/echidna_example/blob/master/TestEchidna4.sol

[6]

源码: https://github.com/darrenli6/echidna_example/blob/master/TestEchidnaTestTimeAndCaller.sol

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 测试入门
  • 测试进阶
    • 参考资料
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档