使用Truffle编译智能合约及所遇到的问题

  • Post author:
  • Post category:其他




安装Truffle框架



安装nvm(Node 版本管理器)

1.下载安装nvm,首先安装目录不要有空格和中文,会出现乱码

 https://github.com/coreybutler/nvm-windows/releases

在这里插入图片描述

2、解压之后安装,安装后自动配置环境变量

在这里插入图片描述

3、nvm -v 查看版本

在这里插入图片描述

4、通过如下指令进行node版本的安装、替换

nvm list     //查看已安装的nodejs版本
nvm on      // 启用node.js版本管理
nvm off   // 禁用node.js版本管理(不卸载任何东西)
nvm install <version>       // 安装node.js的命名 version是版本号 例如:nvm install 8.12.0
nvm use <version>      //使用某一version的nodejs
nvm uninstall <version>   // 卸载指定版本的nodejs



安装truffle

npm -g install truffle



创建truffle项目目录

mkdir Faucet
cd Faucet
truffle init   // 初始化truffle
npm init    // 初始化npm目录结构



配置truffle

我是通过VS code 打开项目,编辑truffle-config.js文件



配置网络

在这里插入图片描述

配置本地以太坊网络和远程的以太坊测试网络方式有所差异,可见上方。

注意:这里需要绑定solidity的版本,后续有一个错误就是由于未绑定所致。



使用Truffle部署合约

Truffle提供了名为 “migration” 的部署机制,用于跟踪哪些合约(及他们的版本)已经被部署了。

migration有关的脚本代码都保存在Truffle的migrations目录,初始时该目录下有一个1_initial_migration.js文件,用来部署Migrations.sol自身。

我们现在需要编写第二个migration脚本,用来部署Faucet.sol。

在这里插入图片描述

Faucet.sol合约:

// Version of Solidity compiler this program was written for
pragma solidity >=0.4.22 <0.9.0;

// Our first contract is a faucet!
contract Faucet {

	// Accept any incoming amount


	// Give out ether to anyone who asks
	function withdraw(uint withdraw_amount) public {

    	// Limit withdrawal amount
    	require(withdraw_amount <= 100000000000000000);

    	// Send the amount to the address that requested it
    	msg.sender.transfer(withdraw_amount);
    }

    receive() external payable{}

}



编译合约

truffle compile



部署合约

truffle migrate --network ropsten  // 部署到指定的ropsten网络



使用truffle控制台

truffle console --network ropsten



获取当前账户

web3.eth.getAccounts()



根据地址获取账户余额

web3.eth.getBalance(accounts[0])



根据合约名获取合约地址

Faucet.address



执行转账交易(转入合约账户)

web3.eth.sendTransaction({from: accounts[0], to: Faucet.address, value:web3.utils.toWei('0.1','ether')})

在这里插入图片描述

可在测试网络上查看交易信息:

在这里插入图片描述

在这里插入图片描述

查看合约账户余额,0.6 ether

在这里插入图片描述



调用合约退款函数(合约转钱到调用账户)

Faucet.deployed().then(instance => {instance.withdraw(web3.utils.toWei('0.1','ether'))})

取0.1 ether,在withdraw函数中,require判定最多取0.1 ether

取过之后可查看交易:

在这里插入图片描述

在这里插入图片描述

交易信息:

在这里插入图片描述

此时再查看合约的余额:

在这里插入图片描述

当调用函数转账超过0.1 ether 时会报错!转账失败

在这里插入图片描述



编译合约时遇到的错误

(1)ParserError: Expected identifier but got ‘(’

receive() external payable{}

解决方式:选用6版本以上的solidity,并在truffle-config文件中绑定

在这里插入图片描述

(2)ParserError: Expected primary expression.

payable(msg.sender).transfer(withdraw_amount);

解决方式:solidity版本问题,别选太高,好像是8的话address不支持可支付需要带payable,但带上payable,truffle编译合约会报这个错误。因此我最后选用solidity 6从而不需要带payable。

(3)truffle migrate 重新部署合约出现 network up to date.

解决方式:truffle migrate –reset

由于合约移植是懒编译的,如果发现已经发布过,且发布的版本号没有变化就不会再发布,所以使用–reset。使用truffle migrate –reset来强制重编译并发布所有合约



版权声明:本文为henulmh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。