简单投票合约(Solidity示例)

投票是最常见的民主决策机制,而以太坊智能合约可以提供一个透明、防篡改的投票系统。

合约功能:

  1. 部署时创建多个候选人选项。
  2. 只有注册的投票者(地址)才能投票,且只能投一次票。
  3. 投票过程公开透明,结果实时可查,直到投票结束。
  4. 投票结束后,可以统计并公布各候选人的得票数。

Solidity代码简化示例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleVoting {
    // 候选人结构体
    struct Candidate {
        string name;
        uint voteCount;
    }
    // 存储候选人,名字到索引的映射
    mapping(string => uint) public candidateNames;
    // 存储候选人列表
    Candidate[] public candidates;
    // 存储投票者,地址到是否已投票的映射
    mapping(address => bool) public voters;
    // 投票状态
    bool public votingOpen = true;
    // 构造函数,初始化候选人
    constructor(string[] memory candidateList) {
        for (uint i = 0; i < candidateList.length; i++) {
            candidates.push(Candidate({
                name: candidateList[i],
                voteCount: 0
            }));
            candidateNames[candidateList[i]] = i;
        }
    }
    // 投票函数
    function vote(string memory candidateName) public {
        require(votingOpen, "Voting is closed");
        require(!voters[msg.sender], "You have already voted");
        uint candidateIndex = candidateNames[candidateName];
        require(candidateIndex < candidates.length, "Invalid candidate");
        candidates[candidateIndex].voteCount++;
        voters[msg.sender] = true;
    }
    // 关闭投票函数(通常由特定角色调用,或设定时间自动关闭)
    function closeVoting() public {
        votingOpen = false;
    }
    // 获取候选人票数
    function getVoteCount(string memory candidateName) public view returns (uint) {
        return candidates[candidateNames[candidateName]].voteCount;
    }
}

解析:

  • struct Candidate:定义了候选人的数据结构,包含名字和票数。
  • mapping(string => uint) public candidateNames:通过候选人名字快速找到其在数组中的索引。
  • Candidate[] public candidates:动态数组存储所有候选人信息。
  • mapping(address => bool) public voters:记录每个地址是否已投票,防止重复投票。
  • constructor:合约部署时初始化候选人列表。
  • vote:核心投票函数,进行权限检查后更新候选人票数和投票者状态。
  • closeVoting随机配图