การลงคะแนนแบบกระจายอำนาจหมายถึงระบบการลงคะแนนที่ทำงานบนบล็อกเชน แนวคิดหลักในที่นี้คือการใช้ประโยชน์จากความโปร่งใส ความปลอดภัย และความเปลี่ยนแปลงไม่ได้ที่ได้รับจากเทคโนโลยีบล็อกเชน เพื่อสร้างระบบการลงคะแนนเสียงที่ยากต่อการจัดการและง่ายต่อการตรวจสอบ
ในระบบการลงคะแนนแบบกระจายอำนาจ การลงคะแนนแต่ละครั้งเป็นธุรกรรมบนบล็อกเชนที่ผู้เข้าร่วมทุกคนสามารถมองเห็นได้ แต่มีเพียงผู้มีสิทธิเลือกตั้งเท่านั้นที่สามารถแก้ไขได้จนกว่าจะมีการลงคะแนน เมื่อลงคะแนนแล้ว มันจะถูกบันทึกไว้ในบล็อกเชนและไม่สามารถเปลี่ยนแปลงได้ จึงเป็นกลไกการลงคะแนนที่โปร่งใสและป้องกันการงัดแงะ
Remix IDE (Integrated Development Environment) เป็นเครื่องมือโอเพ่นซอร์สที่ทรงพลังซึ่งออกแบบมาโดยเฉพาะสำหรับการพัฒนาสัญญาอัจฉริยะ Ethereum มันทำงานโดยตรงในเว็บเบราว์เซอร์ของคุณ ดังนั้นคุณไม่จำเป็นต้องติดตั้งอะไรลงในคอมพิวเตอร์ของคุณ
คุณสามารถเข้าถึง Remix IDE ได้ที่ https://remix.ethereum.org เมื่อคุณเปิด Remix ในเบราว์เซอร์ คุณจะพบแผงสามแผง:
แผงด้านซ้าย: นี่คือที่ที่คุณสามารถสร้าง นำเข้า และจัดการไฟล์ Solidity ของคุณได้ นอกจากนี้ยังมีปลั๊กอินต่างๆ สำหรับการคอมไพล์ ทดสอบ ดีบัก และปรับใช้สัญญาของคุณ
แผงกลาง: นี่คือเครื่องมือแก้ไขโค้ดของคุณ ที่นี่คุณจะเขียนและแก้ไขโค้ด Solidity ของคุณ
แผงด้านขวา: แผงนี้มีเครื่องมือต่างๆ ในการรวบรวมสัญญาของคุณ ปรับใช้บนเครือข่าย Ethereum (ไม่ว่าจะบนเครือข่าย Ethereum จริงหรือการจำลอง JavaScript VM) และโต้ตอบกับสัญญาที่ปรับใช้ของคุณ
เรามาเริ่มกันด้วยสัญญา "ผู้ลงคะแนนเสียง" ง่ายๆ สัญญานี้จะติดตามผู้ลงคะแนนเสียงในระบบของเรา
ใน Remix IDE ไปที่ “File Explorer” และคลิกที่ไอคอน “+” เพื่อสร้างไฟล์ใหม่ ตั้งชื่อมันว่า Voter.sol
ตอนนี้เรามาเริ่มเขียนสัญญาของเรากันดีกว่า:
ความแข็งแกร่ง
// SPDX-License-Identifier: GPL-3.0
ความแข็งแกร่งของ pragma >=0.7.0 <0.9.0;
ผู้มีสิทธิเลือกตั้งในสัญญา {
// โครงสร้างเพื่อเป็นตัวแทนของบุคคล
โครงสร้างบุคคล {
bool voted; // if true, that person already voted
uint vote; // index of the voted proposal
}
// การทำแผนที่เพื่อติดตามผู้มีสิทธิเลือกตั้งทั้งหมด
การทำแผนที่ (ที่อยู่ => บุคคล) ผู้มีสิทธิเลือกตั้งสาธารณะ;
// ฟังก์ชั่นในการลงทะเบียนผู้มีสิทธิเลือกตั้ง
ฟังก์ชั่น registerVoter() สาธารณะ {
voters[msg.sender].voted = false;
}
}
ตัวระบุใบอนุญาต SPDX: บรรทัด // SPDX-License-Identifier: GPL-3.0
ระบุว่าสัญญาของเราใช้ GNU General Public License v3.0 นี่คือสิทธิ์การใช้งานซอฟต์แวร์ฟรีที่ใช้กันทั่วไปซึ่งรับประกันว่าผู้ใช้จะมีอิสระในการใช้งาน ศึกษา แบ่งปัน และแก้ไขซอฟต์แวร์
Pragma Directive: pragma solidity >=0.7.0 <0.9.0;
คำสั่งระบุว่าสัญญาเขียนในเวอร์ชันของ Solidity ที่มากกว่าหรือเท่ากับ 0.7.0 และน้อยกว่า 0.9.0 ช่วยป้องกันไม่ให้สัญญาถูกคอมไพล์ด้วยคอมไพเลอร์เวอร์ชันใหม่กว่าที่เข้ากันไม่ได้
คำจำกัดความของสัญญา: บล็อก contract Voter {...}
กำหนดสัญญาใหม่ชื่อ Voter
นี่คือที่ที่เราระบุตัวแปรสถานะและฟังก์ชันของสัญญา
คำจำกัดความของโครงสร้าง: ภายในสัญญา เรากำหนดโครงสร้าง Person
ที่แสดงถึงบุคคลในระบบการลงคะแนนของเรา แต่ละ Person
มีบูลีน voted
ซึ่งบ่งชี้ว่าพวกเขาได้โหวตแล้วหรือไม่ และมีจำนวนเต็ม vote
ที่คอยติดตามข้อเสนอที่พวกเขาโหวตให้
ตัวแปรสถานะ: mapping(address => Person) public voters;
คำสั่งประกาศผู้มีสิทธิ voters
ตัวแปรสถานะที่สร้างการเชื่อมโยงระหว่างที่อยู่ Ethereum และโครงสร้าง Person
ซึ่งจะทำให้เราสามารถติดตามได้ว่าใครมีสิทธิ์ลงคะแนนเสียงในระบบและลงคะแนนเสียงใดบ้าง คีย์เวิร์ด public
จะสร้างฟังก์ชัน getter สำหรับ voters
โดยอัตโนมัติ
คำจำกัดความของฟังก์ชัน: บล็อก function registerVoter() public {...}
กำหนดฟังก์ชันสาธารณะที่อนุญาตให้ผู้ใช้ลงทะเบียนตนเองเป็นผู้มีสิทธิเลือกตั้งในระบบ voters[msg.sender].voted = false;
คำสั่งกำหนดสถานะ voted
ของผู้มีสิทธิเลือกตั้งใหม่เป็น false
แค่นั้นแหละสำหรับสัญญานี้! เมื่อเราดำเนินการผ่านหลักสูตรนี้ เราจะขยายสัญญานี้โดยเพิ่มฟังก์ชันเพิ่มเติมสำหรับกระบวนการลงคะแนนเสียง อย่าลืมคอมไพล์และทดสอบโค้ดของคุณเป็นประจำเพื่อให้แน่ใจว่าทุกอย่างทำงานได้ตามที่คาดหวัง ใน Remix IDE คุณสามารถคอมไพล์สัญญาของคุณได้โดยคลิกที่ไอคอนคอมไพเลอร์ Solidity ที่แถบด้านข้างซ้าย (อันที่สามจากด้านบน) จากนั้นคลิกที่ปุ่ม "คอมไพล์"
ในบทถัดไป เราจะเรียนรู้วิธีอนุญาตให้ผู้ลงคะแนนที่ลงทะเบียนลงคะแนนเสียง และใช้ตรรกะสำหรับระบบการลงคะแนนเสียง แต่สำหรับตอนนี้ ลองพิจารณาสัญญาและทำความคุ้นเคยกับสภาพแวดล้อมของ Remix คุณเพิ่งก้าวเข้าสู่โลกแห่งการพัฒนาสัญญาอัจฉริยะ!
การลงคะแนนแบบกระจายอำนาจหมายถึงระบบการลงคะแนนที่ทำงานบนบล็อกเชน แนวคิดหลักในที่นี้คือการใช้ประโยชน์จากความโปร่งใส ความปลอดภัย และความเปลี่ยนแปลงไม่ได้ที่ได้รับจากเทคโนโลยีบล็อกเชน เพื่อสร้างระบบการลงคะแนนเสียงที่ยากต่อการจัดการและง่ายต่อการตรวจสอบ
ในระบบการลงคะแนนแบบกระจายอำนาจ การลงคะแนนแต่ละครั้งเป็นธุรกรรมบนบล็อกเชนที่ผู้เข้าร่วมทุกคนสามารถมองเห็นได้ แต่มีเพียงผู้มีสิทธิเลือกตั้งเท่านั้นที่สามารถแก้ไขได้จนกว่าจะมีการลงคะแนน เมื่อลงคะแนนแล้ว มันจะถูกบันทึกไว้ในบล็อกเชนและไม่สามารถเปลี่ยนแปลงได้ จึงเป็นกลไกการลงคะแนนที่โปร่งใสและป้องกันการงัดแงะ
Remix IDE (Integrated Development Environment) เป็นเครื่องมือโอเพ่นซอร์สที่ทรงพลังซึ่งออกแบบมาโดยเฉพาะสำหรับการพัฒนาสัญญาอัจฉริยะ Ethereum มันทำงานโดยตรงในเว็บเบราว์เซอร์ของคุณ ดังนั้นคุณไม่จำเป็นต้องติดตั้งอะไรลงในคอมพิวเตอร์ของคุณ
คุณสามารถเข้าถึง Remix IDE ได้ที่ https://remix.ethereum.org เมื่อคุณเปิด Remix ในเบราว์เซอร์ คุณจะพบแผงสามแผง:
แผงด้านซ้าย: นี่คือที่ที่คุณสามารถสร้าง นำเข้า และจัดการไฟล์ Solidity ของคุณได้ นอกจากนี้ยังมีปลั๊กอินต่างๆ สำหรับการคอมไพล์ ทดสอบ ดีบัก และปรับใช้สัญญาของคุณ
แผงกลาง: นี่คือเครื่องมือแก้ไขโค้ดของคุณ ที่นี่คุณจะเขียนและแก้ไขโค้ด Solidity ของคุณ
แผงด้านขวา: แผงนี้มีเครื่องมือต่างๆ ในการรวบรวมสัญญาของคุณ ปรับใช้บนเครือข่าย Ethereum (ไม่ว่าจะบนเครือข่าย Ethereum จริงหรือการจำลอง JavaScript VM) และโต้ตอบกับสัญญาที่ปรับใช้ของคุณ
เรามาเริ่มกันด้วยสัญญา "ผู้ลงคะแนนเสียง" ง่ายๆ สัญญานี้จะติดตามผู้ลงคะแนนเสียงในระบบของเรา
ใน Remix IDE ไปที่ “File Explorer” และคลิกที่ไอคอน “+” เพื่อสร้างไฟล์ใหม่ ตั้งชื่อมันว่า Voter.sol
ตอนนี้เรามาเริ่มเขียนสัญญาของเรากันดีกว่า:
ความแข็งแกร่ง
// SPDX-License-Identifier: GPL-3.0
ความแข็งแกร่งของ pragma >=0.7.0 <0.9.0;
ผู้มีสิทธิเลือกตั้งในสัญญา {
// โครงสร้างเพื่อเป็นตัวแทนของบุคคล
โครงสร้างบุคคล {
bool voted; // if true, that person already voted
uint vote; // index of the voted proposal
}
// การทำแผนที่เพื่อติดตามผู้มีสิทธิเลือกตั้งทั้งหมด
การทำแผนที่ (ที่อยู่ => บุคคล) ผู้มีสิทธิเลือกตั้งสาธารณะ;
// ฟังก์ชั่นในการลงทะเบียนผู้มีสิทธิเลือกตั้ง
ฟังก์ชั่น registerVoter() สาธารณะ {
voters[msg.sender].voted = false;
}
}
ตัวระบุใบอนุญาต SPDX: บรรทัด // SPDX-License-Identifier: GPL-3.0
ระบุว่าสัญญาของเราใช้ GNU General Public License v3.0 นี่คือสิทธิ์การใช้งานซอฟต์แวร์ฟรีที่ใช้กันทั่วไปซึ่งรับประกันว่าผู้ใช้จะมีอิสระในการใช้งาน ศึกษา แบ่งปัน และแก้ไขซอฟต์แวร์
Pragma Directive: pragma solidity >=0.7.0 <0.9.0;
คำสั่งระบุว่าสัญญาเขียนในเวอร์ชันของ Solidity ที่มากกว่าหรือเท่ากับ 0.7.0 และน้อยกว่า 0.9.0 ช่วยป้องกันไม่ให้สัญญาถูกคอมไพล์ด้วยคอมไพเลอร์เวอร์ชันใหม่กว่าที่เข้ากันไม่ได้
คำจำกัดความของสัญญา: บล็อก contract Voter {...}
กำหนดสัญญาใหม่ชื่อ Voter
นี่คือที่ที่เราระบุตัวแปรสถานะและฟังก์ชันของสัญญา
คำจำกัดความของโครงสร้าง: ภายในสัญญา เรากำหนดโครงสร้าง Person
ที่แสดงถึงบุคคลในระบบการลงคะแนนของเรา แต่ละ Person
มีบูลีน voted
ซึ่งบ่งชี้ว่าพวกเขาได้โหวตแล้วหรือไม่ และมีจำนวนเต็ม vote
ที่คอยติดตามข้อเสนอที่พวกเขาโหวตให้
ตัวแปรสถานะ: mapping(address => Person) public voters;
คำสั่งประกาศผู้มีสิทธิ voters
ตัวแปรสถานะที่สร้างการเชื่อมโยงระหว่างที่อยู่ Ethereum และโครงสร้าง Person
ซึ่งจะทำให้เราสามารถติดตามได้ว่าใครมีสิทธิ์ลงคะแนนเสียงในระบบและลงคะแนนเสียงใดบ้าง คีย์เวิร์ด public
จะสร้างฟังก์ชัน getter สำหรับ voters
โดยอัตโนมัติ
คำจำกัดความของฟังก์ชัน: บล็อก function registerVoter() public {...}
กำหนดฟังก์ชันสาธารณะที่อนุญาตให้ผู้ใช้ลงทะเบียนตนเองเป็นผู้มีสิทธิเลือกตั้งในระบบ voters[msg.sender].voted = false;
คำสั่งกำหนดสถานะ voted
ของผู้มีสิทธิเลือกตั้งใหม่เป็น false
แค่นั้นแหละสำหรับสัญญานี้! เมื่อเราดำเนินการผ่านหลักสูตรนี้ เราจะขยายสัญญานี้โดยเพิ่มฟังก์ชันเพิ่มเติมสำหรับกระบวนการลงคะแนนเสียง อย่าลืมคอมไพล์และทดสอบโค้ดของคุณเป็นประจำเพื่อให้แน่ใจว่าทุกอย่างทำงานได้ตามที่คาดหวัง ใน Remix IDE คุณสามารถคอมไพล์สัญญาของคุณได้โดยคลิกที่ไอคอนคอมไพเลอร์ Solidity ที่แถบด้านข้างซ้าย (อันที่สามจากด้านบน) จากนั้นคลิกที่ปุ่ม "คอมไพล์"
ในบทถัดไป เราจะเรียนรู้วิธีอนุญาตให้ผู้ลงคะแนนที่ลงทะเบียนลงคะแนนเสียง และใช้ตรรกะสำหรับระบบการลงคะแนนเสียง แต่สำหรับตอนนี้ ลองพิจารณาสัญญาและทำความคุ้นเคยกับสภาพแวดล้อมของ Remix คุณเพิ่งก้าวเข้าสู่โลกแห่งการพัฒนาสัญญาอัจฉริยะ!