第3课

การดำเนินการนับคะแนนเสียงและการประกาศผล

ในบทนี้ เราจะใช้ส่วนสุดท้ายของระบบการลงคะแนนแบบกระจายอำนาจของเรา: การนับคะแนนเสียงและการประกาศผล ซึ่งจะเกี่ยวข้องกับการขยายสัญญาผู้มีสิทธิเลือกตั้งของเราเป็นครั้งสุดท้าย และสร้างฟังก์ชันเพื่อคำนวณข้อเสนอที่ชนะ

การขยายสัญญาผู้มีสิทธิเลือกตั้ง

เริ่มต้นด้วยการเพิ่มฟังก์ชัน 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;
    }
}

ทำความเข้าใจกับหลักจรรยาบรรณ

มาอธิบายสิ่งที่เพิ่มเติมใหม่กัน:

  1. ฟังก์ชันข้อเสนอที่ชนะ: ฟังก์ชันนี้จะวนซ้ำข้อเสนอทั้งหมดและค้นหาข้อเสนอที่มีการนับคะแนนสูงสุด โดยจะส่งคืนดัชนีของข้อเสนอนี้ในอาร์เรย์ proposals เป็นฟังก์ชัน view ซึ่งหมายความว่าจะไม่แก้ไขสถานะของสัญญาและอ่านเฉพาะข้อมูลเท่านั้น

  2. ฟังก์ชันชื่อผู้ชนะ: ฟังก์ชันนี้เรียกใช้ฟังก์ชัน winningProposal เพื่อรับดัชนีของข้อเสนอที่ชนะ แล้วส่งคืนชื่อของข้อเสนอนี้

การรวบรวมและการทดสอบ

รวบรวมสัญญาของคุณโดยคลิกที่ไอคอน Solidity Compiler ที่แถบด้านข้างซ้าย จากนั้นคลิกที่ปุ่ม “Compile”

ปรับใช้สัญญาของคุณในแท็บ "ปรับใช้และเรียกใช้ธุรกรรม" และโต้ตอบกับสัญญา ลงทะเบียนผู้มีสิทธิ์ลงคะแนน เพิ่มข้อเสนอ ลงคะแนนเสียง และสุดท้าย ตรวจสอบผู้ชนะ

ทำอย่างไร:

  1. การปรับใช้: ขั้นแรก คลิกแท็บ “ปรับใช้และเรียกใช้ธุรกรรม” บน Remix IDE อยู่ด้านล่างไอคอนคอมไพเลอร์ Solidity ตรวจสอบให้แน่ใจว่าคุณอยู่ในสภาพแวดล้อม “JavaScript VM” จากนั้นคลิกปุ่ม "ปรับใช้"
  2. การลงทะเบียนผู้มีสิทธิเลือกตั้ง: เมื่อมีการใช้สัญญาแล้ว คุณจะเห็นสัญญาดังกล่าวในส่วน "สัญญาที่ปรับใช้" คลิกที่ลูกศรเพื่อขยาย คุณจะพบฟังก์ชั่นทั้งหมดของสัญญาของเราแสดงอยู่ในรายการ
  3. หากต้องการลงทะเบียนผู้มีสิทธิ์ลงคะแนน ให้ค้นหาฟังก์ชัน registerVoter เนื่องจากเราได้ตั้งโปรแกรมสัญญาของเราให้ลงทะเบียนบัญชีที่เรียกใช้ฟังก์ชันนี้ในฐานะผู้มีสิทธิเลือกตั้ง คุณสามารถสลับบัญชีได้ในเมนูแบบเลื่อนลง "บัญชี" ในแท็บ "ปรับใช้และดำเนินการธุรกรรม" เมื่อคุณเลือกบัญชีแล้ว คลิกฟังก์ชัน registerVoter ทำซ้ำขั้นตอนนี้สำหรับแต่ละบัญชีที่คุณต้องการลงทะเบียนเป็นผู้มีสิทธิเลือกตั้ง
  4. การเพิ่มข้อเสนอ: หากต้องการเพิ่มข้อเสนอ ให้ค้นหาฟังก์ชัน addProposal ป้อนชื่อข้อเสนอในช่องป้อนข้อมูลถัดจากฟังก์ชันแล้วคลิกฟังก์ชัน ทำซ้ำขั้นตอนนี้กับข้อเสนอแต่ละรายการที่คุณต้องการเพิ่ม
  5. การลงคะแนนเสียง: หากต้องการลงคะแนนเสียง ให้เปลี่ยนไปใช้บัญชีผู้มีสิทธิเลือกตั้งและค้นหาฟังก์ชันการลงคะแนนเสียง ป้อนดัชนีของข้อเสนอ (ลำดับที่คุณเพิ่ม โดยเริ่มจาก 0) ที่คุณต้องการลงคะแนนในช่องป้อนข้อมูลถัดจากฟังก์ชัน แล้วคลิกฟังก์ชัน ทำซ้ำขั้นตอนนี้สำหรับผู้ลงคะแนนเสียงแต่ละคน
  6. การตรวจสอบผู้ชนะ: หลังจากที่ผู้ลงคะแนนทั้งหมดได้ลงคะแนนแล้ว คุณสามารถตรวจสอบผู้ชนะได้ ค้นหาฟังก์ชัน winname และคลิกมัน ชื่อของข้อเสนอที่ชนะจะแสดงในคอนโซลที่ด้านล่างของหน้าจอ
  7. โปรดจำไว้ว่า การกระทำทั้งหมดในบล็อกเชน (รวมถึงการดำเนินการทดสอบใน Remix) ถือเป็นธุรกรรม คุณขยายรายละเอียดธุรกรรมในคอนโซลเพื่อดูข้อมูลเพิ่มเติมได้ เช่น ต้นทุนธุรกรรมและข้อมูล เป็นวิธีปฏิบัติที่ดีในการตรวจสอบข้อมูลนี้เพื่อทำความเข้าใจให้ดีขึ้นว่าสัญญาของคุณโต้ตอบกับบล็อกเชนอย่างไร

