主页 > 最新版imtoken官网 > 以太坊智能合约从入门到实战4(ERC20标准代币合约)
以太坊智能合约从入门到实战4(ERC20标准代币合约)
什么是标准代币合约
2017年ICO异常火爆,催生了大量以太坊代币。 这些代币基本上都是ERC20标准的代币。 ERC20是一个标准的Token接口以太坊链可以转erc20吗,规定了Token的基本功能(查询余额、转账交易等),方便第三方使用(如钱包、交易所),大大降低了Token的发行和交易成本令牌。
其实除了ERC20,还有其他标准的接口规范,比如ERC223、ERC721等等。 比如2017年以太坊非常火的养猫,其实就是基于ERC721标准的。 以太坊猫里面的猫都是ERC721 Token。 每只猫都有不同的基因。 归根结底,它是一个具有不同属性的Token。 猫的编号其实就是Token的编号,猫的基因就是Token的属性。
接下来我们需要学习的是如何创建和部署我们自己的 ERC20 标准代币合约。
创建并部署ERC20标准合约 1. 初始化合约项目
创建一个新的项目目录。 比如笔者创建的项目名为“SeaCoin”(Ocean Coin,一个很常见的名字),然后使用truffle初始化项目:
松露初始化
2. 安装Zeppelin-Solidity
Zeppelin-Solidity是一个开源的第三方库,可用于快速安全地开发ERC20标准代币合约。 相反,如果我们完全自己编写合约代码,难免会有考虑不周的情况。 一旦代码出现漏洞,被攻击者利用,整个token将彻底失去价值!
在项目的根目录下,执行以下命令:
npm 安装 zeppelin-solidity
安装完成后,我们用Sublime Text打开工程,会发现zepplin-solidity的代码库已经导入到了node_modules目录下。
图片
3.通过继承Zepplin StandardToken编写合约
pragma solidity ^0.4.4;
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
contract SeaCoin is StandardToken {
string public name = "SeaCoin";
string public symbol = "SEC"; //token的代号
uint8 public decimals = 4; //小数位
uint256 public INITIAL_SUPPLY = 2000000; //初始化代币总量,如这里200万
function BloggerCoin() {
totalSupply_ = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
}
var SeaCoin = artifacts.require("SeaCoin")
module.exports = function(deployer){
deployer.deploy(SeaCoin);
};
打开位于根目录中的 truffle.js 文件并将其更改为以下内容。
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // 匹配任何network id
}
}
};
4. 编译智能合约
松露编译
5.运行私有链网络
geth --datadir "E:\Ether\private" --networkid 15 --port 61910 --rpc --rpcport 8545 --rpcapi "db,eth,net,web3" 控制台
打开一个新的命令行窗口,启动私有链网络后保持窗口打开,等待部署合约。
personal.unlockAccount(eth.accounts[0],"123456")
6.部署智能合约
再打开一个PowerShell窗口(注意此时打开了两个命令行窗口,私有链接所在的命令行不用忽略)。
在命令行中,cd到项目的根目录下,执行以下命令:
松露迁移
命令执行后会输出“Deploying Migrations...”,表示部署正在进行,需要通过挖矿打包部署。
miner.start()
回到私有链所在的命令行窗口,执行挖矿,挖出某个区块后,合约部署成功!
图片
与 ERC20 代币合约交互
之前我们已经成功将SeaCoin部署到私有链网络中,接下来我们将通过一些操作来验证一下。 在上一章我们了解到有两种交互方式,现在我们使用truffle提供的控制台进行交互。
松露控制台
海币。 部署()。然后(实例=>合同=实例)
contract.balanceOf(eth.coinbase)
从第一个账户向第二个账户转账 150,000 SeaCoins。
合同。 转移(web3.eth.accounts[1], 150000)
需要注意的是,在转账之前,需要先解锁账户。 转账后,控制台会因为等待挖矿而卡住,所以需要在私链网络挖矿打包交易。
验证成功以太坊链可以转erc20吗,说明我们的SeaCoin已经在以太坊网络中转账成功。 虽然还是私有链,但是下一章,我们会学习如何部署到以太坊主网上!
以下是笔者的操作记录:
truffle(development)> contract.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 6, c: [ 2000000 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(development)> contract.transfer(web3.eth.accounts[1], 150000)
{ tx: '0xd88ef1c6cbba03ce67e81d7eb5c9a62c2dd17b86603517f98a52ed0466b1d9ae',
receipt:
{ blockHash: '0x66b1e3cc7154548695de3ba7fa705514fa5bb8dabf0a60dc8a50c46c287f1b73',
blockNumber: 205,
contractAddress: null,
cumulativeGasUsed: 51697,
from: '0x61b7c76de24861f00efddd4b5873c4d188dd88a9',
gasUsed: 51697,
logs: [ [Object] ],
logsBloom: '0x00000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000008000000000000002000040000000000000000000000000000000000000000000000000
000000000000040000000000010000000000000000000000000000000000000000000008000000000000000000000000000001000000000000000000
000000000100000000000000000000000000000000000000002000000000000000000000000000000000000000000001000000000000000000000000
000000000000000000000000000000000000004000000000000',
root: '0x8c0ab5305f4ec98656d5dd2cd5af384f7b852133a2649ca27efdbdfd9535a2f2',
to: '0x08e6b912a61da948d064f20e166089c2c7459c4d',
transactionHash: '0xd88ef1c6cbba03ce67e81d7eb5c9a62c2dd17b86603517f98a52ed0466b1d9ae',
transactionIndex: 0 },
logs:
[ { address: '0x08e6b912a61da948d064f20e166089c2c7459c4d',
blockNumber: 205,
transactionHash: '0xd88ef1c6cbba03ce67e81d7eb5c9a62c2dd17b86603517f98a52ed0466b1d9ae',
transactionIndex: 0,
blockHash: '0x66b1e3cc7154548695de3ba7fa705514fa5bb8dabf0a60dc8a50c46c287f1b73',
logIndex: 0,
removed: false,
event: 'Transfer',
args: [Object] } ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 6, c: [ 1850000 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 5, c: [ 150000 ] }