สุ่มผู้โชคดีในโลก web3 ด้วย Chainlink VRF
การสุ่มอะไรสักอย่างนั้น ไม่ใช่เรื่องที่เราเองคาดเดาอะไรได้เลย นอกจากขอสิ่งศักดิ์สิทธิ์ในใจ ถ้าในโลก developer ปกติ เราจะใช้ function random ต่าง ๆ กัน เช่น Math.random()
และในโลก web3 นั้น เขาทำเหมือนกันไหมนะ?
ในวันนี้จะมาเล่าถึงการสุ่มในโลก web3 กันว่าทำยังไง โดยจะเล่าเกี่ยวกับ Chainlink VRF นี่แหละ เพราะการสุ่มรางวัลให้ผู้โชคดีนั้น เราทุกคนก็ต้องการความโปร่งใส ตรวจสอบได้ กันข้อครหาว่าเนี่ยดรอปให้เพราะเป็นกระเป๋าอินฟลูหรือเปล่า
Disclaimer: ทั้งหมดเป็นการ research ไม่ได้ลองในการ implement จริงแต่อย่างไร เพียงแค่อธิบายวิธีการทำงาน
Chainlink คืออะไร?
Chainlink เป็น web3 service platform ที่มีการ connect กับผู้คน ธุรกิจ และ data เพื่อก้าวสู่โลก web3 ในอนาคต แล้วก็เป็น data oracle ที่อยู่บนเชน Ethereum และมีเหรียญประจำ platform ว่า LINK
oracle เป็นตัวที่อัพเดตข้อมูลต่าง ๆ ในโลก blockchain เพื่อให้ข้อมูลที่มีการอัพเดตถูกต้อง แม่นยำอยู่เสมอ เช่น เว็บที่ swap เหรียญต่าง ๆ ก็ใช้ข้อมูลจาก oracle ในการบอก rate ในการแลกเปลี่ยนเหรียญคริปโตต่าง ๆ
ตัวอย่าง
อ่านเกี่ยวกับ blockchain และ oracles เพิ่มเติมได้ที่นี่เลย
สำหรับ Ecosystem ต่าง ๆ สามารถอ่านได้ที่นี่เลย
การเขียน function สุ่มในโลก web2
แน่นอนว่า developer อาจจะผ่านการใช้ function random มาไม่มากก็น้อยเนอะ
ในภาษา javascript เราจะใช้ Math.random()
ในการสุ่มกัน โดยค่าที่ได้จาก function นี้ มีค่าระหว่าง 0 - 1 นะ
ถ้าเราอยากสุ่มจากจำนวนผู้โชคดีทั้งหมดล่ะ?
สมมุติให้ผู้โชคดีทั้งหมด 1687 คน ลองเอาจำนวนผู้โชคดีไปคูณสิ Math.random() * 1687
มันจะได้ผลลัพธ์ระหว่าง 0 - 1686 แต่ไม่น่ามีคนที่ 0 ไหมนะ
และพบว่าเราได้ผลลัพธ์ที่เป็นจำนวนทศนิยมมาด้วย ซึ่งเราไม่ต้องการรรรรรร คนมันแบ่งทศนิยมบ่าได้ก๊ะะะะะ
ดังนั้นเราจึงใส่ Math.floor()
ครอบเข้าไป เพื่อคืนค่าออกมาเป็นเลขจำนวนเต็มเนอะ โดยมันจะปัดเศษลงนะ เพราะถ้าปัดขึ้น มันก็ดูเกินจำนวนผู้โชคดีไป
แล้วบวกด้วย 1 เพื่อให้ได้ผลลัพธ์ระหว่าง 1 - 1687 เนอะ
Math.floor(Math.random() * 1687) + 1
ทำความรู้จัก Chainlink VRF กัน
Chainlink VRF (Verifiable Randomness Function) เป็นเทคโนโลยีที่ใช้ในระบบเครือข่าย Blockchain ซึ่งถูกพัฒนาโดย Chainlink ใช้ในการสุ่มผู้ชนะ ผ่าน smart contract นั่นเอง
กิจกรรมที่ใช้ Chainlink VRF ในการสุ่มแจกของรางวัล จะเป็นประมาณว่า คนร่วมกิจกรรมได้ตั๋วเพื่อมาเพื่อลุ้นของรางวัลกองกลาง
Flow การทำงานคร่าว ๆ
- ตัว smart contract ขอ request ไปที่ Chainlink ว่าขอสุ่มนะ
- Chainlink จะ generate ตัวที่ random และส่งการ proof ไปยัง contract ของ VRF
- ตัว contract ของ VRF จะทำการ verify
- ตัว smart contract ของตัวแอพได้รับตัว random ที่ผ่านการ verify
Algorithm เบื้องหลังการสุ่มเป็นยังไงบ้างนะ?
หลักการสุ่มคร่าว ๆ คือมันจะเข้า function ที่ชื่อว่า fulfillRandomWords()
โดยมีตัว parameter ตัวนึงคือ randomWords
เป็น type uint256
ภาษาชาวบ้านคือตัวเลขชุดนึงนั่นแหละ ได้มาจากการ random จากฝั่ง Chainlink
โดยเลขตั๋วที่ถูกรางวัลนั้น คือ randomWords
เอามา mod ด้วยจำนวนตั๋วทั้งหมด + 1 นั่นเอง
การขอสุ่ม
มีอยู่ 2 วิธีด้วยกัน คือ
- Subscription: สร้าง subscription account และใส่ $LINK ไว้ใน account เราสามารถ connect ได้หลาย ๆ smart contract ใน account นั้น เมื่อเราขอใช้ function ในการสุ่ม ค่าใช้จ่ายจะถูกคำนวณเมื่อเราขอใช้ function ในการสุ่มทำงานเสร็จเรียบร้อย
- Direct funding จะจ่ายด้วย $LINK โดยตรง เมื่อมีการเรียกใช้ function ในการสุ่ม ซึ่งใน account ของเราจะต้องมี $LINK เพียงพอในการตัดเงินด้วยนะ
ซึ่งทางเราอ่านแล้วงง ๆ นิดหน่อย แต่ก็ต้องอ่าน เพราะ document จะแยกสองส่วนนี้ออกเหมือนกัน เขามี compare แต่ละอันว่าแต่ละอันต่างกันยังไง เพื่อให้เลือกใช้งานได้ถูกต้องเนอะ
แล้วรองรับ chain อะไรบ้างนะ?
ตัว Chainlink VRF เขา support หลาย ๆ เชน ทั้ง mainnet และ testnet เลย ไม่ว่าจะเป็น Ethereum, BNB Chain, Polygon, Avalanche, Fantom และล่าสุดรองรับ Arbitrum ด้วยนะ
เว็บไหนที่ใช้ Chainlink VRF ในการสุ่ม เขาจะมี badge บน website ว่า Randomness SECURED WITH CHAINLINK ด้วยนะ
อยากรู้เพิ่มเติมอ่านที่ไหนดี?
สามารถอ่าน developer document เพิ่มเติมได้ที่นี่เลย
อันนี้เว็บหลักของ Chainlink VRF
ส่วน cost สามารถ estimate ได้ที่นี่เลย
Use Case
หลาย ๆ โปรเจกต์บนโลก web3 ใช้ Chainlink VRF ในการสุ่มรางวัล เพื่อความโปร่งใส และสามารถตรวจสอบได้
Metasaurs
เป็นโปรเจกต์ NFT ที่เป็นไดโนเสาร์ของ Dr. DMT บนเชน Ethereum โดยมีส่วนผสมระหว่าง BAYC Ape #4588 กับตัว T-Rex มาเป็นไดโนเสาร์จำนวน 9999 ชิ้น
เมื่อทำการ mint จบแล้ว เขามีสุ่มรางวัลแจกรถบรรทุก Ford Raptor ปี 2021 และรถกระบะที่แต่งด้วย Metasaurs เลยใช้ Chainlink VRF เพื่อความโปร่งใส และตรวจสอบได้ในการสุ่มรางวัลมูลค่าสูงนั่นเอง
LooksRare
NFT Marketplace มีแคมเปญ LooksRare Raffles ตามความเข้าใจของเรา คือ ซื้อตั๋วมาลุ้นของใน pool อันประกอบด้วยรางวัล blue-chip NFT และ LOOKS tokens วิธีการร่วมสนุก คือ login ด้วย metamask และมีเหรียญ ETH ในจำนวนที่กำหนด และ cover ค่า gas ด้วย การจับรางวัลจะจับรางวัลเมื่อมีจำนวนตั๋วทั้งหมดตามเงื่อนไขที่กำหนดในแคมเปญ
ดูประวัติการ raffle ของ LooksRare ได้ที่นี่จ้า
Tripster
เป็นโปรเจกต์เกี่ยวกับการท่องเที่ยว ที่เป็น travel-to-earn โปรเจกต์แรกบนโลก blockchain ซึ่งหลาย ๆ คนอาจจะเคยเห็น NFT ของโปรเจกต์นี้ ที่เป็นน้องอุ๋งกันมาบ้างแล้วเนอะ มี utility หลัก ๆ คือ referral link ซื้อของตามเว็บ partner ต่าง ๆ แล้วได้รับ cashback คืน แล้วก็มี business model ที่แข็งแรง และใช้งานได้จริงบนโลก web2 ด้วยนะ
และเขากำลังจะมีแคมเปญ Lucky Box ที่ใคร ๆ ก็สามารถร่วมสนุกได้ ไม่จำเป็นต้องเป็น holder ก่อนหน้านี้มีรอบ test บน testnet ไป 2 รอบ และรอบที่สองเขาได้ใช้ Chainlink VRF ในการสุ่มของรางวัลใหญ่ที่สุดด้วยนะ
ในส่วนของ Tripster เราได้เขียนเล่าไว้แล้ว สามารถอ่านได้ที่นี่เลย
เราจะตรวจสอบผลได้อย่างไร?
ทางเราได้ลองเข้าไปดูผู้โชคดีกิจกรรม Lucky Box รอบเทสรอบที่ 2 ของ Tripster ซึ่งเขานำ Chainlink VRF มา implement หาผู้โชคดีรางวัลใหญ่ที่สุดในรอบเทสนี้เนอะ ซึ่งตอน community call ทางพี่ ๆ ได้บอกว่าการสุ่มนั้นจะมีค่าใช้จ่ายในการสุ่มด้วย ในรอบจริงจะไม่สุ่มทุกรางวัล จะสุ่มเฉพาะของที่มีมูลค่าสูง เช่น iPhone 14, NFT
บน website ตัว dev จะมีประกาศผู้โชคดีที่ได้รับของรางวัล ซึ่งเราสามารถเข้าไปดูข้อมูลพวกนี้ได้ด้วยนะ จะมี Chainlink SubId, Chainlink TX และ Contact Address
Chainlink SubId
เป็นหน้าของ Chainlink VRF Subscription Detail ของตัว Tripster ว่า Subscription ID นี้มีการทำอะไรมาบ้าง สามารถดูประวัติต่าง ๆ ได้ และมีค่าใช้จ่ายในการ consume เป็น $LINK
Chainlink TX
เข้าใจว่าอันนี้เป็น transaction ในการสร้าง Chainlink VRF Subscription Detail
Contact Address
อันนี้เป็นตัว smart contract ของการใช้ Chainlink VRF ในการสุ่มผู้โชคดีที่ได้รับรางวัล
อยากทดลองเล่นบ้าง
เราสามารถเข้าไปลองเล่นบน testnet ได้นะ ที่เว็บนี้เลย
ทดลองโดยการกด Create Subscription ทำการเชื่อมต่อกระเป๋า จะมีการ sign message และเสียค่า gas ด้วยนิดหน่อย ในการสร้างตัว Subscription เราก็จะมีตัว Subscription ไว้ใช้สุ่มแล้วล่ะ สร้าง consumers ข้างในได้ด้วย ซึ่งเขาต้องการ address ของ smart contract ที่เราต้องการสุ่มเนอะ
บน testnet ต้องใช้ ETH เป็นค่า gas (ในที่นี้เราเล่น Sepolia เนอะ) แล้วก็ LINK สามารถไปขอได้ที่
ทั้งหมดที่เรา research มาก็จะเป็นประมาณนี้เนอะ ผิดพลาดประการใดขออภัยด้วยค่า //ไหว้ย่อ
ติดตามข่าวสารตามช่องทางต่าง ๆ และทุกช่องทางโดเนทกันไว้ที่นี่เลย
ติดตามข่าวสารแบบไว ๆ มาที่ Twitter เลย บางอย่างไม่มีในบล็อก และหน้าเพจนะ