智能合约投票
pragma solidity ^0.4.24;
// 投票人与候选人,默认情况每人只能投一票,而且不能重复投票.候选人不能参与投票(包括不能被自己,或者其他候选人投票)
contract VoteDemo{
// 创建投票人结构体
struct Voter{
address addr; // 投票人的地址
bool vote; // 如果为true则说明此人已投票(限制重复投票)
uint amount; // 目前票数默认为1
}
// 创建一个候选人结构体
struct Candidate{
address addr; // 候选人地址
uint get; // 当前候选人得到的票数
bool win; // 是否获胜
}
// 根据业务需求,推荐在平台中存储投票人和候选人
mapping (address => Voter) public voters;
// 候选人的映射
mapping (address => Candidate) public candidates;
// 初始化候选人
function initCandidate(address addr){
candidates[addr] = Candidate(addr,0,false);
}
// 初始化投票人
function initVote(address addr){
if(voters[addr].vote){
return; // 此人已投票,返回即可
}
// 此人之前已经投票,则不应该在添加到此映射中
// voters[addr]= Voter({addr:addr,vote:false,amount:1});
// 及时没有此地址,也不会抛出null异常
voters[addr].addr = addr;
voters[addr].vote = false;
voters[addr].amount = 1;
}
// 实现投票的业务逻辑,候选人不能参与投票(包括不能被自己,或者其他候选人投票)
function vote(address candidate){
// 调用此函数的人就是投票人
Voter v =voters[msg.sender];
// 如果此人已投票,或者此人为候选人则不能够投票
if(v.vote || v.addr == candidate)
return;
// 给候选人投票
candidates[candidate].get += v.amount;
// 记录当前投票人已投票
v.vote = true;
}
// 判断成功的候选人
function success(address addr1,address addr2) returns (address){
// 通过票数判断获胜投资人
if(candidates[addr1].get > candidates[addr2].get){
// addr1获胜
candidates[addr1].win = true;
return addr1;
}else{
candidates[addr2].win = true;
return addr2;
}
}
}