Mari kita mulai dengan menambahkan fungsi winningProposal
ke kontrak kita. Fungsi ini akan mengulangi semua proposal dan mengembalikan proposal dengan suara terbanyak. Selain itu, kita akan membuat fungsi winnerName
untuk mengembalikan nama proposal pemenang. Ini adalah versi final kontrak kami:
Soliditas
// Pengenal Lisensi SPDX: GPL-3.0
pragma soliditas >=0.7.0 <0.9.0;
kontrak Pemilih {
struct Person {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] proposal publik;
pemetaan (alamat => Orang) pemilih masyarakat;
fungsi registerVoter() publik {
voters[msg.sender].voted = false;
}
fungsi addProposal(string memori _nama) publik {
proposals.push(Proposal(_name, 0));
}
fungsi vote(uint _proposal) publik {
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;
}
fungsi winProposal() tampilan publik kembali (uint winProposal_) {
uint winVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
fungsi WinnerName() tampilan publik kembali (memori string WinnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Mari kita jelaskan tambahan barunya:
Fungsi Proposal Pemenang: Fungsi ini mengulangi semua proposal dan menemukan proposal dengan jumlah suara tertinggi. Ini mengembalikan indeks proposal ini dalam array proposals
. Ini adalah fungsi view
, artinya tidak mengubah status kontrak dan hanya membaca data.
Fungsi Nama Pemenang: Fungsi ini memanggil fungsi winningProposal
untuk mendapatkan indeks proposal pemenang dan kemudian mengembalikan nama proposal tersebut.
Kompilasi kontrak Anda dengan mengklik ikon kompiler Soliditas di sidebar kiri dan kemudian mengklik tombol “Kompilasi”.
Terapkan kontrak Anda di tab “Terapkan & Jalankan Transaksi” dan berinteraksi dengannya. Daftarkan beberapa pemilih, tambahkan beberapa proposal, berikan suara Anda, dan terakhir, periksa pemenangnya.
Pada pelajaran berikutnya, kita akan membahas interaksi kontrak dan pencatatan peristiwa. Kita akan mempelajari bagaimana kontrak dapat berinteraksi satu sama lain dan cara mencatat serta memantau aktivitas di blockchain. Selamat atas pembangunan sistem pemungutan suara terdesentralisasi pertama Anda di Ethereum!
Mari kita mulai dengan menambahkan fungsi winningProposal
ke kontrak kita. Fungsi ini akan mengulangi semua proposal dan mengembalikan proposal dengan suara terbanyak. Selain itu, kita akan membuat fungsi winnerName
untuk mengembalikan nama proposal pemenang. Ini adalah versi final kontrak kami:
Soliditas
// Pengenal Lisensi SPDX: GPL-3.0
pragma soliditas >=0.7.0 <0.9.0;
kontrak Pemilih {
struct Person {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] proposal publik;
pemetaan (alamat => Orang) pemilih masyarakat;
fungsi registerVoter() publik {
voters[msg.sender].voted = false;
}
fungsi addProposal(string memori _nama) publik {
proposals.push(Proposal(_name, 0));
}
fungsi vote(uint _proposal) publik {
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;
}
fungsi winProposal() tampilan publik kembali (uint winProposal_) {
uint winVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
fungsi WinnerName() tampilan publik kembali (memori string WinnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Mari kita jelaskan tambahan barunya:
Fungsi Proposal Pemenang: Fungsi ini mengulangi semua proposal dan menemukan proposal dengan jumlah suara tertinggi. Ini mengembalikan indeks proposal ini dalam array proposals
. Ini adalah fungsi view
, artinya tidak mengubah status kontrak dan hanya membaca data.
Fungsi Nama Pemenang: Fungsi ini memanggil fungsi winningProposal
untuk mendapatkan indeks proposal pemenang dan kemudian mengembalikan nama proposal tersebut.
Kompilasi kontrak Anda dengan mengklik ikon kompiler Soliditas di sidebar kiri dan kemudian mengklik tombol “Kompilasi”.
Terapkan kontrak Anda di tab “Terapkan & Jalankan Transaksi” dan berinteraksi dengannya. Daftarkan beberapa pemilih, tambahkan beberapa proposal, berikan suara Anda, dan terakhir, periksa pemenangnya.
Pada pelajaran berikutnya, kita akan membahas interaksi kontrak dan pencatatan peristiwa. Kita akan mempelajari bagaimana kontrak dapat berinteraksi satu sama lain dan cara mencatat serta memantau aktivitas di blockchain. Selamat atas pembangunan sistem pemungutan suara terdesentralisasi pertama Anda di Ethereum!