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

目录

  • 安装Truffle框架
    • 安装nvm(Node 版本管理器)
    • 安装truffle
  • 创建truffle项目目录
  • 配置truffle
    • 配置网络
  • 使用Truffle部署合约
    • 编译合约
    • 部署合约
    • 使用truffle控制台
      • 获取当前账户
      • 根据地址获取账户余额
      • 根据合约名获取合约地址
      • 执行转账交易(转入合约账户)
      • 调用合约退款函数(合约转钱到调用账户)
  • 编译合约时遇到的错误

安装Truffle框架

安装nvm(Node 版本管理器)

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

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

使用Truffle编译智能合约及所遇到的问题_第1张图片
2、解压之后安装,安装后自动配置环境变量

使用Truffle编译智能合约及所遇到的问题_第2张图片

3、nvm -v 查看版本

使用Truffle编译智能合约及所遇到的问题_第3张图片

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

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

安装truffle

npm -g install truffle

创建truffle项目目录

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

配置truffle

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

配置网络

使用Truffle编译智能合约及所遇到的问题_第4张图片
配置本地以太坊网络和远程的以太坊测试网络方式有所差异,可见上方。
注意:这里需要绑定solidity的版本,后续有一个错误就是由于未绑定所致。

使用Truffle部署合约

Truffle提供了名为 “migration” 的部署机制,用于跟踪哪些合约(及他们的版本)已经被部署了。
migration有关的脚本代码都保存在Truffle的migrations目录,初始时该目录下有一个1_initial_migration.js文件,用来部署Migrations.sol自身。
我们现在需要编写第二个migration脚本,用来部署Faucet.sol。

使用Truffle编译智能合约及所遇到的问题_第5张图片

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')})

使用Truffle编译智能合约及所遇到的问题_第6张图片

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

使用Truffle编译智能合约及所遇到的问题_第7张图片

使用Truffle编译智能合约及所遇到的问题_第8张图片

查看合约账户余额,0.6 ether

在这里插入图片描述

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

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

取0.1 ether,在withdraw函数中,require判定最多取0.1 ether
取过之后可查看交易:

在这里插入图片描述

在这里插入图片描述
交易信息:

使用Truffle编译智能合约及所遇到的问题_第9张图片

此时再查看合约的余额:

在这里插入图片描述

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

使用Truffle编译智能合约及所遇到的问题_第10张图片

编译合约时遇到的错误

(1)ParserError: Expected identifier but got ‘(’
receive() external payable{}

解决方式:选用6版本以上的solidity,并在truffle-config文件中绑定
使用Truffle编译智能合约及所遇到的问题_第11张图片
(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来强制重编译并发布所有合约

你可能感兴趣的:(智能合约,区块链,以太坊)