这个投票系统中投票者只能自己投票,不能委托别人替你投票;自己也可以跟自己投,也可以跟别人投,裁判也可以投票;只能投规定的候选人;时间到了才能查看结果;不能重复投,不能延期投。
pragma solidity ^0.4.25;
contract VotingSystem{
// 投票者结构体
struct Voter{
uint weight; // 权重(自己手中的票数)
bool voted; // 是否已经投过票
}
// 候选人结构体
struct Candidate{
uint poll; // 候选人拥有的票数
bool ifCan; // 是否是候选人,只能投指定的人
}
uint startTime; // 开始投票时间
uint time; // 投票期限
address judge; // 裁判
mapping(address=>Voter) voter; // 投票者
mapping(address=>Candidate) candidate; // 候选者
address winner; // 胜利者的地址
constructor(uint _time,address[] _candidate){
judge = msg.sender; // 裁判初始化
startTime = now; // 设定投票开始时间
time = _time * 1 minutes; // 设定投票期限(测试用,设置的最小单位是minutes)
for (uint i = 0; i < _candidate.length; i++){
candidate[_candidate[i]].poll = 0; // 初始化候选人
candidate[_candidate[i]].ifCan = true; // 代表这个是候选人
}
}
// 修饰器(控制时间)
modifier deadline() {
if (now < startTime + time){
_;
}
}
// 修饰器(控制是否投过票)
modifier HaveYouVoted() {
if (voter[msg.sender].voted != true){
_;
}
}
// 修饰器(判断是不是裁判)
modifier ifJudge() {
if (msg.sender == judge){
_;
}
}
// 投票
function vote(address _candidate) public deadline HaveYouVoted returns(bool){
if (voter[msg.sender].weight == 0) // 初始化投票者的票数
voter[msg.sender].weight = 1;
if (candidate[_candidate].ifCan){ // 是否是指定的候选人
candidate[_candidate].poll += voter[msg.sender].weight; // 对应候选人票数+weight
if ( candidate[winner].poll <= candidate[_candidate].poll ){ // 让刚才候选人的票数跟原本最多人的票数比较
winner = _candidate; // 如果满足更新胜利者
}
voter[msg.sender].voted = true; // 投票者设置为已经投过票
return true; // 投票成功就返回true
}else return false; // 投票失败返回false
}
// 返回胜利者
function result() public ifJudge returns(address) {
require(now >= startTime + time); // 判断时间是否已到
return winner; // 返回胜利者
}
}
网友评论