基于智能合约建立标准代币
更进一步地,用React框架和OpenZeppelin函数库来建立兼容以太坊ERC20标准的加密货币。
1.创建项目
在之前的简易代币创建中,我们使用了truffle init
指令来初始化项目,在Truffle
推出Boxes
功能之后,我们可以直接套用称作react-box
的样板,此样板已经整合create-react-app
,可以直接用来开发react web
,省下项目设置的时间。
sily@lyg-sily:~/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
sily@lyg-sily:~/SmartContractDemo/NenmoCoin$ npm run start
> react-box@0.1.0 start /home/sily/SmartContractDemo/NenmoCoin
> node scripts/start.js
Starting the development server...
启动项目后用atom打开项目文件夹,得到目录结构如下:
/contracts
:存放智能合约原始代码的地方,可以看到里面已经有了两个sol
文件,我们开发的NenmoCoin.sol
也会放在这里。
/migrations
:这是Truffle
用来部署智能合约的功能,我们会修改2_deploy_contracts.js
代码来部署NenmoCoin.sol
。
/test:测试智能合约的代码放在这个目录下,支持js
与sol
测试。
/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
。
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
合约直接继承自StandardToken
。is
表示继承,所以NenmoCoin
继承了StandardToken
的所有状态数据和方法。此时,NenmoCoin
合约支持了以下ERC20
标准中规定的函数。
后面我们使用balanceOf
和transfer
两个函数来验证,由于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
命令进行编译:
sily@lyg-sily:~/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
部署:
sily@lyg-sily:~/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...
sily@lyg-sily:~/SmartContractDemo/NenmoCoin/migrations$
验证:
sily@lyg-sily:~/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端验证:
sily@lyg-sily:~/SmartContractDemo/NenmoCoin$ npm run start
> react-box@0.1.0 start /home/sily/SmartContractDemo/NenmoCoin
> node scripts/start.js
Starting the development server...
由以上验证可知,我们成功建立了嫩模币,且设置了其初始发行数量为2100W,在以上建立过程中,主要用到了OpenZeppelin
函数库来简化该加密货币的开发。如此一来,我们就写好了一个可通过以太币钱包交易的新加密代币合约。这个合约一经部署,就可以一直存在于以太坊区块链上,世界上从此也就多了一种新的加密代币——嫩模币。只要你能找到人想拥有这种代币,这种代币就有交易的价值。