ZMINE BLOG

English English   ไทย ไทย

How ZMINE generate random numbers from Smart Contract (1)

Share this article

จากที่ ZMINE ได้เปิดตัวระบบ ST Rewards ซึ่งมีการแจกรางวัลให้แก่ผู้ถือ ZMN Token จากการสุ่มตัวเลขขึ้นมา (Random) คำถามที่เกิดขึ้นมาคือ แล้วจะรู้ได้อย่างไรว่าตัวเลขที่ประกาศออกมานั้นเป็นตัวเลขที่ได้จากการสุ่มขึ้นมาจริงๆ ดังนั้นในบทความนี้จะเป็นการพูดถึงระบบที่ ZMINE ใช้สุ่มตัวเลขขึ้นมากันครับ

การ Random กับ Computer

ก่อนอื่นต้องอธิบายก่อนว่า สำหรับคอมพิวเตอร์นั้นไม่สามารถที่จะสุ่มค่าแบบจริงๆได้ หรือที่เรียกว่า True Random เหตุผลก็เพราะ เมื่อเราต้องการจะสั่งให้คอมพิวเตอร์ทำอะไรก็ตาม ก็ต้องมีการเขียนโปรแกรมขึ้นมา หรือเรียกได้ว่ามี “Algorithm” ที่สั่งให้ทำงาน ซึ่งเมื่อพูดถึง “Algorithm” นั้นในทาง Computational Theory จะหมายถึง “Deterministic Algorithm” เสมอ

ที่มา: https://en.wikipedia.org/wiki/Nondeterministic_algorithm

 

Deterministic Algorithm ก็คือการที่เราใส่ Input เข้าไปจะได้ Output เดิมเสมอ หรืออาจได้ Output ที่ต่างกันออกไปได้ถ้า “State” ของการประมวลผลเปลี่ยนไป (ลองนึกภาพ Stack ของข้อมูลที่มีการเรียก Pop ข้อมูลบนสุดออกมา ทุกครั้งที่มีการเรียก State ของ Stack ก็จะเปลี่ยนไป) ในทางตรงกันข้าม  Nondeterministic Algorithm สามารถให้ผลลัพธ์ที่ต่างกันออกไปในแต่ละครั้งที่ประมวลผล แม้ว่าจะมี Input เดียวกัน ตัวอย่างที่เห็นได้ชัดเจนที่สุดก็คือการ Random นี่แหละครับ ที่ประมวลผลแต่ละครั้งจะให้ผลลัพธ์ที่ต่างกันออกไป

ดังนั้นเหตุผลที่คอมพิวเตอร์ไม่สามารถทำการ True Random ได้ก็เพราะ ทุกอย่างที่เขียนโปรแกรมขึ้นมาต่างก็เป็น Deterministic Algorithm ทั้งสิ้น หรือสามารถ “คาดเดา” ผลลัพธ์ได้หากรู้ Input ที่แน่ชัดเสมอ … เมื่อ “คาดเดา” ได้ ก็ไม่ใช่การ Random

คำถามต่อมาก็คือ อ้าว.. แล้วที่เราเรียกฟังก์ชั่น Random ในโปรแกรมเช่น Math.random() มันเอาค่าสุ่มที่ไหนมาให้เราหว่า คำตอบก็คือ กระบวนการสุ่มในคอมพิวเตอร์จะเป็นการสุ่มแบบเทียมทั้งสิ้นครับ หรือที่เราเรียกกันว่า “Pseudo Random” ที่จะกล่าวต่อไปนั่นเอง

Random Number Generator

ในเมื่อเรารู้แล้วว่าการทำงานของคอมพิวเตอร์นั่นสามารถที่คาดเดาผลลัพธ์ได้เสมอ จาก Input ที่ใส่เข้าไป ดังนั้นคิดง่ายๆ..หากเราต้องการผลลัพธ์เป็นการสุ่มที่คาดเดาไม่ได้ เราก็ใส่ Input ที่คาดเดาได้ยากแทนสิ

“Random Output ไม่ได้  ก็ Random Input แทนนั่นเอง”

Input ที่คาดเดาได้ยากสำหรับการสุ่มนี้เราจะเรียกมันว่า “Seed” ซึ่ง Seed นี้ก็มีทั้งมาจากการสุ่มจริงๆ กับการสุ่มแบบคาดเดาได้ ดังนั้นหากเราจะแบ่งกระบวนการสุ่ม หรือ Random Number Generator (RNG)  จากแหล่งที่มาของ Seed จะแบ่งได้เป็น 2 กลุ่มคือ

1. True Random Number Generator: TRNG

คือกระบวนการสุ่มแบบใช้ Seed ที่มาจากการสุ่มจริงๆจากภายนอก ผ่านแหล่งของความยุ่งเหยิง (Entropy source) ตัวอย่างเช่น

1.1 สิทธิบัตรของ Richard P. Dunnigan ที่ทำการสร้างเครื่องมือสุ่มออกเลขจากลูกปิงปองแล้วนำมาต่อเข้ากับคอมพิวเตอร์

1.2 การใช้ Hardware ที่มีการสร้างเลขสุ่มจากด้วยกระบวนการทาง Physical อุปกรณ์เหล่านี้จะมีหน่วยสร้างและตรวจจับ “noise” อยู่ในตัว เช่น noise จากความร้อนหรือจากอนุภาคแสง และมีการรับรองด้วยทฤษฎีกับค่าทางสถิติว่า noise เหล่านี้เป็น “random noise”

ที่มา: https://en.wikipedia.org/wiki/Nondeterministic_algorithm

