Truffle 官网教程:利用OpenZeppelin构建健壮的智能合约

众所周知,部署在以太坊的智能合约是能够处理真实世界现金的,那么这就要求我们的合约代码免于错误,同时还要高度安全。(毕竟牵扯到钱的事情都不是小事)。

Zeppelin Solutions,一种智能合约审计服务,认识到了这里面的需要(不就是商机吗,不过貌似是开源的)。利用他们的经验,整合提出了一套经过审查的智能合同,名为“OpenZeppelin”。

我们可以使用和扩展这些合约,以在更短的时间内创建更安全的dapps(分布式应用)。OpenZeppelin提供了各种各样的智能合同,用于各种重要的功能(请参阅这里的所有功能),但是今天我们将重点关注他们的通证(一般称为代币)合约。具体来说,我们将扩展他们的StandardToken.sol合约,来创建我们自己的兼容ERC20标准的合约。

要求:

本教程希望你有一些关于truffle、以太坊和Solidity的知识。如果你还没有浏览过我们的以太坊概述和我们的宠物商店教程,那将是很好的开始(直接来这个吧)。

有关更多信息,请参见以下链接:

我们在本教程中将主要使用命令行,因此请确保您对操作系统的终端基本熟悉。(自己用的Ubuntu 16.04)

概述:

在本教程中,我们将涉及:

  • Unboxing前端应用程序
  • 创建“tutorialtoken“智能合约
  • 编译和部署智能合约
  • 与新的通证(代币)进行交互
写在前面(大家可以了解一下Atom,在创建与编译的时候,我其实是走了弯路的)
第一步:Unboxing 前端应用程序

在本教程中,我们关注的是智能合约的创建。为了达到这个目的,我们已经为你创建了一个truffle的前端。

  • 打开终端,创建文件夹并进入这个文件夹(一般放在桌面上就可以了)
        mkdir oz-workspace
        cd oz-workspace

  • Unbox tutorialtoken 这将为我们提供项目模板。
   truffle unbox tutorialtoken

   图片中命令行终端上面显示了此时oz-workspace文件夹里面的内容。

  • 下一步,我们将安装openzeppelin
   npm install zeppelin-solidity

第二步:创建“tutorialtoken“智能合约
  • 创建智能合约之前,我们需要了解了解一下文件结构,如下图:
  • 打开contracts文件,创建文件TutorialToken.sol这个文件,然后输入内容:
    pragma solidity ^0.4.17;
    
    import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol';
    
    contract TutorialToken is StandardToken {
    
    }
     
    
     注意事项:
     1.在合同创建之前,我们导入了 StandardToken.sol 智能合约,并且声明了TutorialToken

     2.很显然,我们使用的来自StandardToken.sol合约的内容,并且将从StandardToken合约继承所有的变量和函          数。

     3.通过在新合同中声明他们,继承的函数和变量可以被重写。

  • 我们可以设置自己的参数,声明我们自己的名字、符号和其他细节。将以下内容块添加到契约(在我们刚才新建的合约里面添加):
   string public name = 'TutorialToken';
   string public symbol = 'TT';
   uint8 public decimals = 2;
   uint public INITIAL_SUPPLY = 12000;

      

     注意事项:

      1.name 与 symbol 变量将会给我们一个独特的身份(说白了就是定义你代币的名字和简称)

      2.decimals变量显示你的代币小数点后几位,2则为小数点后两位。

      3.INITIAL_SUPPLY确定合约创建时代币的数量,当然12000这个数字是可以改变的,想多大都可以。

  • 为了完成合约,我们将创建一个构造函数,设置totalSupply(总代币数量)等于我们之前声明的INITIAL_SUPPLY变量。将整个供应交给部署帐户的地址。接着将一下代码块添加到之前的合约中。
  function TutorialToken() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }

     

     然后Esc ,wq,保存文件就可以啦!

  • 用了少于15行手工代码(哈哈,都是拷贝的),我们就建立了属于自己的以太坊合约。
第三步:编译和部署智能合约

  •   在migrations/文件夹里面,创建2_deploy_contracts.js文件,并输入以下内容。
   var TutorialToken = artifacts.require("TutorialToken");

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

  

  

    

