023:ERC20众筹实例之部署调试|《ETH原理与智能合约开发》笔记

待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。

课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第七课分为三部分:

  1. Solidity语法之多继承
  2. ERC20众筹实例之合约分析
  3. ERC20众筹实例之部署调试

这篇文章是第七课第三部分的学习笔记:ERC20众筹实例之部署调试。


这节课主要讲解了一个众筹实例的部署调试。

( 部署工作还是在 Truffle 中进行,之前的一个简单例子可见《019:Truffle简介与使用》 )

  1. 新建目录
mkdir ari_coin
  1. 进入到刚才新建的目录,用 truffle 初始化项目
truffle init
  1. 安装智能合约框架Zeppelin
npm install -E openzeppelin-solidity
  1. 可以通过 cdls等命令查看目录、文件。

其中,有关openzeppelin的合约在air_coin/node_modules/openzeppelin-solidity/contracts 目录下。具体代码见前两小节的分析。(《分析1》和《分析2》)

  1. 老师的合约代码拷贝到 air_coin/contracts 目录

注:老师的合约代码在仓库中,可见这节。

查看代码:vim 文件名

①、air_coin/contracts/AirCoin.sol

pragma solidity 0.4.23;

import 'openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol';

contract AirCoin is MintableToken {
    string public name = "Air COIN";
    string public symbol = "AIR";
    uint8 public decimals = 18;
}

这个合约说明 AirCoin 继承自 MintableToken ,定义了名称、符号、最小单位。

②、air_coin/contracts/AirCoinCrowdsale.sol

pragma solidity 0.4.23;

import './AirCoin.sol';
import 'openzeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol';
import 'openzeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol';


contract AirCoinCrowdsale is TimedCrowdsale, MintedCrowdsale {
    function AirCoinCrowdsale
        (
            uint256 _openingTime,
            uint256 _closingTime,
            uint256 _rate,
            address _wallet,
            MintableToken _token
        )
        public
        Crowdsale(_rate, _wallet, _token)
        TimedCrowdsale(_openingTime, _closingTime) {

        }
}

AirCoinCrowdsale 众筹合约继承自TimedCrowdsale 和 MintedCrowdsale 合约,开头先导入他们。

在构造函数部分设置了开启时间,关闭时间,汇率、钱包地址,token地址。然后用这些参数初始化父类合约。

  1. 修改 air_coin/truffle.js 代码,加入network 一串代码
module.exports = {
  // See 
  // for more about customizing your Truffle configuration!
  networks: {
    development: {
      host: "192.168.1.12", //老师的是这个地址,我的用的localhost
      port: 8545,
      network_id: "*" // Match any network id
    }
  }
};
  1. 查看migrations/2_deploy_contracts.js 代码
2_deploy_contracts.js

这个文件设置了开始时间,结束时间,汇率为8,集资的钱包地址为地址1 。

  1. 在右边窗口打开ganache测试网络 ganache-cli

tmux,进入 tmux
ctrl + B, shift + 5, 左右分屏
更多tmux的操作见这节。

  1. 左边窗口 编译 truffle compile (需要把三个.sol文件的版本改为0.4.24)

  2. 部署合约 truffle migrate

  3. 连到测试网络 truffle console

  4. 设置购买人 buyer = web3.eth.accounts[2] ,购买人设置地址2 。

  5. 取得众筹实例: AirCoinCrowdsale.deployed().then(inst => { crowdsale = inst })

  6. 取得 token的地址: crowdsale.token().then(addr => { tokenAddress = addr } )

  7. 恢复一个实例: airCoinInstance = AirCoin.at(tokenAddress)

  8. ownship 换一下,转给众筹合约。airCoinInstance.transferOwnership(crowdsale.address)
    返回状态 status:'0x01' 成功

  9. 检查空气币的总供给,应该是零,还没有人买。airCoinInstance.totalSupply().then(supply => supply.toString(10))

  10. 购买者的空气币余额也是零,还没有买。airCoinInstance.balanceOf(buyer).then(balance => balance.toString(10))

  11. 利用众筹合约,购买500wei,crowdsale.sendTransaction({ from: buyer, value: 500});或者 5 个以太币,crowdsale.sendTransaction({ from: buyer, value: web3.toWei(5, "ether")})(只是不易观察,数字太长)。

  12. 重复17、18 步,查看余额,都是 4000,因为汇率是 8,500*8=4000 。


课后作业:500wei 转给地址1 了,怎么把它显示出来?

经过翻书查资料,找到了下面两条指令,
wallet=web3.eth.accounts[1]
web3.eth.getBalance(wallet).toString()
返回的结果是100000000000000000500(即,100×10^18+500,地址默认有100 ether,1 ether = 10^18 wei ),结果正确。


小结:本课把前面两小节的众筹实例在 Truffle 上实现了出来,进行了部署,并演示了众筹的模拟。

不足之处,请批评指正。

你可能感兴趣的:(023:ERC20众筹实例之部署调试|《ETH原理与智能合约开发》笔记)