solidity實現簡單的投票系統(僅供學習用)
這個投票系統中投票者只能自己投票,不能委託別人替你投票;自己也可以跟自己投,也可以跟別人投,裁判也可以投票;只能投規定的候選人;時間到了才能檢視結果;不能重複投,不能延期投。
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; // 返回勝利者
}
}