ตัวอย่างการทำระบบเลือกตั้งบน Blockchain โดยใช้ Stellar’s Smart Contract

Anonymous
Dcen.io
Published in
6 min readMay 3, 2018

ทุกวันนี้ Blockchain ไม่ได้มีเพียงแค่ Cryptocurrency ที่เรารู้จักกันเท่านั้น แต่ Blockchain สามารถนำมาประยุกต์ทำเป็นระบบได้ค่อนข้างหลากหลายมากๆ โดยหลายๆคนนำข้อดีของ Blockchain มาช่วยแก้ปัญหาๆหลายๆอย่างที่ระบบปัจจุบันสามารถแก้ได้ยาก วันนี้เราจะมาลองทำระบบเลือกตั้งบน Stellar ด้วย Smart Contract แบบง่ายๆกันดูนะครับ

Stellar Smart Contract

ก่อนอื่นมาทำความเข้าใจ Smart Contract กันก่อน ตัว Stellar นั้นออกแบบ Smart Contract มาไม่เหมือนกันตัว Ethereum ที่เป็นแบบ Turing-Complete แต่มันออกแบบมาให้สามารถทำ Smart Contract ได้ง่ายกว่ามากๆ ( แต่ก็แลกมาด้วยข้อจำกัดหลายๆอย่างที่ทำไม่ได้เหมือน Ethereum )

Smart Contract บน Stellar นั้นออกแบบมาให้สามารถสร้างรายการไว้รอล่วงหน้าได้ก่อน และใช้หลักการง่ายๆ ซึ่งประกอบด้วย

  • Multi-signature ใน Account ที่เราทำนั้น สามารถกำหนดให้ต้องใช้หลายลายเซ็นในการทำรายการ พร้อมทั้งกำหนดน้ำหนักของแต่ละลายเซ็นได้ด้วย
  • Batching/Atomicity ในรายการหนึ่งที่เราส่งเข้าไปนั้น เราสามารถส่งไปได้หลายคำสั่งพร้อมกัน (Batching) และหากคำสั่งไหนเกิดข้อผิดพลาด ระบบก็จะยกเลิกการทำรายการที่ส่งมาด้วยกันทั้งหมดไปให้ด้วย (Atomicity)
  • Sequence รายการของ Stellar สามารถระบุเลข Seq ไปด้วยได้ หากรายการใหม่ที่ส่งเข้าไปเลข Seq ซ้ำหรือก่อนหน้ารายการที่ทำไปล่าสุดของคนๆนั้น ก็จะยกเลิกการทำรายการใหม่ให้อัตโนมัติ
  • Time Bound เราสามารถกำหนดเวลาให้กับรายการนั้นว่า หากส่งเข้ามาในระบบในช่วงเวลานี้เท่านั้น ระบบถึงจะมองว่าเป็นรายการที่ถูกต้องที่จะนำไปประมวลผลเข้าระบบต่อไป

โดย Smart Contract ของ Stellar นั้นใช้การทำ Transaction ไว้ล่วงหน้า โดยสามารถดำเนินการอะไรก็ได้ และกำหนดเวลาที่ให้รายการนั้นสามารถส่งไปรันบนระบบได้ ยกตัวอย่างง่ายๆ เช่น ระบบว่าจ้างผู้รับเหมาก่อสร้าง ที่ฝั่งลูกค้าก็ต้องการการันตีว่างานออกมาเสร็จเรียบร้อย จึงจะโอนเงินไปให้ผู้รับเหมาได้โดยอัตโนมัติ และผู้รับเหมาก็ต้องการวางใจ ว่าลูกค้าจะมีเงินพอที่จะจ่ายตามที่ตกลงกันไว้ เราจะยกตัวอย่าง เมื่อลูกค้าต้องการสร้างบ้าน มูลค่า 100,000 บาท

  • ลูกค้าและผู้รับเหมาสร้างบัญชีขึ้นมาใหม่เฉพาะงานนี้ เป็นบัญชีร่วม ต้องใช้กุญแจจากทั้งลูกค้าและผู้รับเหมาพร้อมกันเท่านั้นถึงจะดำเนินการกับเงินในบัญชีได้ ให้ชื่อว่าบัญชีร่วม
  • บัญชีร่วมออกเหรียญใหม่ชื่อ ApproveCoin แล้วโอนให้กับลูกค้าจำนวน 100 เหรียญ เพื่อใช้สำหรับอัพเดต Progress ของงาน เป็นเหรียญเฉพาะงานนี้เท่านั้น เช่น ผู้รับเหมาอัพเดตงานผ่าน 15% ลูกค้าตรวจแล้วโอน ก็จะโอนเหรียญนี้เข้าบัญชีกลาง 15 เหรียญ เป็นต้น
  • ลูกค้าโอนเงินเข้าไปยังบัญชีกลาง 100,000 บาท เพื่อใช้โอนเป็นค่าจ้างในการก่อสร้าง
  • ตกลงกับผู้รับเหมาเรื่องเวลา เช่นให้เวลา 60 ในการสร้าง ตรวจรับงานอีก 15 วัน ถ้าหลังจากต้องคืนเงินให้ลูกค้าแล้วตกลงกันใหม่อีกที

