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