待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。
课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第七课分为三部分:
- Solidity语法之多继承
- ERC20众筹实例之合约分析
- ERC20众筹实例之部署调试
这篇文章是第七课第三部分的学习笔记:ERC20众筹实例之部署调试。
这节课主要讲解了一个众筹实例的部署调试。
( 部署工作还是在 Truffle 中进行,之前的一个简单例子可见《019:Truffle简介与使用》 )
- 新建目录
mkdir ari_coin
- 进入到刚才新建的目录,用 truffle 初始化项目
truffle init
- 安装智能合约框架Zeppelin
npm install -E openzeppelin-solidity
- 可以通过
cd
、ls
等命令查看目录、文件。
其中,有关openzeppelin的合约在air_coin/node_modules/openzeppelin-solidity/contracts 目录下。具体代码见前两小节的分析。(《分析1》和《分析2》)
- 把老师的合约代码拷贝到 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地址。然后用这些参数初始化父类合约。
- 修改 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
}
}
};
- 查看migrations/2_deploy_contracts.js 代码
这个文件设置了开始时间,结束时间,汇率为8,集资的钱包地址为地址1 。
- 在右边窗口打开ganache测试网络
ganache-cli
tmux
,进入 tmux
ctrl + B
,shift + 5
, 左右分屏
更多tmux的操作见这节。
左边窗口 编译
truffle compile
(需要把三个.sol文件的版本改为0.4.24)部署合约
truffle migrate
连到测试网络
truffle console
设置购买人
buyer = web3.eth.accounts[2]
,购买人设置地址2 。取得众筹实例:
AirCoinCrowdsale.deployed().then(inst => { crowdsale = inst })
取得 token的地址:
crowdsale.token().then(addr => { tokenAddress = addr } )
恢复一个实例:
airCoinInstance = AirCoin.at(tokenAddress)
ownship 换一下,转给众筹合约。
airCoinInstance.transferOwnership(crowdsale.address)
返回状态 status:'0x01' 成功检查空气币的总供给,应该是零,还没有人买。
airCoinInstance.totalSupply().then(supply => supply.toString(10))
购买者的空气币余额也是零,还没有买。
airCoinInstance.balanceOf(buyer).then(balance => balance.toString(10))
利用众筹合约,购买500wei,
crowdsale.sendTransaction({ from: buyer, value: 500})
;或者 5 个以太币,crowdsale.sendTransaction({ from: buyer, value: web3.toWei(5, "ether")})
(只是不易观察,数字太长)。重复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 上实现了出来,进行了部署,并演示了众筹的模拟。
不足之处,请批评指正。