Почнемо з додавання функції winningProposal
до нашого контракту. Ця функція перегляне всі пропозиції та поверне ту, яка набрала найбільше голосів. Крім того, ми створимо функцію winnerName
для повернення назви переможної пропозиції. Ось остаточний варіант нашого контракту:
Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
контракт Виборець {
struct Особа {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] публічні пропозиції;
відображення (адреса => особа) публічних виборців;
функція 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 повертає (uint winningProposal_) {
uint winningVoteCount = 0;
для (uint p = 0; p < offers.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
функція winnerName() загальнодоступний перегляд повертає (пам’ять рядка winnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Пояснимо нові доповнення:
Функція виграшної пропозиції: ця функція переглядає всі пропозиції та знаходить ту, яка має найбільшу кількість голосів. Він повертає індекс цієї пропозиції в масиві proposals
. Це функція view
, тобто вона не змінює стан контракту, а лише читає дані.
Функція імені переможця: ця функція викликає функцію winningProposal
, щоб отримати індекс переможної пропозиції, а потім повертає назву цієї пропозиції.
Складіть свій договір, натиснувши піктограму компілятора Solidity на лівій бічній панелі, а потім натиснувши кнопку «Компілювати».
Розгорніть свій контракт на вкладці «Deploy & Run Transactions» і взаємодійте з ним. Зареєструйте виборців, додайте кілька пропозицій, віддайте свої голоси та, нарешті, визначте переможця.
У наступному уроці ми обговоримо взаємодію контрактів і журналювання подій. Ми дізнаємося, як контракти можуть взаємодіяти один з одним і як реєструвати та контролювати діяльність у блокчейні. Вітаємо зі створенням вашої першої децентралізованої системи голосування на Ethereum!
Почнемо з додавання функції winningProposal
до нашого контракту. Ця функція перегляне всі пропозиції та поверне ту, яка набрала найбільше голосів. Крім того, ми створимо функцію winnerName
для повернення назви переможної пропозиції. Ось остаточний варіант нашого контракту:
Solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
контракт Виборець {
struct Особа {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] публічні пропозиції;
відображення (адреса => особа) публічних виборців;
функція 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 повертає (uint winningProposal_) {
uint winningVoteCount = 0;
для (uint p = 0; p < offers.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
функція winnerName() загальнодоступний перегляд повертає (пам’ять рядка winnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Пояснимо нові доповнення:
Функція виграшної пропозиції: ця функція переглядає всі пропозиції та знаходить ту, яка має найбільшу кількість голосів. Він повертає індекс цієї пропозиції в масиві proposals
. Це функція view
, тобто вона не змінює стан контракту, а лише читає дані.
Функція імені переможця: ця функція викликає функцію winningProposal
, щоб отримати індекс переможної пропозиції, а потім повертає назву цієї пропозиції.
Складіть свій договір, натиснувши піктограму компілятора Solidity на лівій бічній панелі, а потім натиснувши кнопку «Компілювати».
Розгорніть свій контракт на вкладці «Deploy & Run Transactions» і взаємодійте з ним. Зареєструйте виборців, додайте кілька пропозицій, віддайте свої голоси та, нарешті, визначте переможця.
У наступному уроці ми обговоримо взаємодію контрактів і журналювання подій. Ми дізнаємося, як контракти можуть взаємодіяти один з одним і як реєструвати та контролювати діяльність у блокчейні. Вітаємо зі створенням вашої першої децентралізованої системи голосування на Ethereum!