คราวนี้ก็จะเริ่มเข้าสู่ขั้นตอนทำ Smart Contract

  • บัญชีกลางสร้างสัญญา 2 รายการ โดยเป็นรายการที่ตั้งการกระทำไว้ล่วงหน้า
  • รายการที่ 1 คือเมื่องานเสร็จเรียบร้อยดี ให้โอนเงิน 100,000 บาทและเหรียญ ApproveCoin จำนวน 100 เหรียญ จากบัญชีกลาง ไปยังบัญชีของผู้รับเหมา เป็นอันจบพิธี โดยรายการนี้จะ Valid ก็ต่อเมื่ออยู่ในช่วงระยะเวลา 60 วันหลังระยะการก่อสร้างถึงหลังจากนั้นอีก 15 วันเท่านั้น ( ตามหลักการ Time Bound ) และหากบัญชีกลางได้รับ ApproveCoin ไม่ครบ 100 เหรียญก็จะโอนไม่ได้ ทั้งเหรียญและเงิน ตามหลัก Atomicity
  • รายการที่ 2 เป็นอีกกรณี ที่ผู้รับเหมาผิดสัญญา เช่นทิ้งงาน หรืองานไม่เรียบร้อย จะโอนเงินทั้งหมดกลับไปยังบัญชีลูกค้า โดยจะ Valid ก็ต่อเมื่อหลังจากเลยระยะเวลาตรวจรับงานแล้ว
  • เมื่อทำรายการล่วงหน้าไว้เรียบร้อย เราจะได้ XDR Hash มา 2 ชุด สำหรับเอาไว้ไปรับในภายภาคหน้าเข้าระบบ เราเรียกขั้นตอนนี้ว่า Pre-Authorization Transaction
  • ตอนที่ทำรายการล่วงหน้านั้น เราจะใช้เลข Sequence Number ของทั้งสองรายการเป็นเลขเดียวกัน ดังนั้น หากรายการไหนทำเรียบร้อยไปแล้ว อีกรายการก็จะไม่สามารถทำรายการได้
  • สุดท้ายทั้ง 2 คนปิดการเข้าถึงบัญชี ทำให้ไม่ว่าใครก็ไม่สามารถแก้ไขอะไรได้แล้ว ต้องดำเนินการตามสัญญาที่ทำไว้อย่างเดียว

Election Application Concept

ทีนี้เรามาลองดูกันว่าจะนำระบบ Smart Contract มาใช้ในระบบเลือกตั้งกันอย่างไรได้บ้าง

เริ่มแรกผมออกแบบให้มีคนในระบบทั้งหมด 3 สถานะด้วยกัน

  • Voter ผู้ใช้ทั่วไปที่สามารถโหวตได้
  • Candidate ผู้ใช้ที่ลงรับสมัครในการเลือกตั้ง
  • Admin หรือกรรมการในการเลือกตั้ง

