以太坊之OpenZeppelin集成Truffle编写完善安全的合约

Posted ╰つ栺尖篴夢ゞ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊之OpenZeppelin集成Truffle编写完善安全的合约相关的知识,希望对你有一定的参考价值。

一、前言

  • 由于智能合约往往涉及金钱,保证 Soldity 代码没有错误,以及足够的安全是非常根本的需求,Zeppelin Solutions 一个智能合约审查服务商,已经意识到相关的需求,建立在它们的合约审查经验之上,把一些最佳实践整理到 OpenZeppelin。
  • 我们可以使用和扩展这些合约,以在更少的时间内创建更安全的 DAPP。OpenZeppelin 为各种各样重要的功能提供了广泛的智能合约:支持的智能合约。本文来看看其中的代币合约,即打算扩展其中提供的 StandardToken.sol 来创建一个支持 ERC-20 标准的代币。
  • 本文需要对 Truffle、Ethereum 和 Solidity 已经有一些了解,具体可以参考:Truffle 学习文档以太坊Solidity 学习文档

二、拆箱即用的前端

  • 我们把精力应该放在智能合约上,Truffle 以 truffle box 的方式提供拆箱即用的前端。打开命令行,进入到某个工作空间,选择工作空间 oz-workspace:
$ cd oz-workspace
$ truffle unbox tutorialtoken
  • 需要注意的 Truffle 要升级到最新版,可以用命令 sudo npm i -g truffle 升级。本文的 Truffle 版本:
$ truffle version
Truffle v3.4.7 (core: 3.4.7)
Solidity v0.4.13 (solc-js)
  • 成功安装后的目录如下:

  • 要集成 OpenZeppelin,最新版本的 OpenZeppelin 可以通过 npm 来安装使用:
npm install zeppelin-solidity
  • 集成成功后,在 node_modules 有 zeppelin-solidity 的依赖,如下图所示:

三、创建 TutorialToken 智能合约

  • 使用已经搭建好的前端环境,现在来创建 TutorialToken 合约,在 contracts 目录下,创建名为 TutorialToken.sol 的智能合约,内容如下:
pragma solidity ^0.4.4;
import 'zeppelin-solidity/contracts/token/StandardToken.sol';

contract TutorialToken is StandardToken 


  • 在上面的代码中,import 导入了 StandardToken.sol,并声明 TutorialToken 继承自 StandardToken,这样就继承 StandardToken 合约中所有变量和函数。继承的合约可以被覆盖,只要在子类重定义对应的变量与函数就行。
  • 接下来,设置代币的参数,需要定义自己的 name、symbol、decimals 和 INITIAL_SUPPLY:
string public name = 'TutorialToken';
string public symbol = 'TT';
uint public decimals = 2;
uint public INITIAL_SUPPLY = 12000;
  • name 和 symbol 变量,定义代币的一个独一无二的标识,decimals 变量定义代币可被细分的程度。在上面的示例中 decimals 取值为2,效果类似于美元和美分。INITIAL_SUPPLY 变量定义在合约部署时,代币将创建的数量,本例中选择的是 12000,最后在构造函数中简单设置 totalSupply 来等于 INITIAL_SUPPLY,同时把所有的币赋值给部署者的帐户:
function TutorialToken() 
  totalSupply = INITIAL_SUPPLY;
  balances[msg.sender] = INITIAL_SUPPLY;

  • 这样,使用小于 15 行手写的 Solidity 代码,创建完成一个 ERC-20 的代币。

四、编译与部署

  • 在 /migrations 目录下,用下述内容创建文件 2_deploy_contracts.js:
var TutorialToken = artifacts.require("./TutorialToken.sol");

module.exports = function(deployer) 
  deployer.deploy(TutorialToken);
;
  • TutorialToken 合约内的 import 语句会由编译器进行自动处理,它会自动导入 StandardToken 内的相关引用包。现在可以编译与部署:
## 启动testrpc
$ testrpc
## 编译合约
$ truffle compile
## 部署合约
$ truffle migrate
  • migrate 时默认选择的网络是 development,当前的 Truffle 默认配置 truffle.js 应该如下(即默认部署到 testrpc):
module.exports = 
  networks: 
    development: 
      host: "localhost",
      port: 8545,
      network_id: "*" // Match any network id
    
  
;

五、与 TutorialToken 交互

  • 推荐使用 MetaMask 的 Chrome 插件,它能轻松的在不同的帐户间快速切换,对于测试新创建代币的转发非常方便。另外,安装 lite-server,可以在 oz-workspace 目录,执行如下命令:
npm run dev
  • 运行后弹出如下的界面:

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

六、使用 MetaMask 连不上 TestRpc 的问题解决

  • 使用 MetaMask,一直连不上 TestRpc,于是使用 http://localhost:8545 放到浏览器中,结果一直显示 400 bad request。其实 MetaMask 是通过配置的 IP 与端口,以 RPC 方式访问,直接 http 访问是不行,但 MetaMask 就是不能切换到 TestRPC,最后发现是电脑开了全局代理。
  • 首先部署,部署成功后,能看到 successful 字样:

  • 由于 Truffle 默认是使用 TestRpc 的第一个帐户来进行发布的,因此代币也是初始分配给了第一个帐号,要回到 TestRpc,找到第一个帐户并导入到 MetaMask:

  • 这是本地的 TestRpc 的启动输出结果,由于是可以通过私匙推出公匙,因此 MetaMask 导入时,使用私匙导入就可以,选择下面的 Import Account:

  • 输入第一个私匙,其实就是创建合约的那个帐户,切换到这个帐户后,就能看到自己代币的余额:

  • 成功后,就可以看到如下的界面:

以上是关于以太坊之OpenZeppelin集成Truffle编写完善安全的合约的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Truffle 控制台与 OpenZeppelin 代理合约进行交互?

Truffle Openzeppelin 实例(2022版)

以太坊Solidity之Truffle的使用流程与集成指南|猿创征文

3.以太坊之秘钥文件

以太坊Solidity之Truffle框架的应用实践

以太坊之ganache命令行参数的详解