配置开发环境
安装 Nodejs
Mac 上安装 nodejs:
1 | brew install node |
安装 Truffle
1 | npm install -g truffle # http://truffleframework.com/ |
truffle 是一个用于在 Etherem 上开发 Dapp 的框架。它让我们能够用 solidity 编程语言去写 Dapp 并进行调试。
安装 Ganache
Ganache 是一个本地的 in memory blockchain,让我们用于测试自己编写的 Dapp
安装 Metamask google 插件
为了能够使用 ethereum blockchain,我们需要安装 Google Chrome 的 METAMASK 扩展插件。使用 METAMASK 就可以让我们连接到本地的 etherum blockchain (Ganache 创建的),并和我们的 smart contract 做交互。
MetaMask 能够是我们的 Chrome 浏览器变成一个 blockchain 的浏览器,一个连接到 Ethereum network 的浏览器。
快速部署 truffle 项目
truffle 给我们提供了模板(这里称作为 box),用于我们进行快速开发。所以只要使用 unbox
命令来解压模板,就可以了。
1 | mac@macs-macbook ~/Code/blockchain/election truffle unbox pet-shop |
编写代码
示例1
分别在 contracts 和 migrations 文件夹创建如下代码:
1 | pragma solidity ^0.4.11; |
1 | var Election = artifacts.require("./Election.sol"); |
获取 smart contract 的 instance(实例)
Election 是我们定义的 contract 名。
首先使用如下命令,将我们定义的 smart contract 发布到 blockchain 中。
1 | truffle migrate |
需要注意的是,每次 deploy 一个 smart contract 都会消耗 ETH,这里消耗了 0,05 的 ETH
然后使用下面的命令,获取 smart contract 的一个 instance(实例):
1 | mac@macs-macbook ~/Code/blockchain/election truffle console |
示例2
下面使用一个新的 smart contract 实现投票的 Dapp。
1 | pragma solidity ^0.4.2; |
而后在 terminal 里面重新 deploy 一下该 contract。因为 contract 的代码被修改了,所以需要 reset。
1 | truffle migrate --reset |
之后重新进入 console 查询状态:
1 | mac@macs-macbook ~/Code/blockchain/election truffle console |
获取指定 candidate 的值
在 smart contract 中,value 的获取是 async 的,所以不可以将赋值写为:candidate = app.candidates(1)
。必须在回调函数里面赋值:
1 | truffle(development)> app.candidates(1).then( function(c) { candidate = c;}) |
查看 blockchain 中的 account
在 Ganache 中,我们创建了 10 个 accounts
同时这些账户可以在 truffl 的 console 里面使用 web3 查找到。
1 | truffle(development)> web3.eth.accounts |
1 | # solidity 允许给 function 传递除了参数以外的一些 metadata,这里传递了一个 {from: <account address>}。 |
编写测试用例
truffle 内部使用 mochajs 和 chaijs 进行测试
Mocha is a feature-rich JavaScript test framework running on Node.js and in the browser, making asynchronous testing simple and fun
Chai is a BDD / TDD assertion library for node and the browser that can be delightfully paired with any javascript testing framework.
1 | var Election = artifacts.require("./Election.sol"); |
1 | mac@macs-macbook ~/Code/blockchain/election truffle test |
网页代码
1 |
|
1 | App = { |
运行实例
1 | truffle migrate --reset |
运行之后会弹出网页,但是一直显示 loading
,看不到任何从 smart contract 返回的数据。
这是因为我们的客户端程序虽然在运行,但是还没有链接到我们创建的 blockchain instance 上。我们需要打开 Ganache,找到本地 in memory blockchain 的 RPC server url address:
然后在 Google Chrome(或者 Firefox) 浏览器中 MetaMask 插件里自定义 RPC 链接:
之后就可以看到如下界面:
点击 vote 以后,可以看到如下结果: