yueying007

Posted on Apr 17, 2022Read on Mirror.xyz

区块链开发课第四讲 使用Truffle测试智能合约

在这一讲中,我们将用Truffle对上一讲中的SimpleArbi.sol进行测试。

web3 provider

首先,我们需要从Alchemy.com申请一个免费的web3 provider:

https://dashboard.alchemyapi.io/

注册成功后,点击Create App,选择Ethereum Mainnet,然后在生成的App后面找到view key,将里面的http url保存到本地,以后我们与以太坊进行交互,都要通过这个http url来发送JSON-RPC请求。

Truffle

如果还没有安装Truffle:

npm install -g truffle

我们建立一个Deploy目录,在里面初始化一个Truffle工程:

mkdir ~/Projects/Deploy
cd ~/Projects/Deploy
truffle init

我们看到它自动生成了几个目录:

build: 存放编译好的智能合约abi

contracts: 存放智能合约的源代码

migrations: 存放部署脚本

首先我们打开truffle-config.js,做一些基本配置:

在networks中的development项,配置测试环境下的IP、端口以及network_id,同时把skipDryRun设置为true。

networks: {
 development: {
   host: "127.0.0.1",     
   port: 8545,            
   network_id: "*",       
   skipDryRun: true
 },
},

在compilers项,设置solidity的版本号(0.8.0),optimizer enabled设置为true。

compilers: {
  solc: {
     version: "0.8.0",    
     settings: {         
      optimizer: {
        enabled: true,
        runs: 200
      },
    }
  }
}

然后,在migrations目录下,新建一个脚本2_deploy_contracts.js,通过这个脚本告诉truffle如何部署我们的合约:

var SimpleArbi = artifacts.require("../contracts/SimpleArbi.sol");module.exports = function(deployer, network, accounts) {
 deployer.deploy(SimpleArbi);
};

接下来,把SimpleArbi.sol文件拷贝到contracts目录下。

下面,我们开始进行编译:

cd ~/Projects/Deploy
truffle compile

当出现Compiled susccesfully using:…的提示时,就表示编译成功了。

部署

下面我们把编译好的智能合约部署在本地的测试环境下。

如果还没有安装Ganache-cli:

npm install -g ganache-cli

打开另外一个Terminal,建立一个以太坊主网的fork环境(后面的https://…是你刚才从Alchemy申请的http url):

ganache-cli --fork https://eth-mainnet.alchemyapi.io/v2/你的api_key

它为我们自动建立了十个测试账户,每个里面有100ETH,在与合约交互时,它会默认使用第一个账户。

回到第一个Terminal中进行部署:

cd ~/Projects/Deploy
truffle migrate

部署成功后,它显示了交易哈希、合约地址等信息:

测试

下面,我们就可以进行测试了。

进入truffle控制台:

cd ~/Projects/Deploy
truffle console

先定义WETH的地址:

WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';

用instance代表合约的实例:

instance = await SimpleArbi.deployed();

查看一下合约的所有者是谁:

owner = await instance.getOwner()
owner

向合约转10个ETH:

instance.send(web3.utils.toWei('10', 'ether'))

调用合约的ETHtoWETH()函数,把5个ETH转换为WETH:

instance.ETHtoWETH(web3.utils.toWei('5', 'ether'))

调用合约的getTokenBalance()函数,检查一下合约中WETH的余额:

weth = await instance.getTokenBalance(WETH, instance.address);
weth.toString();

调用合约的turnOutToken()函数,把WETH转出到所有者的钱包里:

instance.turnOutToken(WETH, weth)

检查一下所有者钱包里的WETH数量:

weth = await instance.getTokenBalance(WETH, accounts[0]);
weth.toString();

最后,我们来测试一下flashLoan()函数,发起一笔闪电贷,:

result = await instance.flashLoan(WETH, web3.utils.toWei('100'))
result

交易成功,如果想看交易日志:

result.receipt.rawLogs

结语

至此,我们在本地的主网fork环境下,对SimpleArbi.sol合约的函数进行了测试,由于测试环境是完全fork主网的,所以就可以放心地部署到主网上面了。下一讲中,我们继续丰富合约代码,在其中加入Dex套利操作。

这一讲的代码在github上同步更新:

欢迎来即刻App与我互动,即刻账号: 月影007