投票DApp
1 | 创建项目目录 |
项目目录如下:
1 | Mode LastWriteTime Length Name |
Solidity合约
Voting.sol
Voting合约包含以下内容:
- 用于初始化候选者的构造函数
- 用于投票的方法
- 返回候选者获得票数的方法
代码如下,然后将代码保存在voting目录下:
1 | pragma solidity >=0.4.22; |
终端输入命令查看安装版本:
1 | npm list web3 |
编译合约
我们现在我们启动node控制台:
1 | node |
进行web3和solc编译:
1 | 输入命令 |
连接我们的gananche,
1 | 定义在node环境里的web3对象,这里的localhost的端口是ganache的地址,默认是8545,我是7545 |
保存并查看我们的合约文件
1 | var sourceCode = fs.readFileSync('Voting.sol').toString() |
现在我们可以对合约进行编译了
1 | 我们现在有了源代码,就可以进行编译了 |
部署合约
编译完成后进行合约的部署,我们需要ABI和字节码
1 | ABI |
创建合约对象
1 | var VotingContract = web3.eth.contract(abi) |
构建一个交易
1 | var deployTxObj = {data:byteCode,from:web3.eth.accounts[0],gas:3000000} |
创建一个部署合约的交易
1 | var contractInstance = VotingContract.new(['Alice', 'Bob', 'Cary'],deployTxObj) |
这时候我们看一眼ganache,发现这笔合约交易已经被部署到了本地区块链上。
我们输入contractInstance.address可以查看这个合约的地址
1 | contractInstance.address |
那我们现在就算是完成了合约的编译和部署的内容。
入股按照上面的步骤最终在DApp调试是报错,大家可以试试下面的步骤:
1 | > var Web3 = require('web3') |
功能使用
调用vote方法进行投票
1 | contractInstance.vote.sendTransaction("Alice",{from:web3.eth.accounts[0]}) |
调用totalVotesFor方法查看当前投票数
1 | contractInstance.totalVotesFor.call("Alice") |
这里注意:查询用call,交易用sendTransaction,但也可以不用,是因为这里会自动判断它是call还是sendTransaction,建议加上增强记忆。
前端交互
如果前面的任务都顺利完成了,那么我们就可以开始做前端进行交互了。
index.html
1 |
|
index.js
1 | var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545')); |
问题
- 在remix中需要输入[]bytes32格式,必须要如下才行:
1 | ["0x7465737400000000000000000000000000000000000000000000000000000000","0x7465737400000000000000000000000000000000000000000000000000000001","0x7465737400000000000000000000000000000000000000000000000000000002"] |
- 候选人的名称尽量使用英文,用中文应该会有意想不到的错误。