Lição 2

การดำเนินการลงทะเบียนผู้มีสิทธิเลือกตั้งและการลงคะแนนเสียง

ในบทนี้ เราจะพัฒนาระบบการลงคะแนนแบบกระจายอำนาจของเราต่อไปโดยการนำฟังก์ชันสำหรับการลงทะเบียนผู้มีสิทธิเลือกตั้งและการลงคะแนนเสียงไปใช้ เราจะเริ่มต้นด้วยการขยายสัญญา Voter ของเรา จากนั้นเจาะลึกรายละเอียดของการแมปและอาร์เรย์ของ Solidity

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

เราจะเพิ่มระบบข้อเสนอและตัวเลือกสำหรับผู้ลงคะแนนเสียงที่ลงทะเบียนแล้วในการลงคะแนนเสียง สำหรับสิ่งนี้ เราจะต้องมีอาร์เรย์เพื่อจัดเก็บข้อเสนอและมีฟังก์ชันใหม่สำหรับการลงคะแนน

ในสัญญา Voter ให้เพิ่มบรรทัดโค้ดต่อไปนี้:

ความแข็งแกร่ง 
 // SPDX-License-Identifier: GPL-3.0 
 ความแข็งแกร่งของ pragma >=0.7.0 <0.9.0; ผู้มีสิทธิเลือกตั้งสัญญา 

 ราย { 
 โครงสร้างบุคคล {
        bool voted;  
        uint vote;   
    }

    โครงสร้างข้อเสนอ {
        string name;   
        uint voteCount; 
    }

    ข้อเสนอ[] ข้อเสนอสาธารณะ; 
 การทำแผนที่ (ที่อยู่ => บุคคล) ผู้มีสิทธิเลือกตั้งสาธารณะ; 

 ฟังก์ชั่น registerVoter() public {
        voters[msg.sender].voted = false;
    }

    ฟังก์ชั่น addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    ฟังก์ชั่น 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; 
    }
}

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

มาแจกแจงรหัสใหม่:

  1. โครงสร้างข้อเสนอ: เราได้เพิ่มโครงสร้างใหม่ Proposal ซึ่งมีชื่อของข้อเสนอและจำนวนคะแนนที่ได้รับ

  2. อาร์เรย์ข้อเสนอ: อาร์เรย์ proposals จะเก็บข้อเสนอทั้งหมดไว้ในระบบการลงคะแนน

  3. เพิ่มฟังก์ชันข้อเสนอ: ฟังก์ชั่น addProposal ช่วยให้เราสามารถเพิ่มข้อเสนอใหม่ลงในอาร์เรย์ proposals ได้ ชื่อข้อเสนอถูกส่งเป็นพารามิเตอร์ และเริ่มนับคะแนนเป็นศูนย์

  4. ฟังก์ชั่นการลงคะแนนเสียง: ฟังก์ชั่น vote ช่วยให้ผู้ลงคะแนนเสียงที่ลงทะเบียนสามารถลงคะแนนเสียงได้ ใช้ดัชนีของข้อเสนอเป็นพารามิเตอร์และเพิ่มจำนวนคะแนนของข้อเสนอหนึ่งรายการ นอกจากนี้ยังตรวจสอบว่าผู้ลงคะแนนเสียงได้ลงคะแนนแล้วและอัปเดตสถานะของผู้ลงคะแนนเสียง

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

ตอนนี้เราได้เพิ่มคุณสมบัติเพิ่มเติมให้กับสัญญาของเราแล้ว ก็ถึงเวลารวบรวมและทดสอบ ใน Remix IDE ให้คลิกที่ไอคอนคอมไพเลอร์ Solidity ที่แถบด้านข้างซ้าย จากนั้นคลิกที่ปุ่ม "คอมไพล์"

หากต้องการทดสอบสัญญาของคุณ ไปที่แท็บ “ปรับใช้และเรียกใช้ธุรกรรม” (แท็บด้านล่างไอคอนคอมไพเลอร์ Solidity) และคลิกที่ปุ่ม “ปรับใช้” เมื่อปรับใช้สัญญาแล้ว คุณสามารถโต้ตอบกับสัญญาได้โดยการเรียกใช้ฟังก์ชันจากแท็บนี้ ลองลงทะเบียนผู้มีสิทธิเลือกตั้ง เพิ่มข้อเสนอ และลงคะแนนเสียงเพื่อดูว่ามันทำงานอย่างไร

ในบทถัดไป เราจะใช้ฟังก์ชันในการนับคะแนนเสียงและประกาศผลกระบวนการลงคะแนน ในระหว่างนี้ คุณสามารถสำรวจและทดลองสัญญาได้ตามใจชอบ Solidity นำเสนอคุณสมบัติอื่นๆ อีกมากมายที่สามารถทำให้สัญญาของคุณแข็งแกร่งและปลอดภัยยิ่งขึ้น ขอให้มีความสุขในการเขียนโค้ด!

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.
Catálogo
Lição 2

