以太坊开发(十五)使用Truffle+OpenZeppelin编写代币示例合约

Tutorialtoken Box项目地址:http://truffleframework.com/boxes/tutorialtoken

Tutorialtoken Box官方教程:http://truffleframework.com/tutorials/robust-smart-contracts-with-openzeppelin

原文:OpenZeppelin集成Truffle编写健壮安全的合约
作者: TRYBLOCKCHAIN

本文在原文基于Truffle Box中的Tutorialtoken Box代码,使用图形化的Ganache以及插件形式的以太坊轻客户端MetaMask,编写一个代币示例的基础上,修改和补充了部分内容。

介绍

因为智能合约往往涉及金钱,保证Soldity代码没有错误,以及足够的安全是非常根本的。Zeppelin Solutions,一个智能合约审查服务商,已经意识到相关的需求。建立在他们的合约审查经验之上,他们把一些最佳实践整理到了OpenZeppelin

我们可以使用和扩展这些合约,以在更少的时间内创建更安全的DAPP。OpenZeppelin为各种各样重要的功能提供了广泛的智能合约(在这里查看全部支持合约)。而今天,我们来看看其中的代币合约。具体来说,我们打算扩展其中提供了StandardToken.sol来创建一个我们自己的支持ERC-20标准的代币。

环境

这个教程需要你对Truffle、Ethereum和Solidity已经有一些了解。你可以先从宠物商店这个教程开始。

查看更多相关的信息

我们倾向于在教程中使用命令行。所以你需要了解一些如何在你所在环境使用命令行的一些知识。

概述

在这个教程里你将学到下述的知识:

  • 拆箱即用的前端
  • 使用OpenZeppelin的StandardToken来创建自己的TutorialToken
  • 编译和部署智能合约
  • 操作你编写的代币

1. 拆箱即用的前端

开发的主要精力应该放在智能合约上。为达到这个目的,Truffle以truffle box的方式提供了拆箱即用的前端。打开命令行,进入到某个工作空间。在这里我们选择工作空间oz-workspace

yuyangdeMacBook-Pro:~ yuyang$ mkdir oz-workspace
yuyangdeMacBook-Pro:~ yuyang$ cd oz-workspace

下载示例代码:

yuyangdeMacBook-Pro:oz-workspace yuyang$ truffle unbox tutorialtoken

如果遇到了以下问题:

yuyangdeMacBook-Pro:oz-workspace yuyang$ truffle unbox tutorialtoken
Downloading...
Unpacking...
Setting up...
Error: Command failed: npm install
npm ERR! Unexpected end of JSON input while parsing near '..."devDependencies":{"n'

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/yuyang/.npm/_logs/2018-03-12T08_40_07_199Z-debug.log

    at ChildProcess.exithandler (child_process.js:272:12)
    at ChildProcess.emit (events.js:160:13)
    at maybeClose (internal/child_process.js:943:16)
    at Socket.stream.socket.on (internal/child_process.js:363:11)
    at Socket.emit (events.js:160:13)
    at Pipe._handle.close [as _onclose] (net.js:562:12)

我进行了几种尝试:

1.升级npm和truffle(未解决)。

  • 查看所有可升级的包,npm -g outdated

  • 使用命令升级truffle,sudo npm i -g truffle升级。

  • 使用命令升级npm,sudo npm i -g npm升级。

  1. 使用npm cache clean --force清除缓存(已解决)。

清除缓存后truffle unbox tutorialtoken重新下载,不过一直卡在Setting up...,关闭后再次下载还是卡住,本来都准备重装truffle了,结果又等了1分钟后结果提示Unbox successful. Sweet!

成功安装后的目录如下:

下一步,我们要集成OpenZeppelin。最新版本的OpenZeppelin可以通过npm来安装使用。

yuyangdeMacBook-Pro:oz-workspace yuyang$ npm install zeppelin-solidity

集成成功后,在node_moduleszeppelin-solidity的依赖,如下图所示:

2. 创建TutorialToken智能合约

