美文网首页区块链研习社区块链技术研究程序猿阵线联盟-汇总各类技术干货
以太坊 (六)编写智能合约-基于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