[Blockchain] การใช้เทคนิค Commit และ Reveal
คำนิยาม
Commit คือการส่งข้อมูลที่ผ่านฟังก์ชันแฮชเข้าไปยังบล็อกเชน
Reveal คือการตรวจสอบข้อมูลจริงและค่าแฮชบนบล็อกเชนที่เคย commit ไปในอดีต
เนื่องจากเราทราบแล้วว่า การใช้บล็อกแฮช (blockhash) และเวลาการประกาศบล็อก (block timestamp) สามารถที่จะปรุงแต่งโดยนักขุดที่ไม่สุจริตได้ (สามารถอ่านได้จากบทความนี้) ดังนั้นนักพัฒนาที่พยายามจะแก้ไขปัญหาโดยการใช้เทคนิค commit / reveal
บล็อกเชนสาธารณะ มีการเก็บข้อมูลธุรกรรมเป็นสาธารณะ การที่จะปกปิดความลับจึงเป็นเรื่องที่ยาก ตัวอย่างเช่น นักเรียนต้องการส่งคำตอบแบบฝึกหัดไปให้อาจารย์ โดยที่ภายในช่วงระยะเวลาหนึ่งนักเรียนผู้ส่งคำตอบไม่ต้องการให้นักเรียนคนอื่น ๆ รู้คำตอบของตน อาจารย์จึงให้นักเรียนทุกคนนำคำตอบของตนไปผ่านฟังก์ชันแฮช (เรียกขั้นตอนนี้ว่า commit) แล้วส่งคำตอบนั้นให้อาจารย์
เมื่อนักเรียนได้ส่งคำตอบที่ผ่านฟังก์ชันแฮชไปให้อาจารย์ครบทุกคนแล้ว นักเรียนจะต้องส่งคำตอบจริงเพื่อนให้อาจารย์สามารถนำคำตอบของนักเรียนแต่ละคนมาตรวจสอบ (เรียกขั้นตอนนี้ว่า reveal) ว่าตรงกับค่าแฮชของนักเรียนที่ส่งมาในตอนต้นหรือไม่ หากตรงกันแสดงว่านักเรียนคนนั้นตอบถูก
แม้ว่าวิธีนี้จะแก้ปัญหาในการปกปิดความลับได้แค่ชั่วคราว แต่ก็มีความปลอดภัยมากพอสำหรับการแก้โจทย์ปัญหาลักษณะนี้
สำหรับการนำมาประยุกต์ใช้กับการสร้างตัวสร้างเลขสุ่มเทียมจึงน่าจะมีความเป็นไปได้ในการปกปิดค่าเริ่มต้น (seed) โดยมีข้อจำกัดต่อไปนี้
1. ผู้ที่ต้องการเลขสุ่มเทียม (เรียกสั้น ๆ ว่า ผู้เข้าร่วม) จำเป็นต้องมีส่วนร่วมในการ commit ข้อมูลเพื่อใช้ในการสร้างตัวเลขสุ่มเทียม (มีค่าใช้จ่ายในการสร้างธุรกรรม)
2. ต้องมีปริมาณของผู้เข้าร่วมมากพอ เพื่อให้ค่าเริ่มต้น (seed) มีความน่าเชื่อถือ (หมายเหตุ: หากจำนวนผู้เข้าร่วมมีมากเกินไป อาจเป็นสาเหตุให้เกิดปัญหาแก๊สลิมิตได้)
3. ผู้เข้าร่วมสามารถที่จะละทิ้งขั้นตอนการ reveal ได้ ในกรณีที่ผลลัพธ์ไม่เป็นไปตามคาด
4. จำเป็นต้องกำหนดเวลาในการ reveal เพื่อไม่ให้เกิดปัญหาข้อ 3.
5. ต้องมีบทลงโทษสำหรับผู้เข้าร่วมที่ไม่ทำการ reveal เผื่อเอาผลลัพธ์
6. ต้องมีบทลงโทษสำหรับผู้เข้าร่วมที่ส่งค่าแฮชโดยไม่สอดคล้องกับข้อมูลต้นฉบับ
7. ใช้เวลาค่อนข้างนาน เพื่อที่จะได้ตัวเลขสุ่มเทียม
ขั้นตอนและหลักการทำงานเบื้องต้น
1. ผู้เข้าร่วมแต่ละคนทำการสุ่มตัวเลขขึ้นมา 1 ตัวเลขแล้วทำการแฮช
2. นำค่าแฮชที่ได้ประกาศเข้าสู่บล็อกเชน
3. รอข้อมูลแฮชนั้นถูกปิดบัญชีโดยนักขุดซึ่งจะได้ค่าบล็อกแฮช
4. รอผู้ที่ต้องการเลขสุ่มเทียมคนอื่นทำตามขั้นตอน 1-3 จนครบจำนวนที่ได้กำหนดไว้
5. สัญญาอัจฉริยะปิดไม่ให้มีการ commit ในอนาคต
6. ผู้เข้าร่วมทำการประกาศตัวเลขต้นฉบับในข้อ 1. เข้าสู่บล็อกเชน
7. สัญญาอัจฉริยะทำการตรวจสอบตัวเลขต้นฉบับกับค่าแฮชของแต่ละคนว่าถูกต้องหรือไม่
7.1 หากตรวจสอบแล้วตรงกัน ให้ทำการนำค่าแฮชของแต่ละคนและบล็อกแฮชของค่าแฮชนั้น ๆ มาเป็นค่าเริ่มต้นในการสร้างเลขสุ่มเทียม
7.2 หากตรวจสอบแล้วไม่ตรงกัน ให้ลงโทษผู้ที่ส่งข้อมูลมา
8. เมื่อถึงเวลาที่กำหนดไว้ สัญญาอัจฉริยะทำการแฮชข้อมูลจากข้อ 1. และบล็อกแฮชที่ได้จากข้อ 3. เพื่อสร้างเลขสุ่มเทียม
ขั้นตอนและหลักการทำงานเบื้องต้น
1. ผู้เข้าร่วมแต่ละคนทำการสุ่มตัวเลขขึ้นมา 1 ตัวเลขแล้วทำการแฮช
2. นำค่าแฮชที่ได้ประกาศเข้าสู่บล็อกเชน
3. รอข้อมูลแฮชนั้นถูกปิดบัญชีโดยนักขุดซึ่งจะได้ค่าบล็อกแฮช
4. รอผู้ที่ต้องการเลขสุ่มเทียมคนอื่นทำตามขั้นตอน 1–3 จนครบจำนวนที่ได้กำหนดไว้
5. สัญญาอัจฉริยะปิดไม่ให้มีการ commit ในอนาคต
6. ผู้เข้าร่วมทำการประกาศตัวเลขต้นฉบับในข้อ 1. เข้าสู่บล็อกเชน
7. สัญญาอัจฉริยะทำการตรวจสอบตัวเลขต้นฉบับกับค่าแฮชของแต่ละคนว่าถูกต้องหรือไม่
7.1 หากตรวจสอบแล้วตรงกัน ให้ทำการนำค่าแฮชของแต่ละคนและบล็อกแฮชของค่าแฮชนั้น ๆ มาเป็นค่าเริ่มต้นในการสร้างเลขสุ่มเทียม
7.2 หากตรวจสอบแล้วไม่ตรงกัน ให้ลงโทษผู้ที่ส่งข้อมูลมา
8. เมื่อถึงเวลาที่กำหนดไว้ สัญญาอัจฉริยะทำการแฮชข้อมูลจากข้อ 1. และบล็อกแฮชที่ได้จากข้อ 3. เพื่อสร้างเลขสุ่มเทียม
การแก้ปัญหาสำหรับผู้เข้าร่วมที่ไม่สุจริต อาจแก้ปัญหาด้วยบทลงโทษได้ดังต่อไปนี้
• ให้ผู้เข้าร่วมแต่ละคนทำการวางเงินหลักประกัน ก่อนที่จะใช้งานระบบ ซึ่งหากผู้เข้าร่วมคนไหนกระทำการทุจริต ให้ทำการริบเงินหลักประกันดังกล่าว
• การขึ้นบัญชีดำกับผู้ใช้งานดังกล่าว (ในทางปฏิบัติค่อนข้างที่จะบังคับใช้ยาก)
สามารถลองเล่นได้ที่ https://cr.nan.run/ (ยัง implement ไม่สมบูรณ์) โดยตอนนี้ได้ deploy ไปยัง network Kovan แต่หากไม่ได้ติดตั้ง MetaMask มันจะ fallback มาที่ ganache ที่รันอยู่บนเซิร์ฟเวอร์
References:
Austin Thomas Griffith. “Commit Reveal Scheme on Ethereum”.
https://medium.com/gitcoin/commit-reveal-scheme-on-ethereum-25d1d1a25428