ในบทถัดไป เราจะพูดถึงการโต้ตอบตามสัญญาและการบันทึกเหตุการณ์ เราจะเรียนรู้ว่าสัญญาสามารถโต้ตอบกันได้อย่างไร และวิธีการบันทึกและตรวจสอบกิจกรรมบนบล็อกเชน ขอแสดงความยินดีกับการสร้างระบบการลงคะแนนแบบกระจายอำนาจระบบแรกของคุณบน Ethereum!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。
目录
第3课

การดำเนินการนับคะแนนเสียงและการประกาศผล

ในบทนี้ เราจะใช้ส่วนสุดท้ายของระบบการลงคะแนนแบบกระจายอำนาจของเรา: การนับคะแนนเสียงและการประกาศผล ซึ่งจะเกี่ยวข้องกับการขยายสัญญาผู้มีสิทธิเลือกตั้งของเราเป็นครั้งสุดท้าย และสร้างฟังก์ชันเพื่อคำนวณข้อเสนอที่ชนะ

การขยายสัญญาผู้มีสิทธิเลือกตั้ง

เริ่มต้นด้วยการเพิ่มฟังก์ชัน 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;
    }
}

ทำความเข้าใจกับหลักจรรยาบรรณ

มาอธิบายสิ่งที่เพิ่มเติมใหม่กัน:

  1. ฟังก์ชันข้อเสนอที่ชนะ: ฟังก์ชันนี้จะวนซ้ำข้อเสนอทั้งหมดและค้นหาข้อเสนอที่มีการนับคะแนนสูงสุด โดยจะส่งคืนดัชนีของข้อเสนอนี้ในอาร์เรย์ proposals เป็นฟังก์ชัน view ซึ่งหมายความว่าจะไม่แก้ไขสถานะของสัญญาและอ่านเฉพาะข้อมูลเท่านั้น

  2. ฟังก์ชันชื่อผู้ชนะ: ฟังก์ชันนี้เรียกใช้ฟังก์ชัน winningProposal เพื่อรับดัชนีของข้อเสนอที่ชนะ แล้วส่งคืนชื่อของข้อเสนอนี้

การรวบรวมและการทดสอบ

รวบรวมสัญญาของคุณโดยคลิกที่ไอคอน Solidity Compiler ที่แถบด้านข้างซ้าย จากนั้นคลิกที่ปุ่ม “Compile”

ปรับใช้สัญญาของคุณในแท็บ "ปรับใช้และเรียกใช้ธุรกรรม" และโต้ตอบกับสัญญา ลงทะเบียนผู้มีสิทธิ์ลงคะแนน เพิ่มข้อเสนอ ลงคะแนนเสียง และสุดท้าย ตรวจสอบผู้ชนะ

