以太坊開發(fā)(十五)使用Truffle+OpenZeppelin編寫代幣示例合約

Tutorialtoken Box項(xiàng)目地址: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,編寫一個(gè)代幣示例的基礎(chǔ)上折欠,修改和補(bǔ)充了部分內(nèi)容。

介紹

因?yàn)橹悄芎霞s往往涉及金錢冗美,保證Soldity代碼沒有錯(cuò)誤兽赁,以及足夠的安全是非常根本的袁余。Zeppelin Solutions擎勘,一個(gè)智能合約審查服務(wù)商,已經(jīng)意識到相關(guān)的需求颖榜。建立在他們的合約審查經(jīng)驗(yàn)之上棚饵,他們把一些最佳實(shí)踐整理到了OpenZeppelin

我們可以使用和擴(kuò)展這些合約掩完,以在更少的時(shí)間內(nèi)創(chuàng)建更安全的DAPP噪漾。OpenZeppelin為各種各樣重要的功能提供了廣泛的智能合約(在這里查看全部支持合約)。而今天且蓬,我們來看看其中的代幣合約欣硼。具體來說,我們打算擴(kuò)展其中提供了StandardToken.sol來創(chuàng)建一個(gè)我們自己的支持ERC-20標(biāo)準(zhǔn)的代幣恶阴。

環(huán)境

這個(gè)教程需要你對Truffle诈胜、Ethereum和Solidity已經(jīng)有一些了解。你可以先從寵物商店這個(gè)教程開始冯事。

查看更多相關(guān)的信息

我們傾向于在教程中使用命令行焦匈。所以你需要了解一些如何在你所在環(huán)境使用命令行的一些知識。

概述

在這個(gè)教程里你將學(xué)到下述的知識:

  • 拆箱即用的前端
  • 使用OpenZeppelin的StandardToken來創(chuàng)建自己的TutorialToken
  • 編譯和部署智能合約
  • 操作你編寫的代幣

1. 拆箱即用的前端

開發(fā)的主要精力應(yīng)該放在智能合約上昵仅。為達(dá)到這個(gè)目的缓熟,Truffle以truffle box的方式提供了拆箱即用的前端。打開命令行,進(jìn)入到某個(gè)工作空間荚虚。在這里我們選擇工作空間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)

我進(jìn)行了幾種嘗試:

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...漓帚,關(guān)閉后再次下載還是卡住母债,本來都準(zhǔn)備重裝truffle了,結(jié)果又等了1分鐘后結(jié)果提示Unbox successful. Sweet!尝抖。

成功安裝后的目錄如下:

下一步毡们,我們要集成OpenZeppelin。最新版本的OpenZeppelin可以通過npm來安裝使用昧辽。

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

集成成功后衙熔,在node_moduleszeppelin-solidity的依賴,如下圖所示:

2. 創(chuàng)建TutorialToken智能合約

使用已經(jīng)搭建好的前端環(huán)境搅荞,現(xiàn)在讓我們來創(chuàng)建TutorialToken合約红氯。在contracts目錄下,創(chuàng)建名為TutorialToken.sol的智能合約咕痛,內(nèi)容如下:

pragma solidity ^0.4.17;

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

contract TutorialToken is StandardToken {

}

在上面的代碼中痢甘,importStandardToken.sol,并聲明TutorialToken繼承自StandardToken暇检。這樣就繼承了StandardToken合約中所有變量和函數(shù)产阱。繼承的合約可以被覆蓋,只要在子類重定義對應(yīng)的變量與函數(shù)就行了块仆。

接下來构蹬,設(shè)置代幣的參數(shù),需要定義自己的name悔据,symbol庄敛,decimalsINITIAL_SUPPLY

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

namesymbol變量科汗,定義了代幣的一個(gè)獨(dú)一無二的標(biāo)識藻烤。decimals變量定義了代幣可被細(xì)分的程度。在上面的例子里decimals我們的取值為2,效果類似于美元和美分怖亭。最后涎显,INITIAL_SUPPLY變量定義了在合約部署時(shí),代幣將創(chuàng)建的數(shù)量兴猩。在這個(gè)例子中期吓,我們選擇的是12000。

最后在構(gòu)造函數(shù)中我們簡單設(shè)置totalSupply來等于INITIAL_SUPPLY倾芝,同時(shí)把所有的幣賦值給部署者的帳戶讨勤。

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

這樣,使用小于15行手寫的Solidity代碼晨另,我們創(chuàng)建了一個(gè)自己的ERC-20的代幣潭千。下一步,我們將部署代幣借尿,并與代幣進(jìn)行交互刨晴。