(也不知道你们看了这些图片后头晕不,哈哈!)

      我们的TutorialToken合约中的import语句将由编译器自动处理,以及StandardToken的任何后续导入。

  • 现在,我们已经准备好将你的合约编译并部署到区块链中。在本教程中,我们将使用 Ganache,一个用于以太开发的个人区块链(就是我们可以免除搭建私链的痛苦啦),你可以使用他来部署合同、开发应用程序和运行测试。当然,如果你还没有这个软件,下载并双击图标来启动这个应用程序,这将在7545端口上生成一个运行在本地的区块链。
     

    不过文件后缀比较奇葩,Linux系统需要下载后缀为.AppImage那个文件,还有注意的是这个文件的打开方式      也有点奇怪,大家自己去网上搜吧。

    打开后是这个样子:

   

注:在Truffle documentation中了解更多关于 Ganache 的内容。

  • 随着我们的区块链(Ganache)启动,回到你的终端。在您的项目中(你创建的文件夹下面),运行以下命令来编译合同:
    truffle compile

   

      此时会产生一个build文件夹,里面就是编译好的文件。

    


  •    确定编译好后,继续敲代码。
    truffle migrate

      你将看到下面类似的输出:

    

      不过我也希望你们能够看到,之前几次的错误(没有打开Ganache),如果成功后,我们将会在Ganache客 户端看到下面的情况。

 

很显然我们部署过程中花费了ETH,如果没有出现这种情况的话,大家可能需要好好想想哪里出了问题。

第四步:与新的通证(代币)进行交互
在这部分教程中,我们推荐使用 MetaMask(不用点了,需要翻墙),这是一个存在于谷歌浏览器与火狐浏览器里面的扩展程序(不过需要翻墙)。它将允许您快速地在帐户之间切换,以测试传输新创建的通证( token)的能力。我们的   Pet Shop 教程拥有更多关于 MetaMask的信息 .

接下来,我们怎样才能建立起 GanacheMetaMask的联系呢,大家首先需要在浏览器下载metamask,就是这个样子。

     

这个时候,我们不要着急设置账号密码与确认密码,看到第二张图片的的import with seed phrase了吗,我们在第二张图片点击它,而不是输入上面的new password 与 confirm password。接下来,我们会到这样一个页面。

 重要的时刻来临了,显然这个软件的设计者希望我们能够输入一些内容到这个框框里面。还记得我们的Ganache吗,他不是还开着呢吗,我们需要将Ganache页面的一串英文数字复制到这个框框里面,如下(打上马赛克的部分):

 


复制成功后,接下来他会让你输入密码和确认密码,然后你就进入了下面这个页面。

  你们的页面应该显示的是account 1,然后我们需要连接本地的端口:因为我们账号上面应该是99.82ETH,

  点击上面狐狸头右方有一个向下的三角,点击后我们将会看到上面这张图片,然后点击Custom RPC,到了下面这张图片

  在输入栏输入HTTP://127.0.0.1:7545,save即可。

然后点击返回按钮,就可以看到我们的账号上面显示99.82ETH了,如果没有的话,要确认你是在本地7545端口网络里面。

  • 这个时候返回我们的终端,输入npm run dev ,然后他会自动打开你的浏览器,如下:
   

但是这个时候,你的上面是不会显示balance值的,因为我们的自己的配置文件是有问题(哈哈)

首先是你需要改变app.js 16行的端口:如下(建议用atom打开oz-workspace文件)

  

改为7545端口,我已经改了,你们的应该为9545好像。

此外还应该注意你们js文件夹下面(还是上面这张图片),有没有jquery文件,没有的话需要下载,1.9.1就可以了,不需要太高,因为我试过(哈哈,3.3.1好像不可以)。然后接下来如下图:


修改index文件下,有一行ajax.googleapis.com/ajax.....的代码,我们需要改为上图那样,变为引入1.9.1.min.js文件。保存即可。

接下来,我们打开浏览器刷新就可以看到我们的12000TT了(我的已经转过一次账了)。

  • 那么我们怎么转账呢,首先我们需要打开你的metamask,点击创建第二个账户,

  然后大概步骤就是复制你的第二个账户的地址,

如下:

  点击copy address to ...即可,然后切换到我们的第一个账户


记得刷新,将第二账户的地址复制,输入转账金额:

如下:


点击transfer按钮,就会出现下面的情况:


点击SUBMIT,一会就会出现这样的情况:



这个时候你去第二个账户,刷新页面就可以看到你的账户有2000TT了。

如果这个时候你再去ganache去看一下,你会发现多了一个block,更多的信息就不说了。

到此为止,我们实现了一个Truffle 官网的一个教程了。

(哎,最后都不想翻译了!)



猜你喜欢

转载自blog.csdn.net/zhaiguowei/article/details/79878504