智能合约投票
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; } } }复制代码