使用已经搭建好的前端环境,现在让我们来创建TutorialToken合约。在contracts目录下,创建名为TutorialToken.sol的智能合约,内容如下:

pragma solidity ^0.4.17;

import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol';

contract TutorialToken is StandardToken {

}

在上面的代码中,importStandardToken.sol,并声明TutorialToken继承自StandardToken。这样就继承了StandardToken合约中所有变量和函数。继承的合约可以被覆盖,只要在子类重定义对应的变量与函数就行了。

接下来,设置代币的参数,需要定义自己的namesymboldecimalsINITIAL_SUPPLY

string public name = 'TutorialToken';
string public symbol = 'TT';
uint public decimals = 2;
uint public INITIAL_SUPPLY = 12000;

namesymbol变量,定义了代币的一个独一无二的标识。decimals变量定义了代币可被细分的程度。在上面的例子里decimals我们的取值为2,效果类似于美元和美分。最后,INITIAL_SUPPLY变量定义了在合约部署时,代币将创建的数量。在这个例子中,我们选择的是12000。

最后在构造函数中我们简单设置totalSupply来等于INITIAL_SUPPLY,同时把所有的币赋值给部署者的帐户。

function TutorialToken() public {
  totalSupply_ = INITIAL_SUPPLY;
  balances[msg.sender] = INITIAL_SUPPLY;
}

这样,使用小于15行手写的Solidity代码,我们创建了一个自己的ERC-20的代币。下一步,我们将部署代币,并与代币进行交互。

3. 编译与部署

在/migrations目录下,用下述内容创建文件2_deploy_contracts.js:

var TutorialToken = artifacts.require("./TutorialToken.sol");

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

TutorialToken合约内的import语句会由编译器进行自动处理,它会自动导入StandardToken内的相关引用包。

启动后回到命令行,开始进行编译:

yuyangdeMacBook-Pro:oz-workspace yuyang$ truffle compile

编译结果:

Compiling ./contracts/Migrations.sol...
Compiling ./contracts/TutorialToken.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/StandardToken.sol...
Writing artifacts to ./build/contracts

在执行部署之前,需要确保有一个区块链运行, 可以使用
Ganache来开启一个私链来进行开发测试,默认会在7545端口上运行一个开发链。
Ganache 启动之后是这样:

进行部署:

yuyangdeMacBook-Pro:oz-workspace yuyang$ truffle migrate

部署结果:

Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x1f2eb7ea77bf39e2e172fbfc7d606fe6409984f49b1d60db6b5199a3278c7335
  Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...
  ... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying TutorialToken...
  ... 0xa153d21000d20b0a69fa219bfd50050aae8f962f3a3010a30ff53900a45e340a
  TutorialToken: 0x345ca3e014aaf5dca488057592ee47305d9b3e10
Saving successful migration to network...
  ... 0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0
Saving artifacts...

Ganache显示发生了四笔transations:

4. 与TutorialToken交互

对于这部分的教程,我们推荐使用MetaMask的Chrome插件。它能轻松的在不同的帐户间快速切换,对于测试我们新创建代币的转发非常方便。

安装及使用方法,可以在上篇文章中找到。

并且确保你的MetaMask的监听地址为:http://127.0.0.1:7545。

另外,TutorialToken已经为你安装了lite-server,所以可以在oz-workspace目录,运行下面的命令,打开一个简单的页面:

yuyangdeMacBook-Pro:oz-workspace yuyang$ npm run dev

注:需要将chrome设置为默认浏览器。

账户1调用的合约,所以账户1有12000TT。现在转2000TT给账户2。

账户2的地址可以通过Ganache查看。

点击Transfer后,MetaMask会弹出交易提示,注意这里ETH为0,因为交易的只是代币:

点击SUBMIT,弹窗会提示Transfer Successful!。可以在Ganache里查看多了一笔新的交易:

现在切换到账号2,查看是否收到了代币转账:

点击右上角切换账号,发现只有账号1,点击Create an account将Ganache中显示的账号2导入进来,MetaMask也自动切换为账号2:

刷新页面查看账号2的代币数量,可以看到是2000TT。


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

推荐阅读更多精彩内容