基於智慧合約建立標準代幣

1.建立專案

在之前的簡易代幣建立中,我們使用了truffle init指令來初始化專案,在Truffle推出Boxes功能之後,我們可以直接套用稱作react-box的樣板,此樣板已經整合create-react-app,可以直接用來開發react web,省下專案設定的時間。

[email protected]:~/SmartContractDemo/NenmoCoin$ truffle unbox react-box
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!
Commands:
Compile:              truffle compile
Migrate:              truffle migrate
Test contracts:       truffle test
Test dapp:            npm test
Run dev server:       npm run start
Build for production: npm run build
[email protected]:~/SmartContractDemo/NenmoCoin$ npm run start
> [email protected] start /home/sily/SmartContractDemo/NenmoCoin
> node scripts/start.js
Starting the development server...

啟動專案後用atom開啟專案資料夾,得到目錄結構如下:
1

/contracts:存放智慧合約原始程式碼的地方,可以看到裡面已經有了兩個sol檔案,我們開發的NenmoCoin.sol也會放在這裡。
/migrations:這是Truffle用來部署智慧合約的功能,我們會修改2_deploy_contracts.js程式碼來部署NenmoCoin.sol
/test:測試智慧合約的程式碼放在這個目錄下,支援jssol測試。
/public/src:存放react web的地方,後面用到會說明。
truffle.js:Truffle的設定檔案。

2.開發前的準備

1.開啟另一個終端,啟動testrpc,繼續通過testrpc模擬以太坊區塊鏈測試環境。
2.建立的代幣如果想要能夠通過以太坊錢包來進行轉賬和收帳,必須相容以太坊的ERC20標準,ERC20定義了支援錢包所必需的合約介面。
3.安裝OpenZeppelin來簡化加密錢包開發的過程。OpenZeppelin是一套能夠給我們方便提供編寫加密合約的函式庫,同時裡面也提供了相容ERC20的智慧合約。
命令如下:

npm install zeppelin-solidity

安裝好後,在專案目錄下的node_modules中的最後一個資料夾就是zeppelin-solidity,同時開啟package.json,我們可以看到依賴包中多了zeppelin-solidity
2

3.建立標準代幣——嫩模幣

contracts/目錄下新建一個NenmoCoin.sol檔案,也可以使用truffle create contract NenmoCoin命令來建立。
NenmoCoin.sol的程式碼如下:

pragma solidity ^0.4.4;
import "../node_modules/zeppelin-solidity/contracts/token/StandardToken.sol";
contract NenmoCoin is StandardToken {
string public name = "NenmoCoin";
string public symbol = "NMB";
uint8 public decimals = 8;
uint256 public INITIAL_SUPPLY = 21000000;
function NenmoCoin() {
totalSupply = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
}

import語句表示匯入我們需要適用到的StandardToken合約。

建立NenmoCoin合約時,讓NenmoCoin合約直接繼承自StandardTokenis表示繼承,所以NenmoCoin繼承了StandardToken的所有狀態資料和方法。此時,NenmoCoin合約支援了以下ERC20標準中規定的函式。

3

後面我們使用balanceOftransfer兩個函式來驗證,由於StandardToken合約中已經幫我們實現了這些函式,所以無需再從頭寫一次。

其他變數指定了代幣的一些特性,如代幣名稱(name)為NenmoCoin,符號(symbol)為NMB,最小分割單位為8(即最小交易額為0.00000001),代幣發行總額為2100W。

在合約的建構函式中,指定了totalSupply數目,並將所有的初始代幣INITIAL_SUPPLY都指定給msg.sender賬號,也就是用來部署這個合約的賬號。totalSupply定義於ERC20Basic.sol中,balances定義於BasicToken.sol中。

4.編譯、部署和驗證

migrations/目錄下建立一個3_deploy_contracts.js檔案,內容如下:

var NenmoCoin = artifacts.require("./NenmoCoin.sol");
module.exports = function(deployer) {
deployer.deploy(NenmoCoin);
};

然後通過truffle compile命令進行編譯:

[email protected]:~/SmartContractDemo/NenmoCoin$ truffle compile
Compiling ./contracts/NenmoCoin.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling ./node_modules/zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts

truffle migrate部署:

[email protected]:~/SmartContractDemo/NenmoCoin/migrations$ truffle migrate 
Using network 'development'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0x5fab008f0e3dfd8c5ee7711d47fcdfd8d4b37dc5847b359d98b18557818226a2
Migrations: 0xb0eadf909e51d23c22b303eb541f45e6b2aaf085
Saving successful migration to network...
... 0xfc2dbb91da5b18740f3e7b4c5ee2b3bb42e89c76f6381d76461bb54b4246279f
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying SimpleStorage...
... 0x4e2883a79ad4169e675e8b7b15241e2f217b960335f83a27a9185726b5ae135d
SimpleStorage: 0x5a4794ed9fa17eb0f6947442ae32ac1ffa450e79
Saving successful migration to network...
... 0xd3578c02c44ecb69ae08608dc475dee22632a65d92d7408e4b78d3fd51ef0d89
Saving artifacts...
Running migration: 3_deploy_contracts.js
Deploying NenmoCoin...
... 0x79e6571e0fcfde55439e97b98dc9820c3e663c47b07aef5caf55f97bd2791010
NenmoCoin: 0x31a0d88a91043b5b2867963c2dade9f892645a5a
Saving successful migration to network...
... 0xe5bf92dae8453ecc2486d9bdf32a1f0b891fa338916b0e7258181042559ebbcd
Saving artifacts...
[email protected]:~/SmartContractDemo/NenmoCoin/migrations$ 

驗證:

[email protected]:~/SmartContractDemo/NenmoCoin$ truffle console
truffle(development)> let contract
undefined
truffle(development)> NenmoCoin.deployed().then(instance => contract = instance)
……
truffle(development)> contract.balanceOf(web3.eth.coinbase)
BigNumber { s: 1, e: 7, c: [ 21000000 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(development)> contract.transfer(web3.eth.accounts[1],100)
truffle(development)> contract.balanceOf(web3.eth.coinbase)
BigNumber { s: 1, e: 7, c: [ 20999900 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 2, c: [ 100 ] }
truffle(development)> contract.name.call()
'NenmoCoin'
truffle(development)> contract.symbol.call()
'NMB'

web端驗證:

[email protected]:~/SmartContractDemo/NenmoCoin$ npm run start
> [email protected] start /home/sily/SmartContractDemo/NenmoCoin
> node scripts/start.js
Starting the development server...

由以上驗證可知,我們成功建立了嫩模幣,且設定了其初始發行數量為2100W,在以上建立過程中,主要用到了OpenZeppelin函式庫來簡化該加密貨幣的開發。如此一來,我們就寫好了一個可通過以太幣錢包交易的新加密代幣合約。這個合約一經部署,就可以一直存在於以太坊區塊鏈上,世界上從此也就多了一種新的加密代幣——嫩模幣。只要你能找到人想擁有這種代幣,這種代幣就有交易的價值。