美文网首页区块链区块链研习社
solidity实现简单的投票系统(仅供学习用)

solidity实现简单的投票系统(仅供学习用)

作者: 吴敬悦 | 来源:发表于2018-11-24 10:58 被阅读0次

这个投票系统中投票者只能自己投票,不能委托别人替你投票;自己也可以跟自己投,也可以跟别人投,裁判也可以投票;只能投规定的候选人;时间到了才能查看结果;不能重复投,不能延期投。

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;                                                  // 返回胜利者

    }

}

相关文章

网友评论

    本文标题:solidity实现简单的投票系统(仅供学习用)

    本文链接:https://www.haomeiwen.com/subject/olveqqtx.html