Давайте начнем с добавления функции 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;
}
}
Давайте объясним новые дополнения:
Функция выигрышного предложения: Эта функция выполняет итерации по всем предложениям и находит то, которое имеет наибольшее количество голосов. Он возвращает индекс данного предложения в массиве предложений
. Это функция представления
, то есть она не изменяет состояние контракта и только считывает данные.
Функция "Имя победителя": Эта функция вызывает функцию winningProposal
, чтобы получить индекс победившего предложения, а затем возвращает название этого предложения.
Скомпилируйте Ваш контракт, щелкнув на значке компилятора Solidity на левой боковой панели, а затем нажав на кнопку "Компилировать".
Разверните Ваш контракт на вкладке "Развернуть & Выполнить транзакции" и взаимодействуйте с ним. Зарегистрируйте несколько избирателей, добавьте несколько предложений, проголосуйте и, наконец, проверьте победителя.
В следующем уроке мы обсудим взаимодействие с контрактами и регистрацию событий. Мы узнаем, как контракты могут взаимодействовать друг с другом и как регистрировать и отслеживать действия на blockchain. Поздравляем Вас с созданием первой децентрализованной системы голосования на Ethereum!
Давайте начнем с добавления функции 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;
}
}
Давайте объясним новые дополнения:
Функция выигрышного предложения: Эта функция выполняет итерации по всем предложениям и находит то, которое имеет наибольшее количество голосов. Он возвращает индекс данного предложения в массиве предложений
. Это функция представления
, то есть она не изменяет состояние контракта и только считывает данные.
Функция "Имя победителя": Эта функция вызывает функцию winningProposal
, чтобы получить индекс победившего предложения, а затем возвращает название этого предложения.
Скомпилируйте Ваш контракт, щелкнув на значке компилятора Solidity на левой боковой панели, а затем нажав на кнопку "Компилировать".
Разверните Ваш контракт на вкладке "Развернуть & Выполнить транзакции" и взаимодействуйте с ним. Зарегистрируйте несколько избирателей, добавьте несколько предложений, проголосуйте и, наконец, проверьте победителя.
В следующем уроке мы обсудим взаимодействие с контрактами и регистрацию событий. Мы узнаем, как контракты могут взаимодействовать друг с другом и как регистрировать и отслеживать действия на blockchain. Поздравляем Вас с созданием первой децентрализованной системы голосования на Ethereum!