เลิกไว้ใจ API สุ่มตัวเลข: วิธีตรวจ drand beacons ใน 30 บรรทัด
เจาะลึกวิธีตรวจสอบความถูกต้องของ drand randomness beacon ด้วยตนเองเพื่อเลี่ยงความเสี่ยงจากการใช้ HTTP relay ทั่วไป
ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- Agent มักต้องการตัวเลขสุ่มที่พิสูจน์ได้ว่าไม่มีการโกง
- drand จาก League of Entropy ออกแบบมาเพื่อแก้ปัญหานี้
- การพึ่งพา HTTP relay โดยไม่ตรวจสอบลายเซ็นดิจิทัลอาจเสี่ยงโดนหลอก
- นักพัฒนาสามารถเขียนโค้ดตรวจสอบ BLS signature ได้ใน 30 บรรทัด
เมื่อ AI agent หรือโปรแกรมทำงานอัตโนมัติจำเป็นต้องสุ่มตัวเลขเพื่อตัดสินใจ เช่น การเลือกผู้ตรวจทาน การแบ่งแต้มเท่า หรือการสุ่มแจกของรางวัล ฟังก์ชันทั่วไปอย่าง Math.random() มักใช้ไม่ได้ผลทันทีที่มีคำถามว่า "พิสูจน์ได้อย่างไรว่าไม่ได้แอบสุ่มใหม่จนกว่าจะได้ผลลัพธ์ที่ต้องการ"
ปัญหานี้ได้รับการแก้ไขด้วย drand ซึ่งเป็นระบบ Public Randomness Beacon ที่ดำเนินการโดยกลุ่มองค์กรอิสระในชื่อ League of Entropy โดยเครือข่าย quicknet ของ drand จะทำการเผยแพร่รอบการสุ่มทุก ๆ 3 วินาที ในรูปของ BLS signature เทียบกับหมายเลขรอบ พร้อมค่าความสุ่มที่คำนวณจาก SHA-256(signature) ทำให้ใครก็ตามที่มี Public Key ของเชนสามารถตรวจสอบย้อนหลังแบบออฟไลน์ได้ทันที
ประเด็นสำคัญคือ Agent ส่วนใหญ่ไม่ได้เรียกใช้งาน drand โดยตรง แต่เลือกเรียกผ่าน HTTP API ของ Relay ทั่วไปแทน ซึ่งทำให้เกิดคำถามตามมาว่า เราควรไว้วางใจ Relay เหล่านั้นมากน้อยแค่ไหนและความจริงคือคุณไม่ควรไว้ใจ โดยบทความนี้จะพาไปดูวิธีนำ Beacon จาก Relay ใดก็ได้มาตรวจสอบความถูกต้องด้วยตัวเองก่อนนำไปใช้งานจริง
การตรวจสอบความถูกต้องด้วยตนเอง (Client-side Verification) ถือเป็นหัวใจสำคัญในการพัฒนาแอปพลิเคชันกระจายศูนย์หรือระบบที่ต้องการความโปร่งใสสูง การปล่อยให้ Relay เป็นผู้ยืนยันฝ่ายเดียวเปรียบเสมือนการยอมรับความเสี่ยงที่ข้อมูลอาจถูกแก้ไขระหว่างทาง การใช้คีย์ที่กำหนดไว้ล่วงหน้า (Pinning Keys) จึงช่วยป้องกันการปลอมแปลงข้อมูลได้อย่างมีประสิทธิภาพ
ตัวอย่างการใช้งานผ่านบริการฟรี Proof Random API จะส่งคืนข้อมูลรอบ quicknet ล่าสุดในรูปของ JSON เช่นการเรียกผ่านคำสั่ง:
curl -sS 'https://proof-random-api.pn-26f.workers.dev/v1/random?nonce=my-request-1'
ผลลัพธ์ที่ได้จะแสดงค่าสถานะ "verified": false เนื่องจากตัว Relay ไม่ได้ทำหน้าที่ตรวจสอบลายเซ็นดิจิทัลให้ โดยกระบวนการตรวจสอบทั้งหมดจะต้องเกิดขึ้นฝั่งผู้ใช้งานเองโดยใช้ Public Key ที่กำหนดค่าไว้ล่วงหน้า
ขั้นตอนการตั้งค่าเพื่อความปลอดภัยมีแนวทางดังนี้:
- ห้ามดึง Public Key จากแหล่งข้อมูลภายนอกที่กำลังตรวจสอบอยู่เด็ดขาด
- ให้กำหนดค่า chain hash และ public key ของ quicknet ไว้ตายตัวในโค้ด (Hard-code)
- ติดตั้งไลบรารีอย่างเป็นทางการด้วยคำสั่ง
npm i drand-client - ดึงข้อมูลรอบการสุ่มจาก Relay พร้อมกับดึงข้อมูลเดียวกันจาก Endpoint ของ drand โดยตรงเพื่อตรวจสอบ BLS signature และนำมาเปรียบเทียบกัน
อย่างไรก็ตาม การตรวจสอบยืนยันพิสูจน์เพียงแค่ว่าตัวเลขดังกล่าวมาจาก drand จริง แต่ไม่ได้หมายความว่าผู้เรียกใช้งานจะไม่สามารถเลือกจังหวะเวลาในการเรียกดูรอบการสุ่มได้ หากระบบต้องการความยุติธรรมสูงสุด ทุกฝ่ายที่เกี่ยวข้องจะต้องตกลงหมายเลขรอบในอนาคตและ Nonce ล่วงหน้าก่อนที่รอบนั้นจะถูกเผยแพร่
สำหรับผู้ที่สนใจโค้ดฉบับเต็มพร้อมระบบตรวจสอบอินพุตและตัวจัดการเวลา (Timeouts) สามารถเข้าไปศึกษาเพิ่มเติมได้ที่ไฟล์ verified-client.mjs บน GitHub ของโครงการ
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น