因为智能合约往往涉及金钱,保证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_modules
有zeppelin-solidity
的依赖,如下图所示:
2. 创建TutorialToken智能合约
使用已经搭建好的前端环境,现在让我们来创建TutorialToken
合约。在contracts
目录下,创建名为TutorialToken.sol
的智能合约,内容如下:
pragma solidity ^0.4.2;
import "zeppelin-solidity/contracts/token/ERC20/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的代币。下一步,我们将部署代币,并与代币进行交互。
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
一致
项目初始化时已经安装了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
审查工具查看错误原因
原来是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
,当然你自己也可以修改
网友评论