以太坊智能合约从入门到实战4(ERC20标准代币合约)

什么是标准代币合约

2017年,ICO异常火爆,催生了大量的以太坊代币。这些代币,基本上都是ERC20标准代币。ERC20是标准Token接口,规定了Token的基本功能(查询余额、转账交易等),方便第三方使用(如钱包和交易所),极大地降低了代币的发行和交易成本。

其实,除了ERC20,还有其它一些标准接口规范,如ERC223、ERC721等。如2017年很火爆的以太坊养猫,其实用的就是ERC721标准。以太坊养猫中的猫都是ERC721的Token,每只猫拥有不一样基因,归根到底也就是拥有不一样属性的Token。猫的编号其实也就是Token的编号, 猫的基因也就是Token的属性。

接下来我们要学习的,就是如何创建和部署自己的ERC20标准代币合约。

创建和部署建ERC20标准合约

1. 初始化合约工程

新建工程目录,如笔者创建的工程名为“SeaCoin”(海洋币,很俗的名字),然后用truffle初始化工程:

truffle init

2. 安装Zeppelin-Solidity

Zeppelin-Solidity是一个开源的第三方库,使用该库可以既快速又安全地开发ERC20标准代币合约。相反,如果完全靠我们自己编写合约代码,难免会有考虑不全的地方。而一旦代码出现漏洞,被攻击者利用,那整个代币将完全失去价值!

在工程的根目录,执行以下命令:

npm install zeppelin-solidity

安装完成后,我们用Sublime Text打开工程,会发现node_modules目录下已经导入有zepplin-solidity的代码库。

image

3. 通过继承Zepplin StandardToken编写合约

  • 在contracts目录下新建文件SeaCoin.sol,复制以下内容:
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;
  }
}
  • 在migrations文件夹下新建文件“2_deploy_contract.js”,并输入以下内容
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. 编译智能合约

truffle compile

5. 运行私链网络

  • 启动私链

geth --datadir "E:\Ether\private" --networkid 15 --port 61910 --rpc --rpcport 8545 --rpcapi "db,eth,net,web3" console

打开一个新的命令行窗口,启动私链网络后保持窗口不关闭,等待合约部署。

  • 解锁账户

personal.unlockAccount(eth.accounts[0],"123456")

6. 部署智能合约

打开另一个PowerShell窗口(注意这时打开了两个命令行窗口,私链所在的命令行不需管它)。

在命令行cd到工程的根目录,执行以下命令:

truffle migrate

执行命令后,会输出“Deploying Migrations...”,表示正在进行部署,需要通过挖矿打包部署。

miner.start()

回到私链所在的命令行窗口,执行挖矿,挖出一定的区块后,合约部署成功!

image

与ERC20代币合约交互

前面我们已经成功把SeaCoin部署到了私链网络下,下面我们通过执行一些操作进行验证。在上一个章节中,我们学习到有两种交互方法,现在我们采用truffle提供的控制台进行交互。

  • 打开控制台

truffle console

  • 实例赋值

SeaCoin.deployed().then(instance => contract = instance)

  • 查询余额

contract.balanceOf(eth.coinbase)

  • 交易

从第1个账户转十五万个SeaCoin到第二个账户。

contract.transfer(web3.eth.accounts[1], 150000)

需要说明的是,转账前,需要先解锁账户。转账之后,控制台会卡住,是因为在等待挖矿,因此你需要在私链网络运行挖矿以打包交易。

验证没问题,代表我们的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 ] }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容