คราวนี้เราจะมาโฟกัสเรื่องบัญชีกลางที่จะใช้ในระบบนะครับ โดยในการลงคะแนนเนี่ย เราจะใช้การเสนอขายเหรียญของผู้สมัครแต่ละคน ( CandidateCoin ) โดยแลกกับ VoteCoin ที่ทุกบัญชีของ Voter จะได้รับกันไปคนละ 1 เหรียญตอนเริ่มเลือกตั้ง และบัญชีกลางเราจะแบ่งเป็น 3 บัญชีกลางคือ

  • บัญชีกลางสำหรับทำหน้าที่สร้างเหรียญ VoteCoin และส่งให้กับ Voter ทุกคนที่อยู่ในระบบเพื่อใช้ในการ Vote
  • บัญชีกลางสำหรับทำหน้าที่สร้างเหรียญ CandidateCoin แล้วส่งให้บัญชีกลางเพื่อใช้ในการขายคะแนนเสียง
  • บัญชีกลางการเลือกตั้ง ทำหน้าที่เสนอขายเหรียญของผู้สมัครแต่ละคน (1บัญชี ขายหลายเหรียญ) เพื่อให้ Voter เข้ามาซื้อเหรียญนั้น โดยแลกกับเหรียญ VoteCoin ที่ตัวเองมี ( ดังนั้นจำนวนเหรียญของผู้สมัครแต่ละคนที่ขายได้ ก็คือคะแนนโหวตนั่นเอง ) โดยบัญชีกลางนี้จะเป็นบัญชีร่วมของทั้ง Admin ทุกคน กับ Candidate ที่ลงสมัครทุกคน

วิธีการโหวตเราก็จะใช้การซื้อขายเหรียญกันนะครับ ง่ายๆเลยไม่มีอะไร

ขั้นตอนสุดท้ายคือการทำ Smart Contract ในการปิดการเลือกตั้ง โดยเมื่อกำหนดเวลาปิดการเลือกตั้งได้แล้ว ก็ทำ Pre-Authorization Transaction ในการหยุดขายเหรียญที่บัญชีกลาง เท่านี้ก็เลือกตั้งก็จะสิ้นสุดลงแล้ว โดยเราจะได้ XDR มาชุดนึงสำหรับนำไปสั่งรันปิดการเลือกตั้ง โดยแจกจ่ายให้กับทุกคนในระบบ เพื่อให้ใครก็ได้สามารถปิดการเลือกตั้งได้เมื่อถึงเวลาที่กำหนด

