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

举报
Serendipity·y 发表于 2022/07/08 23:55:34 2022/07/08
【摘要】 一、前言 由于智能合约往往涉及金钱,保证 Soldity 代码没有错误,以及足够的安全是非常根本的需求,Zeppelin Solutions 一个智能合约审查服务商,已经意识到相关的需求,建立在它们的合...

一、前言

  • 由于智能合约往往涉及金钱,保证 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

  
 
  • 1
  • 2
  • 需要注意的 Truffle 要升级到最新版,可以用命令 sudo npm i -g truffle 升级。本文的 Truffle 版本:
$ truffle version
Truffle v3.4.7 (core: 3.4.7)
Solidity v0.4.13 (solc-js)

  
 
  • 1
  • 2
  • 3
  • 成功安装后的目录如下:

在这里插入图片描述

  • 要集成 OpenZeppelin,最新版本的 OpenZeppelin 可以通过 npm 来安装使用:
npm install zeppelin-solidity

  
 
  • 1
  • 集成成功后,在 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 {

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 在上面的代码中,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;

  
 
  • 1
  • 2
  • 3
  • 4
  • name 和 symbol 变量,定义代币的一个独一无二的标识,decimals 变量定义代币可被细分的程度。在上面的示例中 decimals 取值为2,效果类似于美元和美分。INITIAL_SUPPLY 变量定义在合约部署时,代币将创建的数量,本例中选择的是 12000,最后在构造函数中简单设置 totalSupply 来等于 INITIAL_SUPPLY,同时把所有的币赋值给部署者的帐户:
function TutorialToken() {
  totalSupply = INITIAL_SUPPLY;
  balances[msg.sender] = INITIAL_SUPPLY;
}

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

四、编译与部署

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • TutorialToken 合约内的 import 语句会由编译器进行自动处理,它会自动导入 StandardToken 内的相关引用包。现在可以编译与部署:
## 启动testrpc
$ testrpc
## 编译合约
$ truffle compile
## 部署合约
$ truffle migrate

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • migrate 时默认选择的网络是 development,当前的 Truffle 默认配置 truffle.js 应该如下(即默认部署到 testrpc):
module.exports = {
  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*" // Match any network id
    }
  }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

五、与 TutorialToken 交互

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

  
 
  • 1
  • 运行后弹出如下的界面:

在这里插入图片描述

  • 这个简单的 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:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

文章来源: blog.csdn.net,作者:╰つ栺尖篴夢ゞ,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/125670337

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。