从零构建以太坊(Ethereum)智能合约到项目实战——第23章 从零构建和部署去中心化投票App,decentralization Voting Dapp
2024-09-18 23:55:07
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.; 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] += ;
} // 检索投票的姓名是不是候选人的名字
function validCandidate(bytes32 candidate) public view returns (bool) {
for(uint i = ; 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
界面让你确认,确认提交,过一会儿,合约就部署成功 - 可以测试给某个候选人投票,查询某个候选人的票数
最新文章
- Oracle 常用函数
- Activity活动
- 深入理解java虚拟机【Java Class类文件结构】
- Ibatis 异常:Unable to open connection to ";oledb , provider V2.0.0.0 in framework .NET V2.0";.
- React组件生命周期-正确执行初始化阶段的函数
- Gulp 自动化的项目构建工具
- [iOS UI进阶 - 6.1] 核心动画CoreAnimation
- Oracle SQL Developer 操作
- java的几种对象解释
- SceneKit做一个旋转的地球效果
- 【BZOJ 3754】: Tree之最小方差树
- [Swift]LeetCode39. 组合总和 | Combination Sum
- PHP04
- Java IO笔记
- 【apache tika】apache tika获取文件内容(与FileUtils的对比)
- 【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程
- UltraEdit 换行替换
- poj2447
- Jindent——让intellij idea 像eclipse一样生成模版化的javadoc注释
- git reset与git revert比較
热门文章
- ACM的探索之Keen On Evrything But Triangle(我觉得可以很接近啦!!)
- webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错:
- Django报错 The serializer field might be named incorrectly and not match any Got AttributeError when attempting to get a value for field `author_for` on serializer `KnownledgeBaseListSerializer`
- Springmvc-crud-05(路径错误)
- 笔记本电脑插上耳机声音依然外放解决方法 为什么插入HDMI线,电脑的音响就没有声音了
- tkinter学习(4)frame、pack、canvas学习
- Visual Studio调试Tersseract
- 消息队列(五)--- RocketMQ-消息存储2
- PyQt5窗口操作大全
- Ubuntu 16.04 安装ROS sudo rosdep init报错问题