3. 編譯與部署

在/migrations目錄下,用下述內(nèi)容創(chuàng)建文件2_deploy_contracts.js:

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

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

TutorialToken合約內(nèi)的import語句會(huì)由編譯器進(jìn)行自動(dòng)處理垛玻,它會(huì)自動(dòng)導(dǎo)入StandardToken內(nèi)的相關(guān)引用包割捅。

啟動(dòng)后回到命令行,開始進(jìn)行編譯:

yuyangdeMacBook-Pro:oz-workspace yuyang$ truffle compile

編譯結(jié)果:

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

在執(zhí)行部署之前帚桩,需要確保有一個(gè)區(qū)塊鏈運(yùn)行, 可以使用
Ganache來開啟一個(gè)私鏈來進(jìn)行開發(fā)測試亿驾,默認(rèn)會(huì)在7545端口上運(yùn)行一個(gè)開發(fā)鏈。
Ganache 啟動(dòng)之后是這樣:

進(jìn)行部署:

yuyangdeMacBook-Pro:oz-workspace yuyang$ truffle migrate

部署結(jié)果:

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顯示發(fā)生了四筆transations:

4. 與TutorialToken交互

對于這部分的教程账嚎,我們推薦使用MetaMask的Chrome插件莫瞬。它能輕松的在不同的帳戶間快速切換,對于測試我們新創(chuàng)建代幣的轉(zhuǎn)發(fā)非常方便郭蕉。

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

并且確保你的MetaMask的監(jiān)聽地址為:http://127.0.0.1:7545召锈。

另外旁振,TutorialToken已經(jīng)為你安裝了lite-server,所以可以在oz-workspace目錄涨岁,運(yùn)行下面的命令拐袜,打開一個(gè)簡單的頁面:

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

注:需要將chrome設(shè)置為默認(rèn)瀏覽器。

賬戶1調(diào)用的合約梢薪,所以賬戶1有12000TT〉牌蹋現(xiàn)在轉(zhuǎn)2000TT給賬戶2。

賬戶2的地址可以通過Ganache查看秉撇。

點(diǎn)擊Transfer后甜攀,MetaMask會(huì)彈出交易提示秋泄,注意這里ETH為0,因?yàn)榻灰椎闹皇谴鷰牛?/p>

點(diǎn)擊SUBMIT规阀,彈窗會(huì)提示Transfer Successful!恒序。可以在Ganache里查看多了一筆新的交易:

現(xiàn)在切換到賬號2谁撼,查看是否收到了代幣轉(zhuǎn)賬:

點(diǎn)擊右上角切換賬號奸焙,發(fā)現(xiàn)只有賬號1,點(diǎn)擊Create an account將Ganache中顯示的賬號2導(dǎo)入進(jìn)來彤敛,MetaMask也自動(dòng)切換為賬號2:

刷新頁面查看賬號2的代幣數(shù)量,可以看到是2000TT了赌。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墨榄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勿她,更是在濱河造成了極大的恐慌袄秩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逢并,死亡現(xiàn)場離奇詭異之剧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砍聊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門背稼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玻蝌,你說我怎么就攤上這事蟹肘。” “怎么了俯树?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵帘腹,是天一觀的道長。 經(jīng)常有香客問我许饿,道長阳欲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任陋率,我火速辦了婚禮球化,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翘贮。我一直安慰自己赊窥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布狸页。 她就那樣靜靜地躺著锨能,像睡著了一般扯再。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上址遇,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天熄阻,我揣著相機(jī)與錄音,去河邊找鬼倔约。 笑死秃殉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浸剩。 我是一名探鬼主播钾军,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绢要!你這毒婦竟也來了吏恭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤重罪,失蹤者是張志新(化名)和其女友劉穎樱哼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剿配,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搅幅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呼胚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茄唐。...
    茶點(diǎn)故事閱讀 38,637評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝇更,靈堂內(nèi)的尸體忽然破棺而出琢融,到底是詐尸還是另有隱情,我是刑警寧澤簿寂,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布漾抬,位于F島的核電站,受9級特大地震影響常遂,放射性物質(zhì)發(fā)生泄漏纳令。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一克胳、第九天 我趴在偏房一處隱蔽的房頂上張望平绩。 院中可真熱鬧,春花似錦漠另、人聲如沸捏雌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽性湿。三九已至纬傲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肤频,已是汗流浹背叹括。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宵荒,地道東北人汁雷。 一個(gè)月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像报咳,于是被迫代替她去往敵國和親侠讯。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容