الدرس رقم 3

Thực hiện việc kiểm phiếu và công bố kết quả

Trong bài học này, chúng ta sẽ triển khai các phần cuối cùng của hệ thống bỏ phiếu phi tập trung: kiểm phiếu và công bố kết quả. Điều này sẽ liên quan đến việc mở rộng hợp đồng Cử tri của chúng tôi lần cuối và tạo ra các hàm để tính toán đề xuất chiến thắng.

Mở rộng hợp đồng cử tri

Hãy bắt đầu bằng cách thêm hàm winningProposal vào hợp đồng của chúng ta. Hàm này sẽ lặp lại tất cả các đề xuất và trả về đề xuất có nhiều phiếu bầu nhất. Ngoài ra, chúng ta sẽ tạo một hàm winnerName để trả về tên của đề xuất chiến thắng. Đây là phiên bản cuối cùng của hợp đồng của chúng tôi:

Độ rắn 
 // SPDX-Mã định danh giấy phép: GPL-3.0 
 độ rắn pragma >=0.7.0 <0.9.0; 

 hợp đồng Cử tri { 
 cấu trúc Người {
        bool voted;  
        uint vote;   
    }

    cấu trúc Đề xuất {
        string name;   
        uint voteCount; 
    }

    Đề xuất[] đề xuất công khai; 
 bản đồ(địa chỉ => Người) cử tri công cộng; 

 hàm registerVoter() public {
        voters[msg.sender].voted = false;
    }

    hàm addProposal(string Memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    hàm 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; 
    }

    hàm wonProposal() public view trả về (uint winProposal_) { 
 uint winVoteCount = 0; 
 cho (uint p = 0; p < đề xuất.length; p++) { 
 if (đề xuất[p].voteCount > chiến thắngVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    hàm WinnerName() chế độ xem công khai trả về (bộ nhớ chuỗi WinnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Hiểu mã

Hãy giải thích những bổ sung mới:

  1. Chức năng đề xuất chiến thắng: Chức năng này lặp lại tất cả các đề xuất và tìm ra đề xuất có số phiếu bầu cao nhất. Nó trả về chỉ mục của đề xuất này trong mảng proposals . Đó là chức năng view , nghĩa là nó không sửa đổi trạng thái của hợp đồng và chỉ đọc dữ liệu.

  2. Hàm tên người chiến thắng: Hàm này gọi hàm winningProposal để lấy chỉ mục của đề xuất chiến thắng và sau đó trả về tên của đề xuất này.

Biên dịch và thử nghiệm

Biên dịch hợp đồng của bạn bằng cách nhấp vào biểu tượng trình biên dịch Solidity trên thanh bên trái và sau đó nhấp vào nút “Biên dịch”.

Triển khai hợp đồng của bạn trong tab “Triển khai & Chạy giao dịch” và tương tác với hợp đồng đó. Đăng ký một số cử tri, thêm một vài đề xuất, bỏ phiếu và cuối cùng, kiểm tra người chiến thắng.

Làm thế nào để làm nó:

  1. Triển khai: Trước tiên, hãy nhấp vào tab “Triển khai & Chạy giao dịch” trên Remix IDE. Đây là biểu tượng bên dưới biểu tượng trình biên dịch Solidity. Đảm bảo bạn đang ở trong môi trường “JavaScript VM”. Sau đó, nhấp vào nút “Triển khai”.
  2. Đăng ký cử tri: Sau khi hợp đồng được triển khai, bạn sẽ thấy nó trong phần “Hợp đồng đã triển khai”. Bấm vào mũi tên để mở rộng nó. Bạn sẽ tìm thấy tất cả các chức năng trong hợp đồng của chúng tôi được liệt kê ở đó.
  3. Để đăng ký cử tri, hãy tìm hàm registerVoter. Vì chúng tôi đã lập trình hợp đồng của mình để đăng ký tài khoản gọi chức năng này với tư cách là cử tri, nên bạn có thể chuyển đổi tài khoản trong danh sách thả xuống “Tài khoản” trong tab “Triển khai & Chạy giao dịch”. Khi bạn đã chọn một tài khoản, hãy nhấp vào chức năng registerVoter. Lặp lại bước này cho mỗi tài khoản bạn muốn đăng ký làm cử tri.
  4. Thêm đề xuất: Để thêm đề xuất, hãy tìm hàm addProposal. Nhập tên đề xuất vào hộp nhập bên cạnh chức năng và nhấp vào chức năng. Lặp lại bước này cho mỗi đề xuất bạn muốn thêm.
  5. Bỏ phiếu: Để bỏ phiếu, hãy chuyển sang tài khoản cử tri và tìm chức năng bỏ phiếu. Nhập chỉ mục của đề xuất (thứ tự bạn đã thêm, bắt đầu từ 0) mà bạn muốn bỏ phiếu vào hộp nhập bên cạnh chức năng và nhấp vào chức năng. Lặp lại bước này cho mỗi cử tri.
  6. Kiểm tra người chiến thắng: Sau khi tất cả cử tri đã bỏ phiếu, bạn có thể kiểm tra người chiến thắng. Tìm chức năng WinnerName và nhấp vào nó. Tên của đề xuất chiến thắng sẽ được hiển thị trong bảng điều khiển ở cuối màn hình.
  7. Hãy nhớ rằng, tất cả các hành động trong blockchain (bao gồm cả các hành động thử nghiệm trong Remix) đều là giao dịch. Bạn có thể mở rộng chi tiết giao dịch trong bảng điều khiển để xem thêm thông tin, như chi phí giao dịch và dữ liệu. Bạn nên kiểm tra thông tin này để hiểu rõ hơn cách hợp đồng của bạn tương tác với blockchain.

Trong bài học tiếp theo, chúng ta sẽ thảo luận về tương tác hợp đồng và ghi nhật ký sự kiện. Chúng ta sẽ tìm hiểu cách các hợp đồng có thể tương tác với nhau cũng như cách ghi nhật ký và giám sát các hoạt động trên blockchain. Chúc mừng bạn đã xây dựng được hệ thống bỏ phiếu phi tập trung đầu tiên trên Ethereum!

إخلاء المسؤولية
* ينطوي الاستثمار في العملات الرقمية على مخاطر كبيرة. فيرجى المتابعة بحذر. ولا تهدف الدورة التدريبية إلى تقديم المشورة الاستثمارية.
* تم إنشاء الدورة التدريبية من قبل المؤلف الذي انضم إلى مركز التعلّم في Gate. ويُرجى العلم أنّ أي رأي يشاركه المؤلف لا يمثّل مركز التعلّم في Gate.
الكتالوج
الدرس رقم 3

Thực hiện việc kiểm phiếu và công bố kết quả

Trong bài học này, chúng ta sẽ triển khai các phần cuối cùng của hệ thống bỏ phiếu phi tập trung: kiểm phiếu và công bố kết quả. Điều này sẽ liên quan đến việc mở rộng hợp đồng Cử tri của chúng tôi lần cuối và tạo ra các hàm để tính toán đề xuất chiến thắng.

Mở rộng hợp đồng cử tri

Hãy bắt đầu bằng cách thêm hàm winningProposal vào hợp đồng của chúng ta. Hàm này sẽ lặp lại tất cả các đề xuất và trả về đề xuất có nhiều phiếu bầu nhất. Ngoài ra, chúng ta sẽ tạo một hàm winnerName để trả về tên của đề xuất chiến thắng. Đây là phiên bản cuối cùng của hợp đồng của chúng tôi:

Độ rắn 
 // SPDX-Mã định danh giấy phép: GPL-3.0 
 độ rắn pragma >=0.7.0 <0.9.0; 

 hợp đồng Cử tri { 
 cấu trúc Người {
        bool voted;  
        uint vote;   
    }

    cấu trúc Đề xuất {
        string name;   
        uint voteCount; 
    }

    Đề xuất[] đề xuất công khai; 
 bản đồ(địa chỉ => Người) cử tri công cộng; 

 hàm registerVoter() public {
        voters[msg.sender].voted = false;
    }

    hàm addProposal(string Memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    hàm 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; 
    }

    hàm wonProposal() public view trả về (uint winProposal_) { 
 uint winVoteCount = 0; 
 cho (uint p = 0; p < đề xuất.length; p++) { 
 if (đề xuất[p].voteCount > chiến thắngVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    hàm WinnerName() chế độ xem công khai trả về (bộ nhớ chuỗi WinnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Hiểu mã

Hãy giải thích những bổ sung mới:

  1. Chức năng đề xuất chiến thắng: Chức năng này lặp lại tất cả các đề xuất và tìm ra đề xuất có số phiếu bầu cao nhất. Nó trả về chỉ mục của đề xuất này trong mảng proposals . Đó là chức năng view , nghĩa là nó không sửa đổi trạng thái của hợp đồng và chỉ đọc dữ liệu.

  2. Hàm tên người chiến thắng: Hàm này gọi hàm winningProposal để lấy chỉ mục của đề xuất chiến thắng và sau đó trả về tên của đề xuất này.

Biên dịch và thử nghiệm

Biên dịch hợp đồng của bạn bằng cách nhấp vào biểu tượng trình biên dịch Solidity trên thanh bên trái và sau đó nhấp vào nút “Biên dịch”.

Triển khai hợp đồng của bạn trong tab “Triển khai & Chạy giao dịch” và tương tác với hợp đồng đó. Đăng ký một số cử tri, thêm một vài đề xuất, bỏ phiếu và cuối cùng, kiểm tra người chiến thắng.

Làm thế nào để làm nó:

  1. Triển khai: Trước tiên, hãy nhấp vào tab “Triển khai & Chạy giao dịch” trên Remix IDE. Đây là biểu tượng bên dưới biểu tượng trình biên dịch Solidity. Đảm bảo bạn đang ở trong môi trường “JavaScript VM”. Sau đó, nhấp vào nút “Triển khai”.
  2. Đăng ký cử tri: Sau khi hợp đồng được triển khai, bạn sẽ thấy nó trong phần “Hợp đồng đã triển khai”. Bấm vào mũi tên để mở rộng nó. Bạn sẽ tìm thấy tất cả các chức năng trong hợp đồng của chúng tôi được liệt kê ở đó.
  3. Để đăng ký cử tri, hãy tìm hàm registerVoter. Vì chúng tôi đã lập trình hợp đồng của mình để đăng ký tài khoản gọi chức năng này với tư cách là cử tri, nên bạn có thể chuyển đổi tài khoản trong danh sách thả xuống “Tài khoản” trong tab “Triển khai & Chạy giao dịch”. Khi bạn đã chọn một tài khoản, hãy nhấp vào chức năng registerVoter. Lặp lại bước này cho mỗi tài khoản bạn muốn đăng ký làm cử tri.
  4. Thêm đề xuất: Để thêm đề xuất, hãy tìm hàm addProposal. Nhập tên đề xuất vào hộp nhập bên cạnh chức năng và nhấp vào chức năng. Lặp lại bước này cho mỗi đề xuất bạn muốn thêm.
  5. Bỏ phiếu: Để bỏ phiếu, hãy chuyển sang tài khoản cử tri và tìm chức năng bỏ phiếu. Nhập chỉ mục của đề xuất (thứ tự bạn đã thêm, bắt đầu từ 0) mà bạn muốn bỏ phiếu vào hộp nhập bên cạnh chức năng và nhấp vào chức năng. Lặp lại bước này cho mỗi cử tri.
  6. Kiểm tra người chiến thắng: Sau khi tất cả cử tri đã bỏ phiếu, bạn có thể kiểm tra người chiến thắng. Tìm chức năng WinnerName và nhấp vào nó. Tên của đề xuất chiến thắng sẽ được hiển thị trong bảng điều khiển ở cuối màn hình.
  7. Hãy nhớ rằng, tất cả các hành động trong blockchain (bao gồm cả các hành động thử nghiệm trong Remix) đều là giao dịch. Bạn có thể mở rộng chi tiết giao dịch trong bảng điều khiển để xem thêm thông tin, như chi phí giao dịch và dữ liệu. Bạn nên kiểm tra thông tin này để hiểu rõ hơn cách hợp đồng của bạn tương tác với blockchain.

Trong bài học tiếp theo, chúng ta sẽ thảo luận về tương tác hợp đồng và ghi nhật ký sự kiện. Chúng ta sẽ tìm hiểu cách các hợp đồng có thể tương tác với nhau cũng như cách ghi nhật ký và giám sát các hoạt động trên blockchain. Chúc mừng bạn đã xây dựng được hệ thống bỏ phiếu phi tập trung đầu tiên trên Ethereum!

إخلاء المسؤولية
* ينطوي الاستثمار في العملات الرقمية على مخاطر كبيرة. فيرجى المتابعة بحذر. ولا تهدف الدورة التدريبية إلى تقديم المشورة الاستثمارية.
* تم إنشاء الدورة التدريبية من قبل المؤلف الذي انضم إلى مركز التعلّم في Gate. ويُرجى العلم أنّ أي رأي يشاركه المؤلف لا يمثّل مركز التعلّم في Gate.