我們將添加一個提案繫統和一個供已註冊投票人投票的選項。爲此,我們需要一個數組來存儲提案和一個新的函數用於投票。
在Voter
合約中,添加以下代碼:
Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Voter {
struct Person {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] public proposals;
mapping(address => Person) public voters;
function registerVoter() public {
voters[msg.sender].voted = false;
}
function addProposal(string memory _name) public {
proposals.push(Proposal(_name, 0));
}
function vote(uint _proposal) public {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
}
爲便於理解,我們將對新代碼進行拆分講解:
Proposal結構:我們添加了一個新結構Proposal
,包含提案的名稱和它所穫得的票數。
Proposals數組:proposals
數組包含投票繫統中的所有提案。
AddProposal函數:addProposal
函數允許我們曏proposals
數組添加一個新提案。初始投票數設置爲零。
Vote函數:vote
函數是使已註冊投票人進行投票的函數。它以提案的索引爲參數,併將提案的票數增加一個。此函數還會檢查投票人是否已經投票併更新投票人的狀態。
截至目前,我們已曏合約添加了諸多功能,接下來便可以編譯和測試它了。在Remix IDE中,單擊左側邊欄的Solidity編譯器圖標,然後單擊“Compile”按鈕。
要測試合約,請進入“Deploy & Run Transactions”選項卡(Solidity編譯器圖標下方的圖錶)併單擊“Deploy”按鈕。部署完成後,您可以從此選項卡調用其函數來運行它。您還可以通過註冊投票人、添加提案和投票,查看其運行方式。
在下一章中,我們將統計票數併宣布投票結果。在此之前,您可以隨意探索和試用該合約。Solidity提供了很多功能,可以使您的合約更加安全、強大。祝編碼愉快!
我們將添加一個提案繫統和一個供已註冊投票人投票的選項。爲此,我們需要一個數組來存儲提案和一個新的函數用於投票。
在Voter
合約中,添加以下代碼:
Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Voter {
struct Person {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] public proposals;
mapping(address => Person) public voters;
function registerVoter() public {
voters[msg.sender].voted = false;
}
function addProposal(string memory _name) public {
proposals.push(Proposal(_name, 0));
}
function vote(uint _proposal) public {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
}
爲便於理解,我們將對新代碼進行拆分講解:
Proposal結構:我們添加了一個新結構Proposal
,包含提案的名稱和它所穫得的票數。
Proposals數組:proposals
數組包含投票繫統中的所有提案。
AddProposal函數:addProposal
函數允許我們曏proposals
數組添加一個新提案。初始投票數設置爲零。
Vote函數:vote
函數是使已註冊投票人進行投票的函數。它以提案的索引爲參數,併將提案的票數增加一個。此函數還會檢查投票人是否已經投票併更新投票人的狀態。
截至目前,我們已曏合約添加了諸多功能,接下來便可以編譯和測試它了。在Remix IDE中,單擊左側邊欄的Solidity編譯器圖標,然後單擊“Compile”按鈕。
要測試合約,請進入“Deploy & Run Transactions”選項卡(Solidity編譯器圖標下方的圖錶)併單擊“Deploy”按鈕。部署完成後,您可以從此選項卡調用其函數來運行它。您還可以通過註冊投票人、添加提案和投票,查看其運行方式。
在下一章中,我們將統計票數併宣布投票結果。在此之前,您可以隨意探索和試用該合約。Solidity提供了很多功能,可以使您的合約更加安全、強大。祝編碼愉快!