ทำอย่างไร:

  1. การปรับใช้: ขั้นแรก คลิกแท็บ “ปรับใช้และเรียกใช้ธุรกรรม” บน Remix IDE อยู่ด้านล่างไอคอนคอมไพเลอร์ Solidity ตรวจสอบให้แน่ใจว่าคุณอยู่ในสภาพแวดล้อม “JavaScript VM” จากนั้นคลิกปุ่ม "ปรับใช้"
  2. การลงทะเบียนผู้มีสิทธิเลือกตั้ง: เมื่อมีการใช้สัญญาแล้ว คุณจะเห็นสัญญาดังกล่าวในส่วน "สัญญาที่ปรับใช้" คลิกที่ลูกศรเพื่อขยาย คุณจะพบฟังก์ชั่นทั้งหมดของสัญญาของเราแสดงอยู่ในรายการ
  3. หากต้องการลงทะเบียนผู้มีสิทธิ์ลงคะแนน ให้ค้นหาฟังก์ชัน registerVoter เนื่องจากเราได้ตั้งโปรแกรมสัญญาของเราให้ลงทะเบียนบัญชีที่เรียกใช้ฟังก์ชันนี้ในฐานะผู้มีสิทธิเลือกตั้ง คุณสามารถสลับบัญชีได้ในเมนูแบบเลื่อนลง "บัญชี" ในแท็บ "ปรับใช้และดำเนินการธุรกรรม" เมื่อคุณเลือกบัญชีแล้ว คลิกฟังก์ชัน registerVoter ทำซ้ำขั้นตอนนี้สำหรับแต่ละบัญชีที่คุณต้องการลงทะเบียนเป็นผู้มีสิทธิเลือกตั้ง
  4. การเพิ่มข้อเสนอ: หากต้องการเพิ่มข้อเสนอ ให้ค้นหาฟังก์ชัน addProposal ป้อนชื่อข้อเสนอในช่องป้อนข้อมูลถัดจากฟังก์ชันแล้วคลิกฟังก์ชัน ทำซ้ำขั้นตอนนี้กับข้อเสนอแต่ละรายการที่คุณต้องการเพิ่ม
  5. การลงคะแนนเสียง: หากต้องการลงคะแนนเสียง ให้เปลี่ยนไปใช้บัญชีผู้มีสิทธิเลือกตั้งและค้นหาฟังก์ชันการลงคะแนนเสียง ป้อนดัชนีของข้อเสนอ (ลำดับที่คุณเพิ่ม โดยเริ่มจาก 0) ที่คุณต้องการลงคะแนนในช่องป้อนข้อมูลถัดจากฟังก์ชัน แล้วคลิกฟังก์ชัน ทำซ้ำขั้นตอนนี้สำหรับผู้ลงคะแนนเสียงแต่ละคน
  6. การตรวจสอบผู้ชนะ: หลังจากที่ผู้ลงคะแนนทั้งหมดได้ลงคะแนนแล้ว คุณสามารถตรวจสอบผู้ชนะได้ ค้นหาฟังก์ชัน winname และคลิกมัน ชื่อของข้อเสนอที่ชนะจะแสดงในคอนโซลที่ด้านล่างของหน้าจอ
  7. โปรดจำไว้ว่า การกระทำทั้งหมดในบล็อกเชน (รวมถึงการดำเนินการทดสอบใน Remix) ถือเป็นธุรกรรม คุณขยายรายละเอียดธุรกรรมในคอนโซลเพื่อดูข้อมูลเพิ่มเติมได้ เช่น ต้นทุนธุรกรรมและข้อมูล เป็นวิธีปฏิบัติที่ดีในการตรวจสอบข้อมูลนี้เพื่อทำความเข้าใจให้ดีขึ้นว่าสัญญาของคุณโต้ตอบกับบล็อกเชนอย่างไร

ในบทถัดไป เราจะพูดถึงการโต้ตอบตามสัญญาและการบันทึกเหตุการณ์ เราจะเรียนรู้ว่าสัญญาสามารถโต้ตอบกันได้อย่างไร และวิธีการบันทึกและตรวจสอบกิจกรรมบนบล็อกเชน ขอแสดงความยินดีกับการสร้างระบบการลงคะแนนแบบกระจายอำนาจระบบแรกของคุณบน Ethereum!

免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻Gate Learn的作者创作,观点仅代表作者本人,绝不代表Gate Learn赞同其观点或证实其描述。