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
升級吮龄。
- 使用
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_modules
有zeppelin-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 {
}
在上面的代碼中痢甘,import
了StandardToken.sol
,并聲明TutorialToken
繼承自StandardToken
暇检。這樣就繼承了StandardToken
合約中所有變量和函數(shù)产阱。繼承的合約可以被覆蓋,只要在子類重定義對應(yīng)的變量與函數(shù)就行了块仆。
接下來构蹬,設(shè)置代幣的參數(shù),需要定義自己的name
悔据,symbol
庄敛,decimals
和INITIAL_SUPPLY
。
string public name = 'TutorialToken';
string public symbol = 'TT';
uint public decimals = 2;
uint public INITIAL_SUPPLY = 12000;
name
和symbol
變量科汗,定義了代幣的一個(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了赌。