Lección 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!

Descargo de responsabilidad
* La inversión en criptomonedas implica riesgos significativos. Proceda con precaución. El curso no pretende ser un asesoramiento de inversión.
* El curso ha sido creado por el autor que se ha unido a Gate Learn. Cualquier opinión compartida por el autor no representa a Gate Learn.
Catálogo
Lección 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!

Descargo de responsabilidad
* La inversión en criptomonedas implica riesgos significativos. Proceda con precaución. El curso no pretende ser un asesoramiento de inversión.
* El curso ha sido creado por el autor que se ha unido a Gate Learn. Cualquier opinión compartida por el autor no representa a Gate Learn.
It seems that you are attempting to access our services from a Restricted Location where Gate.io is unable to provide services. We apologize for any inconvenience this may cause. Currently, the Restricted Locations include but not limited to: the United States of America, Canada, Cambodia, Thailand, Cuba, Iran, North Korea and so on. For more information regarding the Restricted Locations, please refer to the User Agreement. Should you have any other questions, please contact our Customer Support Team.