首先,我們在合約中添加winningProposal
函數。此函數將遍歷所有提案併返回票數最多的提案。此外,我們將創建一個winnerName
函數,用於返回穫勝提案的名稱。合約的最終版本如下:
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;
}
function winningProposal() public view returns (uint winningProposal_) {
uint winningVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
function winnerName() public view returns (string memory winnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
我們來解釋一下新添加的兩個函數:
Winning Proposal函數:此函數將遍歷所有提案併找到投票數最高的那個。它返回該提案在proposals
數組中的索引。此函數是一個view
函數,隻讀取數據,不修改合約狀態。
Winner Name函數:此函數會調用winningProposal
函數穫取穫勝提案的索引,然後返回穫勝提案的名稱。
單擊左側邊欄上的Solidity編譯器圖標,然後單擊“Compile”按鈕,來編譯您的合約。
在“Deploy & Run Transactions”選項卡中部署併運行合約。註冊投票人,添加提案,進行投票,最後查看穫勝者。
在下一章中,我們將探討合約交互與事件記録。我們將學習不衕的合約如何交互,以及如何在區塊鏈上記録和監控活動。恭喜大家在以太坊上構建了自己的第一個去中心化投票繫統!
首先,我們在合約中添加winningProposal
函數。此函數將遍歷所有提案併返回票數最多的提案。此外,我們將創建一個winnerName
函數,用於返回穫勝提案的名稱。合約的最終版本如下:
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;
}
function winningProposal() public view returns (uint winningProposal_) {
uint winningVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
function winnerName() public view returns (string memory winnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
我們來解釋一下新添加的兩個函數:
Winning Proposal函數:此函數將遍歷所有提案併找到投票數最高的那個。它返回該提案在proposals
數組中的索引。此函數是一個view
函數,隻讀取數據,不修改合約狀態。
Winner Name函數:此函數會調用winningProposal
函數穫取穫勝提案的索引,然後返回穫勝提案的名稱。
單擊左側邊欄上的Solidity編譯器圖標,然後單擊“Compile”按鈕,來編譯您的合約。
在“Deploy & Run Transactions”選項卡中部署併運行合約。註冊投票人,添加提案,進行投票,最後查看穫勝者。
在下一章中,我們將探討合約交互與事件記録。我們將學習不衕的合約如何交互,以及如何在區塊鏈上記録和監控活動。恭喜大家在以太坊上構建了自己的第一個去中心化投票繫統!