1.3 การจับฉลาก หรือการสุ่มจากภายนอก ผ่านหน่วยงานที่น่าเชื่อถือ เช่น ฉลากกินแบ่งรัฐบาล หรือการจับฉลากแบ่งสายแข่งขันกีฬา ที่มีการถ่ายทอดสด เปิดเผยข้อมูลให้ทุกคนได้รับรู้

 

1.4 Socialize หรือการใช้พลังแห่งมวลชน ช่วยกันกำหนดค่าสุ่มขึ้นมา วิธีนี้มีข้อเสียคือ ถ้าจำนวนผู้เข้าร่วมน้อยเกิน อาจมีการล็อบบี้ผลลัพธ์กันได้ แต่หากจำนวนผู้เข้าร่วมมากพอ ก็พอจะถือได้ว่าเป็นการสุ่มจริงๆ ตัวอย่างการสุ่มที่ใช้วิธีนี้ เช่น RANDAO ที่มีการใช้ความร่วมมือกันระหว่างคนหลายๆคนใน Ethereum Network และกำหนดรางวัลเป็น ETH ให้แก่ผู้เข้าร่วม

2. Pseudo Random Number Generator: PRNG

คือกระบวนการสุ่มแบบคาดเดาได้ (แต่ในทางปฎิบัติ คาดเดาได้ยากมาก) เช่น

2.1 ใช้ Algorithm ที่ให้ผลลัพธ์ที่คาดเดาได้จากยาก เช่นการ Hash หรือใช้ Output ผลลัพธ์ของการประมวลผลก่อนหน้ามาเป็น Seed ในการประมวลผลครั้งต่อไป เช่น Middle-square method

Middle-square method

2.2 ค่าต่างๆในระบบคอมพิวเตอร์ เช่น เวลา epoch time หรือ Unix timestamp หรือ ระยะช่วงเวลาที่มีการรับ-ส่ง Network Package ไปมา

2.3 การใช้ช่วงเวลา และพฤติกรรมของ User Input ที่คาดเดาได้ยาก เช่น การขยับเม้าส์ หรือระยะช่วงเวลาการกด Keyboard ตัวอย่างการใช้งานเช่นโปรแกรม Putty Key Generator ที่ใช้สร้าง Private/Public Key เมื่อกดสร้างก็จะให้เราลากเม้าส์ไปมาเพื่อสร้างเลขสุ่ม

Putty Key Generator

Random วิธีไหนดีที่สุด

จากการ Random หลากหลายวิธีที่กล่าวมา ถ้าถามว่าวิธีไหนดีที่สุด คำตอบคือ

 

“ไม่มีวิธีที่ดีที่สุด มีแต่วิธีที่เหมาะสมที่สุด”

 

ในการเลือกวิธีที่จะ Random ผู้ใช้ต้องพิจารณาว่าจะนำไปใช้งานด้านไหน และแต่ละวิธีมีข้อดีข้อเสียอย่างไร ปัจจัยในการพิจารณามีดังนี้

1. ระดับความโปร่งใส

ในงานที่ต้องการความโปร่งใสมากๆ เช่น การออกฉลากกินแบ่งรัฐบาล ก็ควรเลือกวิธีการที่ใช้ True Random Number Generator มากกว่า Pseudo Random Number Generator

2. จำนวนที่ต้องใช้

จำนวนของการ Random ที่ใช้ หากต้องใช้ข้อมูลเป็นจำนวนมากๆ เช่น การทำ Casino Online ที่มีผู้เล่นจำนวนมากตลอดเวลา การใช้การ Random จากภายนอกเช่น การจับฉลาก หรือการใช้วิธี Socialize ก็อาจไม่เหมาะสม เพราะทำได้ช้า หรือการใช้เวลาในเครื่องที่เป็นหน่วย millisecond ก็จะไม่สามารถให้ผลลัพธ์มากกว่า 1,000 ผลลัพธ์ต่อวินาทีได้

3. ค่าใช้จ่าย

แต่ละกระบวนการ Random ก็มีค่าใช้จ่าย แตกต่างกันออกไป เช่น การถ่ายทอดสดจับฉลาก มีค่าใช้จ่ายสูงมาก (แต่แลกมาด้วยความโปร่งใส และการยอมรับจากสาธารณะชน) หรือการใช้ Hardware ที่แม้จะให้ผลลัพธ์ที่เป็น True Random ได้อย่างรวดเร็ว แต่ก็มีค่าใช้จ่ายที่สูง และมีความเสี่ยงจากการอุปกรณ์ที่อาจชำรุดหรือหามาทดแทนได้ยาก

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

3. ความเชื่อใจ (Third Party)

การใช้การ Random จาก Third Party เช่น random.org หรือ oraclize ก็เป็นอีกหนึ่งทางเลือกในการได้ค่าสุ่มแบบ True Random, จำนวนมากๆ โดยค่าใช้จ่ายไม่แพงมากจนเกินไป แต่ก็ต้องแลกมากับความเชื่อใจว่า Third Party เหล่านี้จะทำการ Random ให้เราจริงๆ

ZMINE random numbers

จากที่เล่ามาทั้งหมด จะเห็นได้ว่าการ Random เป็นเรื่องของการมั่ว (ที่ไม่มั่ว) ที่ต้องมีการเลือกใช้วิธีการตามความเหมาะสมในแต่ละงาน แล้วเลข ST Rewards ที่ทางทีมงาน ZMINE ประกาศออกมา มีวิธีการ Random อย่างไร เราจะอธิบายไว้ในบทความถัดไปครับ … Part (2)