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;
}
}
Hãy giải thích những bổ sung mới:
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.
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 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.
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!
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;
}
}
Hãy giải thích những bổ sung mới:
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.
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 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.
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!