เริ่มต้นด้วยการเพิ่มฟังก์ชัน winningProposal
ให้กับสัญญาของเรา ฟังก์ชันนี้จะวนซ้ำข้อเสนอทั้งหมดและส่งคืนข้อเสนอที่ได้รับการโหวตมากที่สุด นอกจากนี้ เราจะสร้างฟังก์ชัน winnerName
เพื่อส่งคืนชื่อของข้อเสนอที่ชนะ นี่คือสัญญาฉบับสุดท้ายของเรา:
ความแข็งแกร่ง
// SPDX-License-Identifier: GPL-3.0
ความแข็งแกร่งของ pragma >=0.7.0 <0.9.0; ผู้มีสิทธิเลือกตั้งสัญญา
ราย {
โครงสร้างบุคคล {
bool voted;
uint vote;
}
โครงสร้างข้อเสนอ {
string name;
uint voteCount;
}
ข้อเสนอ[] ข้อเสนอสาธารณะ;
การทำแผนที่ (ที่อยู่ => บุคคล) ผู้มีสิทธิเลือกตั้งสาธารณะ;
ฟังก์ชั่น registerVoter() สาธารณะ {
voters[msg.sender].voted = false;
}
ฟังก์ชั่น addProposal(หน่วยความจำสตริง _name) สาธารณะ {
proposals.push(Proposal(_name, 0));
}
ฟังก์ชั่นโหวต(uint _proposal) สาธารณะ {
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;
}
ฟังก์ชั่น winProposal() มุมมองสาธารณะส่งคืน (uint winProposal_) {
uint winingVoteCount = 0;
for (uint p = 0; p < allowances.length; p++) {
if (proposals[p].voteCount > winingVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
ฟังก์ชัน winname() ส่งคืนมุมมองสาธารณะ (หน่วยความจำสตริง winname_) {
winnerName_ = proposals[winningProposal()].name;
}
}
มาอธิบายสิ่งที่เพิ่มเติมใหม่กัน:
ฟังก์ชันข้อเสนอที่ชนะ: ฟังก์ชันนี้จะวนซ้ำข้อเสนอทั้งหมดและค้นหาข้อเสนอที่มีการนับคะแนนสูงสุด โดยจะส่งคืนดัชนีของข้อเสนอนี้ในอาร์เรย์ proposals
เป็นฟังก์ชัน view
ซึ่งหมายความว่าจะไม่แก้ไขสถานะของสัญญาและอ่านเฉพาะข้อมูลเท่านั้น
ฟังก์ชันชื่อผู้ชนะ: ฟังก์ชันนี้เรียกใช้ฟังก์ชัน winningProposal
เพื่อรับดัชนีของข้อเสนอที่ชนะ แล้วส่งคืนชื่อของข้อเสนอนี้
รวบรวมสัญญาของคุณโดยคลิกที่ไอคอน Solidity Compiler ที่แถบด้านข้างซ้าย จากนั้นคลิกที่ปุ่ม “Compile”
ปรับใช้สัญญาของคุณในแท็บ "ปรับใช้และเรียกใช้ธุรกรรม" และโต้ตอบกับสัญญา ลงทะเบียนผู้มีสิทธิ์ลงคะแนน เพิ่มข้อเสนอ ลงคะแนนเสียง และสุดท้าย ตรวจสอบผู้ชนะ
ในบทถัดไป เราจะพูดถึงการโต้ตอบตามสัญญาและการบันทึกเหตุการณ์ เราจะเรียนรู้ว่าสัญญาสามารถโต้ตอบกันได้อย่างไร และวิธีการบันทึกและตรวจสอบกิจกรรมบนบล็อกเชน ขอแสดงความยินดีกับการสร้างระบบการลงคะแนนแบบกระจายอำนาจระบบแรกของคุณบน Ethereum!
เริ่มต้นด้วยการเพิ่มฟังก์ชัน winningProposal
ให้กับสัญญาของเรา ฟังก์ชันนี้จะวนซ้ำข้อเสนอทั้งหมดและส่งคืนข้อเสนอที่ได้รับการโหวตมากที่สุด นอกจากนี้ เราจะสร้างฟังก์ชัน winnerName
เพื่อส่งคืนชื่อของข้อเสนอที่ชนะ นี่คือสัญญาฉบับสุดท้ายของเรา:
ความแข็งแกร่ง
// SPDX-License-Identifier: GPL-3.0
ความแข็งแกร่งของ pragma >=0.7.0 <0.9.0; ผู้มีสิทธิเลือกตั้งสัญญา
ราย {
โครงสร้างบุคคล {
bool voted;
uint vote;
}
โครงสร้างข้อเสนอ {
string name;
uint voteCount;
}
ข้อเสนอ[] ข้อเสนอสาธารณะ;
การทำแผนที่ (ที่อยู่ => บุคคล) ผู้มีสิทธิเลือกตั้งสาธารณะ;
ฟังก์ชั่น registerVoter() สาธารณะ {
voters[msg.sender].voted = false;
}
ฟังก์ชั่น addProposal(หน่วยความจำสตริง _name) สาธารณะ {
proposals.push(Proposal(_name, 0));
}
ฟังก์ชั่นโหวต(uint _proposal) สาธารณะ {
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;
}
ฟังก์ชั่น winProposal() มุมมองสาธารณะส่งคืน (uint winProposal_) {
uint winingVoteCount = 0;
for (uint p = 0; p < allowances.length; p++) {
if (proposals[p].voteCount > winingVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
ฟังก์ชัน winname() ส่งคืนมุมมองสาธารณะ (หน่วยความจำสตริง winname_) {
winnerName_ = proposals[winningProposal()].name;
}
}
มาอธิบายสิ่งที่เพิ่มเติมใหม่กัน:
ฟังก์ชันข้อเสนอที่ชนะ: ฟังก์ชันนี้จะวนซ้ำข้อเสนอทั้งหมดและค้นหาข้อเสนอที่มีการนับคะแนนสูงสุด โดยจะส่งคืนดัชนีของข้อเสนอนี้ในอาร์เรย์ proposals
เป็นฟังก์ชัน view
ซึ่งหมายความว่าจะไม่แก้ไขสถานะของสัญญาและอ่านเฉพาะข้อมูลเท่านั้น
ฟังก์ชันชื่อผู้ชนะ: ฟังก์ชันนี้เรียกใช้ฟังก์ชัน winningProposal
เพื่อรับดัชนีของข้อเสนอที่ชนะ แล้วส่งคืนชื่อของข้อเสนอนี้
รวบรวมสัญญาของคุณโดยคลิกที่ไอคอน Solidity Compiler ที่แถบด้านข้างซ้าย จากนั้นคลิกที่ปุ่ม “Compile”
ปรับใช้สัญญาของคุณในแท็บ "ปรับใช้และเรียกใช้ธุรกรรม" และโต้ตอบกับสัญญา ลงทะเบียนผู้มีสิทธิ์ลงคะแนน เพิ่มข้อเสนอ ลงคะแนนเสียง และสุดท้าย ตรวจสอบผู้ชนะ
ในบทถัดไป เราจะพูดถึงการโต้ตอบตามสัญญาและการบันทึกเหตุการณ์ เราจะเรียนรู้ว่าสัญญาสามารถโต้ตอบกันได้อย่างไร และวิธีการบันทึกและตรวจสอบกิจกรรมบนบล็อกเชน ขอแสดงความยินดีกับการสร้างระบบการลงคะแนนแบบกระจายอำนาจระบบแรกของคุณบน Ethereum!