目录
安装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来强制重编译并发布所有合约