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


    安装Truffle框架

    安装nvm(Node 版本管理器)

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

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

    在这里插入图片描述
    2、解压之后安装,安装后自动配置环境变量

    在这里插入图片描述

    3、nvm -v 查看版本

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装truffle

    npm -g install truffle
    
    • 1

    创建truffle项目目录

    mkdir Faucet
    cd Faucet
    truffle init   // 初始化truffle
    npm init    // 初始化npm目录结构
    
    • 1
    • 2
    • 3
    • 4

    配置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{}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    编译合约

    truffle compile
    
    • 1

    部署合约

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

    使用truffle控制台

    truffle console --network ropsten
    
    • 1

    获取当前账户

    web3.eth.getAccounts()
    
    • 1

    根据地址获取账户余额

    web3.eth.getBalance(accounts[0])
    
    • 1

    根据合约名获取合约地址

    Faucet.address
    
    • 1

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

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

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述

    查看合约账户余额,0.6 ether

    在这里插入图片描述

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

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

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

  • 相关阅读:
    Serverless成技术新常态:降低开发门槛,让效率更快一点
    智能体重秤方案主控采用CSU18M91
    Redis笔记基础篇:6分钟看完Redis的八种数据类型
    Vue3+ElementPlus+axios+暗黑模式
    1.1数据结构的基本概念
    kicad源代码研究:symbol properties窗口中为SCH_SYMBOL添加或删除一个sch_field
    在 Windows 下使用 conda 的一些注意点
    npm作用域包和版本
    杰理之开了多种解码格式插卡到播放等待的时间长【篇】
    HarmonyOS NEXT应用开发之MpChart图表实现案例
  • 原文地址:https://blog.csdn.net/henulmh/article/details/126720258