Solidity(7)

164 阅读1分钟

智能合约投票


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;
        }
    }
    
}