更进一步地,用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打开项目文件夹,得到目录结构如下: 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-solidity2

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命令进行编译:

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函数库来简化该加密货币的开发。如此一来,我们就写好了一个可通过以太币钱包交易的新加密代币合约。这个合约一经部署,就可以一直存在于以太坊区块链上,世界上从此也就多了一种新的加密代币——嫩模币。只要你能找到人想拥有这种代币,这种代币就有交易的价值。