มาสรุป Process กันคร่าวๆอีกทีก่อนลงโค้ดนะครับ

  • Admin + Candidate ร่วมการสร้างบัญชีกลาง (1) แล้วออกเหรียญ VoteCoin เพื่อใช้ในการโหวต จากนั้นโอนให้ User คนละ 1 VoteCoin โดยออกเหรียญเท่ากับจำนวน User ที่มีในระบบ โดย User ที่จะสามารถถือเหรียญ VoteCoin ได้ต้องได้รับการ Allow จากบัญชีนี้ก่อน (จำกัดคนที่สามารถ Vote ได้)
  • Admin + Candidate ร่วมกันสร้างบัญชีกลางอีก 1 บัญชี (2) เพื่อใช้ในการเปิดโหวต
  • บัญชีกลาง Admin + Candidate บัญชีที่ (3) ทำการออกเหรียญให้กับ Candidate แต่ละคน เช่น VoteACoin, VoteBCoin แล้วโอนให้บัญชีกลาง Admin+Candidate (2) ก่อนหน้านี้เพื่อนำไปเสนอขาย โดย User ที่จะสามารถถือเหรียญ VoteACoin และ VoteBCoin ได้จะต้องได้รับการ Allow จากบัญชีนี้ก่อนเช่นกัน (จำกัดคนที่สามารถ Vote ได้)
  • ทำการปิด Permission บัญชีกลาง Admin + Candidate ที่ทำการออกเหรียญ VoteCoin (1) ดังนั้นระบบจะไม่สามารถเพิ่ม VoteCoin ในระบบได้อีกแล้ว เป็นการป้องกันปัญหาหลายๆอย่างที่อาจเกิดขึ้น เช่น มีเหรียญเพิ่มขึ้นมา และไม่บัญชีอื่นๆก็จะไม่สามารถนำเหรียญนี้ไปใช้ได้แล้ว เนื่องจากต้องทำการขออนุญาตก่อนถือเหรียญนั่นเอง
  • บัญชีที่ออกเหรียญ CandidateCoin ออก Pre-Authoriz Transaction สำหรับการยกเลิกการถือเหรียญ CandidateCoin ของ Voter ทุกคน หลักจากหมดเวลาการเลือกตั้งแล้ว เพื่อป้องกันการโอนเหรียญไปมา หรือโอนกลับไปเข้ายังบัญชีกลางเพื่อคืนคะแนนโหวต ก็จะได้ XDR มา แล้วส่งให้ทุกคนในระบบ ใครก็สามารถรันเพื่อยกเลิกการถือเหรียญได้หากถึงเวลา จากนั้นทำการปิดบัญชีนี้ได้เลย
  • บัญชี Admin + Candidate (2) ทำการเสนอขายเหรียญ (Manage Offer) ของ Candidate ทุกคน โดยแลกกับ VoteCoin ในราคา 1:1 Coin
  • บัญชี Admin + Candidate (2) ที่ทำการเสนอขายเหรียญ สร้าง Pre-Authorized Transaction ในการยกเลิกการขายเหรียญทั้งหมด โดยตั้ง Time Bound ไว้คือเวลาสิ้นสุดการเลือกตั้ง ได้ XDR มาอีกชุดหนึ่ง ส่งให้ทุกคนในระบบเช่นกัน
  • ทำการปิด Permission บัญชี Admin + Candidate (2) ดังนั้น ใครก็ไม่สามารถแก้ไขอะไรได้อีกแล้ว นอกจากรอการเลือกตั้งสิ้นสุดลง
  • ดึงจำนวนเหรียญที่ขายได้ไปมาเป็นคะแนนตัดสินการเลือกตั้ง

เมื่อหมดเวลาการเลือกตั้ง สิ่งที่ต้องทำคือ

  • ใครก็ตามที่ถือ XDR ทั้ง 2 ตัว คือปิดการขาย และยกเลิกการถือเหรียญ CandidateCoin นำข้อมูลนั้นเข้าไปรันในระบบ เพื่อทำการปิดการขายเหรียญ และยกเลิกการถือ CandidateCoin ของทุก Voter ให้ไม่สามารถนำไปใช้ได้อีกนั่นเอง

การทำงานของระบบง่ายๆก็มีเท่านี้นะครับ จะเห็นได้ว่า เรามีการใช้ข้อดีหลายๆอย่างของ Stellar เข้ามาช่วยให้ระบบการเลือกตั้งนั้นดูมีความโปร่งใสมากขึ้น เช่น จำนวนโหวตที่ Fix ตั้งแต่แรก ไม่มีทางเพิ่มขึ้น, เวลาในการหยุดเลือกตั้งที่ตั้งไว้แล้ว ที่ใครก็สามารถสั่งหยุดได้หากถึงเวลาที่กำหนด เป็นต้น

Let’s Coding

สร้างบัญชีกันก่อนนะครับ ผมสร้างสมาชิกขั้นมา 9 คนด้วยกัน คือ Mister A ถึง G และ AdminX, AdminY โดย Candidate คือ MisterA จากพรรคกายพักใจ และ MisterB จากพรรคผ่อนสักนิดเถอะนะคนดี 2 คนครับ และในระบบนี้ MisterA และ B ก็จะมีสิทธิ์ในการลงคะแนนด้วยเช่นกัน

Account ทั้งหมดในระบบ

รวมถึงเปิดบัญชีสำหรับใช้ทำบัญชีกลางอีก 3 บัญชี จากนั้นใช้ FriendBot โอนเงินมาให้แต่ละ Account เพื่อสร้างบัญชีในระบบ รวมถึงจะต้องนำ XLM ที่ได้มาไปใช้เป็นค่าธรรมเนียมในการทำรายการต่อไปด้วย

ออกเหรียญ VoteCoin

