美文网首页
用 Truffle 开发部署 ERC20 Token 合约

用 Truffle 开发部署 ERC20 Token 合约

作者: UULU | 来源:发表于2019-02-18 18:52 被阅读0次

本文接入的的 rinkeby 测试网络

  • truffle 合约开发脚手架
  • openzeppelin-solidity 合约开源模板库 (zeppelin-solidity 已被弃用)

开发

  1. 创建一个 truffle 项目
$ npm install -g truffle
$ mkdir erc20-contract
$ cd erc20-contract
$ truffle init
  1. 安装 ERC20 模板库
$ npm install openzeppelin-solidity
  1. 创建合约文件 contracts/DemoToken.sol
    继承合约模板类后,只需要配置简单的 名称、符号、精度、总发行量 就可以了
pragma solidity >=0.4.21 <0.6.0;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";

contract DemoToken is ERC20, ERC20Detailed {
  uint256 public constant INITIAL_SUPPLY = 1000000000000000000;

  constructor () public ERC20Detailed("Demo Coin", "demo", 8) {
    _mint(msg.sender, INITIAL_SUPPLY);
  }
}
  1. 创建合约部署文件 migrations/2_deploy_contracts.js
var DemoToken = artifacts.require("DemoToken");

module.exports = function(deployer) {
  deployer.deploy(DemoToken);
};

部署

  1. 配置 rinkeby 网络truffle-config.js
    需要启动一个 geth 节点,然后在 truffle 配置文件中配置节点信息
  networks: {
    ...
    rinkeby: {
      host: '192.168.1.150',  // 你的geth节点地址
      port: 8545,
      from: '0x0d441752c5548f3cd6f28826f6f184c0fb6c188a', // 你的部署用账号
      network_id: 4,
      gas: 4612388  // 部署花费Gas限制
    }
  }
  1. 进入 geth console 解锁部署用账号
# 罗列账户
> eth.accounts

# 获取余额
> eth.getBalance(eth.accounts[0])

# 解锁账户
> personal.unlockAccount(eth.accounts[0])
  1. 编译及部署合约
# 编译
$ truffle compile

# 部署到rinkeby
$ truffle migrate --network rinkeby
  1. 完成部署成功后,会打印合约地址 contract address
Starting migrations...
======================
> Network name:    'rinkeby'
> Network id:      4
> Block gas limit: 7215739


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0x3b079749f9365dbebbeea4d4848389be97b05b8b0fe6aa0e073d60915bb03b06
   > Blocks: 1            Seconds: 12
   > contract address:    0xf4D06acbb12398c527019704fE1E9a1492cB06D6
   > account:             0x0d441752C5548f3cd6F28826f6F184c0Fb6c188a
   > balance:             5.9468436
   > gas used:            284908
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00569816 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00569816 ETH


2_deploy_contracts.js
=====================

   Deploying 'DemoToken'
   ---------------------
   > transaction hash:    0x45fa003989d057fdf783e87ceb9328f37d36e3c9e86633f196e92a4e4abbf09d
   > Blocks: 0            Seconds: 12
   > contract address:    0x2eAE1802CC431e90CF83cd12e5559eb769Cf4C2F
   > account:             0x0d441752C5548f3cd6F28826f6F184c0Fb6c188a
   > balance:             5.91748808
   > gas used:            1425742
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.02851484 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.02851484 ETH


Summary
=======
> Total deployments:   2
> Final cost:          0.034213 ETH

测试

用 geth console 测试合约函数

> var abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

> var contract = web3.eth.contract(abi).at("0x2eAE1802CC431e90CF83cd12e5559eb769Cf4C2F");
> contract.name()
> contract.symbol()
> contract.decimals()
> contract.balanceOf(eth.accounts[0])

> eth.defaultAccount = eth.accounts[0]
> contract.transfer(web3.eth.accounts[1], 600000)
> contract.balanceOf(web3.eth.accounts[1])

相关文章

网友评论

      本文标题:用 Truffle 开发部署 ERC20 Token 合约

      本文链接:https://www.haomeiwen.com/subject/kwszeqtx.html