以太坊之OpenZeppelin集成Truffle编写完善安全的合约
【摘要】
一、前言
由于智能合约往往涉及金钱,保证 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)