美文网首页区块链研习社区块链技术研究程序猿阵线联盟-汇总各类技术干货
以太坊 (六)编写智能合约-基于OpenZeppelin建立安全

以太坊 (六)编写智能合约-基于OpenZeppelin建立安全

作者: duanyu | 来源:发表于2018-03-12 08:17 被阅读2706次

因为智能合约往往涉及金钱,保证Soldity代码没有错误,以及足够的安全是非常根本的。Zeppelin Solutions,一个智能合约审查服务商,已经意识到相关的需求。建立在他们的合约审查经验之上,他们把一些最佳实践整理到了OpenZeppelin

我们可以使用和扩展这些合约,以在更少的时间内创建更安全的DAPP。OpenZeppelin为各种各样重要的功能提供了广泛的智能合约(在这里查看全部支持合约)。而今天,我们来看看其中的代币合约。具体来说,我们打算扩展其中提供了StandardToken.sol来创建一个我们自己的支持ERC-20标准的代币。

函数 方法
totalSupply() 代币发行的总量
balanceOf(A) 查询A帐户下的代币数目
transfer(A,x) 发送x个代币到A帐户
transferFrom(A,x) 从A帐户提取x个代币
approve(A,x) 同意A帐户从我的帐户中提取代币
allowance(A,B) 查询B帐户可以从A帐户提取多少代币

学习目标:

  • 拆箱即用的前端
  • 使用OpenZeppelin的StandardToken来创建自己的TutorialToken
  • 编译和部署智能合约到ganache-cli
  • 与自己新创建的前端交互

拆箱即用的前端

开发的主要精力应该放在智能合约上。为达到这个目的,Truffle以truffle box的方式提供了拆箱即用的前端。打开命令行,创建TutorialToken项目。

wangsanjundeMacBook-Pro:SmartContractDemo wangsanjun$ mkdir TutorialToken
wangsanjundeMacBook-Pro:SmartContractDemo wangsanjun$ cd TutorialToken/
wangsanjundeMacBook-Pro:TutorialToken wangsanjun$ ls
wangsanjundeMacBook-Pro:TutorialToken wangsanjun$ truffle unbox tutorialtoken
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test
  Run dev server: npm run dev
wangsanjundeMacBook-Pro:TutorialToken wangsanjun$ 

备注: Truffle要升级到最新版,可以用命令sudo npm i -g truffle升级。

当前文章的Truffle版本:

wangsanjundeMacBook-Pro:TutorialToken wangsanjun$ truffle version
Truffle v4.1.0 (core: 4.1.0)
Solidity v0.4.19 (solc-js)

成功安装后的目录如下:


truffle_dir.png

下一步,我们要集成OpenZeppelin。最新版本的OpenZeppelin可以通过npm来安装使用。

npm install zeppelin-solidity

集成成功后,在node_moduleszeppelin-solidity的依赖,如下图所示:

zeppelin-solidity.png

2. 创建TutorialToken智能合约

使用已经搭建好的前端环境,现在让我们来创建TutorialToken合约。在contracts目录下,创建名为TutorialToken.sol的智能合约,内容如下:

pragma solidity ^0.4.2;
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract TutorialToken is StandardToken {

}

在上面的代码中,importStandardToken.sol,并声明TutorialToken继承自StandardToken。这样就继承了StandardToken合约中所有变量和函数。继承的合约可以被覆盖,只要在子类重定义对应的变量与函数就行了。

接下来,设置代币的参数,需要定义自己的namesymboldecimalsINITIAL_SUPPLY

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

namesymbol变量,定义了代币的一个独一无二的标识。decimals变量定义了代币可被细分的程度。在上面的例子里decimals我们的取值为2,效果类似于美元和美分。最后,INITIAL_SUPPLY变量定义了在合约部署时,代币将创建的数量。在这个例子中,我们选择的是12000。

最后在构造函数中我们简单设置totalSupply_来等于INITIAL_SUPPLY,同时把所有的币赋值给部署者的帐户。

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

这样,使用小于15行手写的Solidity代码,我们创建了一个自己的ERC-20的代币。下一步,我们将部署代币,并与代币进行交互。

3. 编译与部署

/migrations目录下,用下述内容创建文件2_deploy_contracts.js

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

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

TutorialToken合约内的import语句会由编译器进行自动处理,它会自动导入StandardToken内的相关引用包。

现在,我们可以编译与部署了:

## 启动ganache-cli
$ ganache-cli
## 编译合约
$ truffle compile
## 部署合约
$ truffle migrate

你当前的Truffle默认配置truffle.js应该如下(即默认部署到ganache-cli):

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*" // Match any network id
    }
  }
};

4. 与TutorialToken交互

网页中修改RPC端口号为8545,与ganache-cli一致

rpc_address.png

项目初始化时已经安装了lite-server,所以可以在TutorialToken目录,跑下面的命令,跑起来一个简单的页面:

npm run dev

运行后会弹出一个界面如下:


TutorialTokenWeb.png

这个简单的dapp显示了当前的余额。
可以尝试转移一些代币到其它的帐户,下面这里,转移了2000TT到第二个帐户。

truffle(development)> web3.eth.accounts[1]
'0x9a6f1f834298e08e50b745baf0a23ce51ce8cb28'
truffle(development)> 

transfer_token.png transfer_success.png
truffle(development)> let token;
undefined
truffle(development)> TutorialToken.deployed().then(instance => token = instance)
...............//太长,已忽略
 truffle(development)> token.balanceOf(web3.eth.coinbase)
{ [String: '10000'] s: 1, e: 4, c: [ 10000 ] }
truffle(development)> token.balanceOf(web3.eth.accounts[1])
{ [String: '2000'] s: 1, e: 3, c: [ 2000 ] }

Truffle + OpenZeeelin 超级开发体验

Truflle很激动的看到,类似Zeppelin Solutions这样解决方案对于合约标准化,以及提升安全性上的贡献。结合OpenZeppelin的合约和Truffle的工具集,可以非常容易的创建工业级的分布式应用。

中途可能遇到的问题

  • truffle unbox tutorialtoken初始化时,一直处于构建状态,是因为npm要安装 lite-server,有时候下载不下来,就会始终停留在这个状态。

 Downloading...
 Unpacking...
 Setting up...

解决办法:可以多等一会儿。还不行的话可以强行中断,然后利用npm install重新安装,如果还不行的话,可以连接VPN安装或者利用cnpm安装

  • npm run dev执行命令启动网页后,网页不显示余额
    TutorialToken_fail.png

利用chrome审查工具查看错误原因

chrome_fail_reason.png
原来是JQuery没有下载下来导致的原因。

解决办法:下载JQuery文件,放入src/js文件夹,修改index.html中引用方式

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
改为
<script src="js/jquery-1.12.1.min.js"></script>
jquery.png

另外需要注意的是sol文件名称必须为TutorialToken,否则网页余额数量同样显示不出来,因为网页中调用的名字就是TutorialToken,当然你自己也可以修改

相关文章

网友评论

    本文标题:以太坊 (六)编写智能合约-基于OpenZeppelin建立安全

    本文链接:https://www.haomeiwen.com/subject/lmigfftx.html