本文接入的的 rinkeby 测试网络
-
truffle
合约开发脚手架 -
openzeppelin-solidity
合约开源模板库 (zeppelin-solidity
已被弃用)
开发
- 创建一个 truffle 项目
$ npm install -g truffle
$ mkdir erc20-contract
$ cd erc20-contract
$ truffle init
- 安装 ERC20 模板库
$ npm install openzeppelin-solidity
- 创建合约文件
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);
}
}
- 创建合约部署文件
migrations/2_deploy_contracts.js
var DemoToken = artifacts.require("DemoToken");
module.exports = function(deployer) {
deployer.deploy(DemoToken);
};
部署
- 配置 rinkeby 网络
truffle-config.js
需要启动一个 geth 节点,然后在 truffle 配置文件中配置节点信息
networks: {
...
rinkeby: {
host: '192.168.1.150', // 你的geth节点地址
port: 8545,
from: '0x0d441752c5548f3cd6f28826f6f184c0fb6c188a', // 你的部署用账号
network_id: 4,
gas: 4612388 // 部署花费Gas限制
}
}
- 进入 geth console 解锁部署用账号
# 罗列账户
> eth.accounts
# 获取余额
> eth.getBalance(eth.accounts[0])
# 解锁账户
> personal.unlockAccount(eth.accounts[0])
- 编译及部署合约
# 编译
$ truffle compile
# 部署到rinkeby
$ truffle migrate --network rinkeby
- 完成部署成功后,会打印合约地址 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])
网友评论