投票系统是区块链应用的经典案例,展示了如何利用智能合约实现透明、不可篡改的投票机制。本文通过完整的投票系统实现,演示Solidity的实际开发流程和最佳实践。
一、什么是投票系统 1. 基本概念 投票系统是使用智能合约实现的去中心化投票机制,可以用于选举、提案表决、DAO治理等场景。区块链的透明性和不可篡改性使其成为实现公平投票的理想平台。
2. 投票系统的特点 透明性 去中心化 自动化 二、如何设计投票系统 1. 核心功能 提案管理 投票功能 结果统计 2. 数据结构 提案结构 1 2 3 4 5 6 7 8 9 10 11 12 13 struct Proposal { string description; uint256 voteCount; uint256 deadline; bool executed; mapping(address => bool ) hasVoted; } `投票记录:`soliditystruct Vote { address voter; bool support; uint256 timestamp; }
三、如何实现投票系统 1. 完整实现 1 2 3 4 投票合约:pragma solidity ^0.8 .0 ; contract VotingSystem {
}
}
1 2 3 4 5 6 7 8 9 10 11 address public chairperson; Proposal[] public proposals; mapping(uint256 => Vote[]) public proposalVotes; mapping(address => bool ) public voters; event ProposalCreated (uint256 indexed proposalId, string description, uint256 deadline ) ; event VoteCast (uint256 indexed proposalId, address indexed voter, bool support ) ; event ProposalExecuted (uint256 indexed proposalId, bool result ) ; modifier onlyChairperson () { require(msg.sender == chairperson, "Not chairperson" );
_; }
1 2 modifier onlyVoter( ) { require( voters[msg.sender], "Not a voter" )
_; }
1 2 3 4 constructor (address[] memory _voters)
}
1 2 3 4 function createProposal (string memory description, uint256 duration) public onlyChairperson returns (uint256)
{
1 2 3 4 5 6 7 8 9 uint256 proposalId = proposals.length; proposals.push (); Proposal storage proposal = proposals[proposalId]; proposal.description = description ; proposal.deadline = block.timestamp + duration; proposal.executed = false ; emit ProposalCreated(proposalId, description , proposal.deadline);return proposalId;
}
1 2 3 4 5 6 7 function vote( uint256 proposalId, bool support) public onlyVoter { require( block.timestamp < proposal.deadline, "Proposal expired" ) require( !proposal.hasVoted[msg.sender], "Already voted" ) proposal.hasVoted[msg.sender] = true if ( support) { proposal.voteCount++
}
1 2 3 4 5 6 7 proposalVotes[proposalId].push( Vote( { voter: msg.sender, support: support, timestamp: block.timestamp }) ) emit VoteCast( proposalId, msg.sender, support)
}
1 2 3 4 5 function getProposal (uint256 proposalId )#### view returns (string memory, uint256, uint256, bool )
{
proposal.description, proposal.voteCount, proposal.deadline, proposal.executed ); }
1 2 function getVoteCount (uint256 proposalId) public view returns (uint256) {return proposals[proposalId].voteCount ;
}
1 2 function getVotes (uint256 proposalId) public view returns (Vote[] memory) {return proposalVotes[proposalId] ;
}
1 2 3 4 5 6 7 8 9 10 11 12 function executeProposal( uint256 proposalId) public { require( block.timestamp >= proposal.deadline, "Proposal not ended" ) require( !proposal.executed, "Already executed" ) bool result = proposal.voteCount > 0 proposal.executed = true emit ProposalExecuted( proposalId, result) // 根据结果执行相应操作 if ( result) { // 执行通过的操作
}
1 2 function addVoter(address voter) public onlyChairperson { voters[voter] = true ;
}
1 2 function removeVoter(address voter) public onlyChairperson { voters[voter] = false ;
}
1 2 3 4 5 6 #### 2. 使用示例 部署合约: const voters = [
'0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
'0x8ba1f109551bD432803012645Hac136c22C9e8c',
'0x1234567890123456789012345678901234567890'
];
1 2 3 const VotingSystem = await ethers.getContractFactory ("VotingSystem" );const voting = await VotingSystem .deploy (voters);await voting.deployed ();
创建提案:
const tx = await voting.createProposal(
1 2 3 "是否增加开发预算?", 7 * 24 * 60 * 60 // 7天 );
await tx.wait();
1 2 3 4 投票:await voting.vote (0 , true ); await voting.vote (0 , false );
查询结果:
const voteCount = await voting.getVoteCount(0); console.log(‘支持票数:’, voteCount.toString());
四、应用场景 1. DAO治理 项目治理:
实际案例:
MakerDAO治理 Uniswap治理 Compound治理 各种DeFi协议 2. 企业投票 股东投票:
员工投票:
3. 社区投票 开源项目:
在线社区:
五、功能扩展 1. 加权投票 基于代币: mapping(address => uint256) public tokenBalances;
function vote(uint256 proposalId, bool support, uint256 weight) public { require(tokenBalances[msg.sender] >= weight, “Insufficient tokens”);
proposal.voteCount += weight; }
投票委托: mapping(address => address) public delegates;
function delegate(address to) public { delegates[msg.sender] = to;
function vote(uint256 proposalId, bool support) public { address voter = delegates[msg.sender]; if (voter == address(0)) { voter = msg.sender;
// 使用voter投票
3. 时间锁 延迟执行: mapping(uint256 => uint256) public executionTime;
require(block.timestamp >= executionTime[proposalId], "Still in timelock");
// 执行提案
}
1 2 3 4 5 6 7 8 9 10 11 ## 六、最佳实践 #### 1. 安全考虑 #### 防止重复投票 `时间验证:`solidity `权限控制:`solidity _; }
2. Gas优化 批量操作: function batchAddVoters(address[] memory _voters) public onlyChairperson { }事件记录:solidity // 使用事件替代存储历史
清晰接口: function getProposalInfo(uint256 proposalId) view returns (
1 2 3 4 5 6 7 string memory description,uint 256 voteCount,uint 256 deadline,bool executed,bool canVote ) {
canVote = block.timestamp < proposal.deadline &&
!proposal.hasVoted[msg.sender] && voters[msg.sender];
1 2 3 4 5 proposal.executed, canVote ); }
七、测试 1. 单元测试 测试脚本: describe(“VotingSystem”, function() { it(“Should create proposal”, async function() { const tx = await voting.createProposal(“Test”, 86400); const proposal = await voting.getProposal(0); expect(proposal.description).to.equal(“Test”); });
it("Should allow voting", async function() {
await voting.vote(0, true); expect(voteCount).to.equal(1); });
it("Should prevent double voting", async function() {
await expect(voting.vote(0, false)).to.be.revertedWith(“Already voted”); });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ## 八、总结 投票系统是展示Solidity实际应用的优秀案例。关键要点:#### 核心功能 - 提案管理- 投票机制- 结果统计- 自动执行#### 设计要点 - 时间控制- 权限管理- 结果透明#### 应用场景 - DAO治理- 企业投票- 社区决策- 各种表决场景 通过实现投票系统,可以深入理解智能合约的开发流程,掌握Solidity的实际应用,为开发更复杂的去中心化应用打下坚实基础。
本文标题: Solidity编程实战投票系
发布时间: 2023年02月01日 00:00
最后更新: 2026年09月16日 05:40
原始链接: https://haoxiang.eu.org/c3e11a52/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!