เริ่มสร้างบัญชีกลางบัญชีแรกกันก่อน แล้วก็สร้างเหรียญ VoteCoin ขึ้นมาในระบบกันนะครับ โดยระบบ Trustline ของเหรียญใน Stellar นั้น มีอยู่ 2 แบบคือ

  • Public คือใครก็สามารถตั้งค่าบัญชีเพื่อรับเหรียญนั้นได้
  • Private คือเหรียญที่ต้องขออนุญาตจากเจ้าของเหรียญก่อน ใช้ในเหรียญที่ต้องการความเป็นส่วนตัว

ทั้งสองแบบจะสามารถตั้งค่าได้ว่า เจ้าของเหรียญจะ Allow ได้อย่างเดียว หรือสามารถ Revoke ไปแล้วหลังจาก Allow ไปแล้วได้ด้วย โดยเราทำออกแบบให้เหรียญ VoteCoin ของเราต้องได้รับการอนุญาตจากผู้สร้างเหรียญก่อน เพื่อจำกัดคนที่สามารถถือเหรียญได้นะครับ

เริ่มด้วยการตั้งค่าบัญชีใหม่ ให้ Admin + Candidate เข้ามาร่วมด้วย เพื่อไม่ให้ใครก็ได้สามารถออกเหรียญได้ ทุกคนพร้อมใจกันออกเหรียญ VoteCoin

จากตัวอย่างคือ Admin+Candidate ทุกคนก็จะเป็นเจ้าของบัญชีร่วมนี้ โดยทุกคนมีอำนาจเท่ากับ 1 จากนั้นตั้งค่าของบัญชี ให้การจะทำ Action อะไรสักอย่าง ต้องมีกุญแจของทุกคน โดยตั้ง Threshold ไว้ 4 นั้นคือต้องมีกุญแจของทุกคนพร้อมกันนั่นเองนะครับ

พร้อมกันนั้น เราก็ setFlag StellarSdk.AuthRevocableFlag | StellarSdk.AuthRequiredFlag ไปด้วย เพื่อบอกว่าเหรียญที่ทำการออกโดยบัญชีนี้ จะต้องขออนุญาติก่อนเพื่อเข้าถึง และสามารถ Revoke การถือเหรียญของผู้ใช้ได้

ทีนี้แต่ละบัญชีผู้ลงคะแนนก็จะต้องขอทำการรับเหรียญ โดยต้องทำการ ChangeTrust เหรียญใหม่กันก่อน เพื่อให้สามารถรับเหรียญได้ โดยตั้ง Limit ของแต่ละคนไว้ 1 ( ได้ 1 คน 1 Vote ) และ Limit ของบัญชีกลางไว้เยอะๆนะครับเพราะบัญชีนี้ต้องรับ VoteCoin จากผู้ลงคะแนน

ChangeTrust ผู้ใช้ทุกคนให้เรียบร้อย

Admin ทำคำสั่ง AllowTrust ให้กับบัญชีของ Voter ทุกคน เพื่อให้สามารถรับเหรียญ VoteCoin นี้ได้ และทำการส่ง VoteCoin ไปให้แต่ละบัญชี

จากนั้นก็ปิดบัญชี Admin + Candidate นี้ซะเลย จำนวน Vote ก็จะไม่มีทางเพิ่มขึ้นมาแล้วแน่นอน

สรุปขั้นตอนแรกคร่าวๆ ถ้าเป็นในรูปแบบ Application ก็จะประมานนี้

  • กำหนด Admin และผู้ลงรับสมัครการเลือกตั้งให้เรียบร้อย ปิดการรับสมัคร
  • เปิดบัญชีกลางสำหรับสร้างเหรียญ VoteCoin และบัญชีสำหรับสร้างเหรียญ CandidateCoin (ในหัวข้อถัดไป) และกระจายข่าวให้ผู้ที่มีสิทธิ์โหวต
  • ผู้ที่มีสิทธิ์โหวต เข้ามา Join Event เพื่อทำการส่งคำสั่งขอ ChangeTrust ( ไม่ขอไม่ได้ ) ถือเป็นการ Approve คนโหวตไปในตัว ทั้งของ VoteCoin และ CandidateCoin ในหัวข้อถัดไป
  • AllowTrust ให้กับบัญชีที่มาร่วม Join Event
  • แจกเหรียญ VoteCoin ให้คนโหวต
  • ปิดบัญชีที่ออกเหรียญ VoteCoin

