从零构建以太坊(Ethereum)智能合约到项目实战——第23章 从零构建和部署去中心化投票App,decentralization Voting Dapp
P90 、1-从零构建和部署去中心化投票App-01
P91 、2-从零构建和部署去中心化投票App-02
P92 、3-从零构建和部署去中心化投票App-03
参考博文:http://liyuechun.org/2017/10/13/smart-contract-voting-dapp/
课程目标
- 了解区块链智能合约
- 学会搭建智能合约开发环境
- 学会如何编译智能合约
- 学会如何将智能合约部署到区块链
- 学会如何通过WebApp和智能合约尽心互动
- 掌握DApp(去中心化App)的整个开发部署流程
- 掌握去中心化在实战产品中应用的重大意义
创建项目
mkdir Voting
cd Voting
truffle unbox react-box
项目结构
contracts:
编写智能合约的文件夹,所有的智能合约文件都放置在这里migrations:
部署合约配置的文件夹src:
基于React的Web端源码test:
智能合约测试用例文件夹
编写投票Dapp智能合约
在contracts
文件夹下创建Voting.sol
文件,将下面的代码拷贝到文件中。
pragma solidity ^0.5.0; contract Voting { // a -> 10 // b -> 5 // c -> 20 //["0x61","0x62","0x63"] mapping (bytes32 => uint8) public votesReceived; // 存储候选人名字的数组 bytes32[] public candidateList; // 构造函数 初始化候选人名单 constructor(bytes32[] memory candidateNames) public{ candidateList = candidateNames; } // 查询某个候选人的总票数 function totalVotesFor(bytes32 candidate) public view returns (uint8) { require(validCandidate(candidate) == true); // 或者 // assert(validCandidate(candidate) == true); return votesReceived[candidate]; } // 为某个候选人投票 function voteForCandidate(bytes32 candidate) public { assert(validCandidate(candidate) == true); votesReceived[candidate] += 1; } // 检索投票的姓名是不是候选人的名字 function validCandidate(bytes32 candidate) public view returns (bool) { for(uint i = 0; i < candidateList.length; i++) { if (candidateList[i] == candidate) { return true; } } return false; } }
通过remix + metamask部署合约到Kovan Test Net
- 在Google浏览器里面安装
MetaMask
插件
- 打开https://remix.ethereum.org将合约代码拷贝到里面
- 确保
MetaMask
账号处于登录状态,并且有一定的以太币支付给矿工。 - 确保
Environment
是Injected Web3
,如果切换不过来,关掉浏览器重新启动 - 在
create
函数中输入一个数组,数组里面的内容为候选人名单 - 点击
create
按钮,会弹出MetaMask
界面让你确认,确认提交,过一会儿,合约就部署成功 - 可以测试给某个候选人投票,查询某个候选人的票数