Урок 3

Pelaksana Penghitungan Suara dan Pengumuman Hasil

Dalam pelajaran ini, kita akan menerapkan bagian terakhir dari sistem pemungutan suara terdesentralisasi: menghitung suara dan mengumumkan hasilnya. Hal ini akan melibatkan perluasan kontrak Pemilih kami untuk terakhir kalinya dan pembuatan fungsi untuk menghitung proposal pemenang.

Memperluas Kontrak Pemilih

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;
    }
}

Memahami Kode

Mari kita jelaskan tambahan barunya:

  1. 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.

  2. Fungsi Nama Pemenang: Fungsi ini memanggil fungsi winningProposal untuk mendapatkan indeks proposal pemenang dan kemudian mengembalikan nama proposal tersebut.

Kompilasi dan Pengujian

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.

Bagaimana cara melakukannya:

  1. Deployment: Pertama, klik tab “Deploy & Run Transactions” di Remix IDE. Itu yang ada di bawah ikon kompiler Soliditas. Pastikan Anda berada di lingkungan “JavaScript VM”. Kemudian, klik tombol “Terapkan”.
  2. Mendaftarkan Pemilih: Setelah kontrak diterapkan, Anda akan melihatnya di bagian “Kontrak yang Diterapkan”. Klik panah untuk memperluasnya. Anda akan menemukan semua fungsi kontrak kami tercantum di sana.
  3. Untuk mendaftarkan pemilih, carilah fungsi registerVoter. Karena kami telah memprogram kontrak kami untuk mendaftarkan akun yang memanggil fungsi ini sebagai pemilih, Anda dapat berpindah akun di menu tarik-turun “Akun” di tab “Terapkan & Jalankan Transaksi”. Setelah Anda memilih akun, klik fungsi registerVoter. Ulangi langkah ini untuk setiap akun yang ingin Anda daftarkan sebagai pemilih.
  4. Menambahkan Proposal: Untuk menambahkan proposal, temukan fungsi addProposal. Masukkan nama proposal di kotak input di sebelah fungsi dan klik fungsi tersebut. Ulangi langkah ini untuk setiap proposal yang ingin Anda tambahkan.
  5. Pemungutan suara: Untuk memilih, beralihlah ke akun pemilih dan temukan fungsi pemungutan suara. Masukkan indeks proposal (urutan Anda menambahkannya, mulai dari 0) yang ingin Anda pilih di kotak input di sebelah fungsi dan klik fungsi tersebut. Ulangi langkah ini untuk setiap pemilih.
  6. Memeriksa Pemenang: Setelah semua pemilih memberikan suaranya, Anda dapat memeriksa pemenangnya. Temukan fungsi WinnerName dan klik. Nama proposal pemenang akan ditampilkan di konsol di bagian bawah layar.
  7. Ingat, semua tindakan di blockchain (termasuk tindakan pengujian di Remix) adalah transaksi. Anda dapat memperluas detail transaksi di konsol untuk melihat informasi lebih lanjut, seperti biaya transaksi dan data. Merupakan praktik yang baik untuk memeriksa informasi ini guna memahami lebih baik bagaimana kontrak Anda berinteraksi dengan blockchain.

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!

Відмова від відповідальності
* Криптоінвестиції пов'язані зі значними ризиками. Дійте обережно. Курс не є інвестиційною консультацією.
* Курс створений автором, який приєднався до Gate Learn. Будь-яка думка, висловлена автором, не є позицією Gate Learn.
Каталог
Урок 3

Pelaksana Penghitungan Suara dan Pengumuman Hasil

Dalam pelajaran ini, kita akan menerapkan bagian terakhir dari sistem pemungutan suara terdesentralisasi: menghitung suara dan mengumumkan hasilnya. Hal ini akan melibatkan perluasan kontrak Pemilih kami untuk terakhir kalinya dan pembuatan fungsi untuk menghitung proposal pemenang.

Memperluas Kontrak Pemilih

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;
    }
}

Memahami Kode

Mari kita jelaskan tambahan barunya:

  1. 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.

  2. Fungsi Nama Pemenang: Fungsi ini memanggil fungsi winningProposal untuk mendapatkan indeks proposal pemenang dan kemudian mengembalikan nama proposal tersebut.

Kompilasi dan Pengujian

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.

Bagaimana cara melakukannya:

  1. Deployment: Pertama, klik tab “Deploy & Run Transactions” di Remix IDE. Itu yang ada di bawah ikon kompiler Soliditas. Pastikan Anda berada di lingkungan “JavaScript VM”. Kemudian, klik tombol “Terapkan”.
  2. Mendaftarkan Pemilih: Setelah kontrak diterapkan, Anda akan melihatnya di bagian “Kontrak yang Diterapkan”. Klik panah untuk memperluasnya. Anda akan menemukan semua fungsi kontrak kami tercantum di sana.
  3. Untuk mendaftarkan pemilih, carilah fungsi registerVoter. Karena kami telah memprogram kontrak kami untuk mendaftarkan akun yang memanggil fungsi ini sebagai pemilih, Anda dapat berpindah akun di menu tarik-turun “Akun” di tab “Terapkan & Jalankan Transaksi”. Setelah Anda memilih akun, klik fungsi registerVoter. Ulangi langkah ini untuk setiap akun yang ingin Anda daftarkan sebagai pemilih.
  4. Menambahkan Proposal: Untuk menambahkan proposal, temukan fungsi addProposal. Masukkan nama proposal di kotak input di sebelah fungsi dan klik fungsi tersebut. Ulangi langkah ini untuk setiap proposal yang ingin Anda tambahkan.
  5. Pemungutan suara: Untuk memilih, beralihlah ke akun pemilih dan temukan fungsi pemungutan suara. Masukkan indeks proposal (urutan Anda menambahkannya, mulai dari 0) yang ingin Anda pilih di kotak input di sebelah fungsi dan klik fungsi tersebut. Ulangi langkah ini untuk setiap pemilih.
  6. Memeriksa Pemenang: Setelah semua pemilih memberikan suaranya, Anda dapat memeriksa pemenangnya. Temukan fungsi WinnerName dan klik. Nama proposal pemenang akan ditampilkan di konsol di bagian bawah layar.
  7. Ingat, semua tindakan di blockchain (termasuk tindakan pengujian di Remix) adalah transaksi. Anda dapat memperluas detail transaksi di konsol untuk melihat informasi lebih lanjut, seperti biaya transaksi dan data. Merupakan praktik yang baik untuk memeriksa informasi ini guna memahami lebih baik bagaimana kontrak Anda berinteraksi dengan blockchain.

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!

Відмова від відповідальності
* Криптоінвестиції пов'язані зі значними ризиками. Дійте обережно. Курс не є інвестиційною консультацією.
* Курс створений автором, який приєднався до Gate Learn. Будь-яка думка, висловлена автором, не є позицією Gate Learn.