ผลการรันก็จะได้ตามนี้ ทุกคนได้เหรียญ VoteCoin ไปไว้ในบัญชีคนละ 1 เหรียญ

ดูโค้ดตัวเต็มได้ที่ https://github.com/devsolate/stellar-voting-example/blob/master/1_issue_vote_coin.js

ออกเหรียญ CandidateCoin

ถัดมาสร้างบัญชี Admin+Candidate ขึ้นมาอีกบัญชีเพื่อทำการออกเหรียญให้กับ Candidate แต่ละคนนะครับ โดยจะใช้ชื่อเหรียญว่า VoteACoin สำหรับโหวต Mister A และ VoteBCoin สำหรับโหวตให้ Mister B นะครับ ใช้ฟังก์ชัน setJointAdminCandidateAccount() เหมือนขั้นตอนก่อนเป๊ะๆ จากนั้น ChangeTrust และ AllowTrust ของเหรียญ VoteACoin และ VoteBCoin ให้กับผู้ใช้ในระบบและบัญชีกลางอีกเช่นเคย

โอนเหรียญไปยังบัญชีกลางอีก 1 บัญชีที่เตรียมไว้เสนอขายเหรียญ โดยผมตั้งไว้ที่ Coin ละ 1,000 เหรียญ หรือเอาให้เพียงพอต่อการโหวตนะครับ

บัญชีกลางสำหรับเสนอขายเหรียญ ได้เหรียญ CandidateCoin มาไว้ขายแล้ว

ถัดมาทำการตั้ง Pre-Authorization Transaction เพื่อทำการยกเลิกการถือ CandidateCoin ของ Voter ในกรณีที่เลยเวลาเลือกตั้งไปแล้ว เพื่อให้ไม่สามารถโอนกลับไปยังบัญชีกลางได้ (คะแนนจะได้ไม่มีการเปลี่ยนแปลง)

เราจะได้ XDR มาหนึ่งตัว สามารถนำไปส่งรันในระบบ Stellar ได้เลย เมื่อส่งในเวลาที่กำหนด ในที่นี้คือหลังจาก minTime ที่เราตั้งไว้ ระบบก็จะทำตามรายการที่เราส่งเข้าไปเลย หากส่งไปก่อนหน้านั้นก็จะ Failed นั่นเอง

สร้าง CandidateCoin พร้อมปิด Account

เสร็จแล้วก็ปิด Permission ของบัญชีนี้ทิ้งไป ( ตั้ง Threshold ให้สูงๆไว้ )สามารถดูโค้ดตัวเต็มของไฟล์นี้ได้ที่นี่ https://github.com/devsolate/stellar-voting-example/blob/master/2_issue_candidate_coin.js

เสนอขายเพื่อทำการโหวต

เท่านี้ บัญชีกลางอีกตัวเราก็จะได้เหรียญมาเสนอขายแล้ว ก็ทำการเสนอขายได้เลย โดยแต่ละเหรียญก็ขายที่ 1:1 VoteCoin นั่นเอง ขั้นแรกก็สร้างบัญชีร่วมอีกเช่นเคย ใช้ฟังก์ชัน setJointAdminCandidateAccount() เหมือนขั้นตอนก่อนเป๊ะๆ แต่สามารถตัด setFlag ออกไปได้เลย เนื่องจากบัญชีนี้เราไม่ได้ทำการออกเหรียญ

รายละเอียดการเสนอขายเหรียญ VoteA
รายละเอียดการเสนอขายเหรียญ VoteB

ทำ Smart Contract ในการปิดโหวต

ถัดมาเราสามารถ Pre-Authorization Transaction ในการปิดโหวตกันนะครับ ก็ตั้งเวลาปิดโหวตกันตามสะดวก

ได้ XDR มาแล้ว สำหรับปิดการขายเหรียญ

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