การดำเนินการลงทะเบียนผู้มีสิทธิเลือกตั้งและการลงคะแนนเสียง

ในบทนี้ เราจะพัฒนาระบบการลงคะแนนแบบกระจายอำนาจของเราต่อไปโดยการนำฟังก์ชันสำหรับการลงทะเบียนผู้มีสิทธิเลือกตั้งและการลงคะแนนเสียงไปใช้ เราจะเริ่มต้นด้วยการขยายสัญญา Voter ของเรา จากนั้นเจาะลึกรายละเอียดของการแมปและอาร์เรย์ของ Solidity

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

เราจะเพิ่มระบบข้อเสนอและตัวเลือกสำหรับผู้ลงคะแนนเสียงที่ลงทะเบียนแล้วในการลงคะแนนเสียง สำหรับสิ่งนี้ เราจะต้องมีอาร์เรย์เพื่อจัดเก็บข้อเสนอและมีฟังก์ชันใหม่สำหรับการลงคะแนน

ในสัญญา Voter ให้เพิ่มบรรทัดโค้ดต่อไปนี้:

ความแข็งแกร่ง 
 // SPDX-License-Identifier: GPL-3.0 
 ความแข็งแกร่งของ pragma >=0.7.0 <0.9.0; ผู้มีสิทธิเลือกตั้งสัญญา 

 ราย { 
 โครงสร้างบุคคล {
        bool voted;  
        uint vote;   
    }

    โครงสร้างข้อเสนอ {
        string name;   
        uint voteCount; 
    }

    ข้อเสนอ[] ข้อเสนอสาธารณะ; 
 การทำแผนที่ (ที่อยู่ => บุคคล) ผู้มีสิทธิเลือกตั้งสาธารณะ; 

 ฟังก์ชั่น registerVoter() public {
        voters[msg.sender].voted = false;
    }

    ฟังก์ชั่น addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    ฟังก์ชั่น 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; 
    }
}

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

มาแจกแจงรหัสใหม่:

  1. โครงสร้างข้อเสนอ: เราได้เพิ่มโครงสร้างใหม่ Proposal ซึ่งมีชื่อของข้อเสนอและจำนวนคะแนนที่ได้รับ

  2. อาร์เรย์ข้อเสนอ: อาร์เรย์ proposals จะเก็บข้อเสนอทั้งหมดไว้ในระบบการลงคะแนน

  3. เพิ่มฟังก์ชันข้อเสนอ: ฟังก์ชั่น addProposal ช่วยให้เราสามารถเพิ่มข้อเสนอใหม่ลงในอาร์เรย์ proposals ได้ ชื่อข้อเสนอถูกส่งเป็นพารามิเตอร์ และเริ่มนับคะแนนเป็นศูนย์

  4. ฟังก์ชั่นการลงคะแนนเสียง: ฟังก์ชั่น vote ช่วยให้ผู้ลงคะแนนเสียงที่ลงทะเบียนสามารถลงคะแนนเสียงได้ ใช้ดัชนีของข้อเสนอเป็นพารามิเตอร์และเพิ่มจำนวนคะแนนของข้อเสนอหนึ่งรายการ นอกจากนี้ยังตรวจสอบว่าผู้ลงคะแนนเสียงได้ลงคะแนนแล้วและอัปเดตสถานะของผู้ลงคะแนนเสียง

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

ตอนนี้เราได้เพิ่มคุณสมบัติเพิ่มเติมให้กับสัญญาของเราแล้ว ก็ถึงเวลารวบรวมและทดสอบ ใน Remix IDE ให้คลิกที่ไอคอนคอมไพเลอร์ Solidity ที่แถบด้านข้างซ้าย จากนั้นคลิกที่ปุ่ม "คอมไพล์"

หากต้องการทดสอบสัญญาของคุณ ไปที่แท็บ “ปรับใช้และเรียกใช้ธุรกรรม” (แท็บด้านล่างไอคอนคอมไพเลอร์ Solidity) และคลิกที่ปุ่ม “ปรับใช้” เมื่อปรับใช้สัญญาแล้ว คุณสามารถโต้ตอบกับสัญญาได้โดยการเรียกใช้ฟังก์ชันจากแท็บนี้ ลองลงทะเบียนผู้มีสิทธิเลือกตั้ง เพิ่มข้อเสนอ และลงคะแนนเสียงเพื่อดูว่ามันทำงานอย่างไร

ในบทถัดไป เราจะใช้ฟังก์ชันในการนับคะแนนเสียงและประกาศผลกระบวนการลงคะแนน ในระหว่างนี้ คุณสามารถสำรวจและทดลองสัญญาได้ตามใจชอบ Solidity นำเสนอคุณสมบัติอื่นๆ อีกมากมายที่สามารถทำให้สัญญาของคุณแข็งแกร่งและปลอดภัยยิ่งขึ้น ขอให้มีความสุขในการเขียนโค้ด!

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.