Voting!!

ขั้นตอนการโหวตก็คือเราเข้าไปซื้อเหรียญนั่นเองจ้า ชอบท่านไหนสีไหนก็เข้าไปซื้อเหรียญของคนนั้นได้เลย การซื้อเหรียญนั่นคือก็การทำ Offer นั่นเอง โดยบัญชีแต่ละคนก็จะเปิด Offer ต้องการแลกเหรียญของคนที่ตัวเองจะโหวต ด้วย VoteCoin ที่ตัวเองมี

โหวตกัน

เมื่อถึงเวลาปิดโหวต เราก็จะรันตัว XDR ของตัว Smart Contract ที่เราสร้างไว้ เพื่อปิดการขายเหรียญ และยกเลิการถือเหรียญของคนที่ไม่ได้โหวตนะครับ เหตุที่ต้องแจกให้ทุกคนสามารถรันได้ เพื่อป้องกันการที่คนที่สามารถปิดโหวตได้ ไม่ทำการปิดโหวต เช่น อาจจะรอให้คะแนนของฝั่งตัวเองกลับมานำก่อน ดังนั้น ฝั่งที่เป็นผู้นำจะต้องรีบทำการปิดโหวตเมื่อถึงเวลาอยู่แล้วนั่นเอง

ปิดโหวตกันเลย
Offer ปิดไปหมดแล้ว

จากนั้นทำการ Revoke เหรียญด้วย XDR อีกหนึ่งตัวกัน จะทำให้ผู้ใช้ไม่สามารถโอนเหรียญนั้นได้อีก ทำให้โอนกลับไปยังบัญชีกลางเพื่อยกเลิกการโหวตไม่ได้ ถ้าลองโอนดูก็จะได้ Error op_src_not_authorized กลับมา

Revoke เหรียญ VoteACoin / VoteBCoin ของคนที่ลงคะแนนไปแล้ว

ทีนี้มาดูคะแนนกัน โดยตอนนี้ผมเอาง่ายเข้าว่า ใช้การดึง Balance ของบัญชีกลางมาดูว่า VoteACoin และ VoteBCoin นั้น ลดลงไปเท่าไหร่จากจำนวนแรกที่เรารับมา ( ผมใช้ค่าเดียวกับค่า Limit นะครับ )

เรียบร้อย Mister A แห่งพรรคกายพักใจชนะไปด้วยคะแนน 4:2 นะครับ

Balance หลังการ Vote ของบัญชีกลาง
ดึงผลโหวตมาเลย

สามารถดู Source Code ตัวเต็มได้ที่นี่นะครับ https://github.com/devsolate/stellar-voting-example

Conclusion

การนำ Blockchain และระบบ Smart Contract ของ Stellar ไปปรับใช้งานนั้นได้ค่อนข้างหลากหลายเลยทีเดียว เช่นเดียวกับการเลือกตั้งเมื่ออยู่บนระบบ Blockchain เราก็สามารถกำหนดหลายๆอย่างให้ตอบโจทย์ได้ เช่นคะแนนเสียงที่จะไม่มีทางเพิ่มขึ้น หรือคะแนนโหวตที่ตรวจสอบได้ว่ามาจากใคร เป็นต้น

ตัวอย่างข้างต้นเรายกมาแบบง่ายๆเท่านั้นนะครับ ในโลกแห่งความเป็นจริงยังมีอีกหลายปัจจัยที่ต้องมาปรับปรุงเพื่อความปลอดภัยและความถูกต้องโปร่งใสของคะแนนโหวตกันอีกที แต่ก็หวังว่าคนอ่านจะพอเห็นภาพว่าจะสามารถนำ Smart Contract ไปประยุกต์ใช้ในงานอื่นได้นะครับ

และบริษัทไหนที่สนใจนำ Blockchain ไปพัฒนางานต่างๆ สามารถพูดคุยแลกเปลี่ยนความคิดเห็นกันได้ครับที่ geek@nextzy.com นะครับ ทาง Nextzy เรายินดีพูดคุยแลกเปลี่ยนความรู้กันได้นะครับ

References

--

--