Introduction
Chainlink Verifiable Random Function (Chainlink VRF) của là một bộ sinh số ngẫu nhiên có thể xác thực cho phép các smart contract truy cập đến các giá trị ngẫu nhiên off-chain mà không làm ảnh hưởng đến sự bảo mật và khả năng sử dụng của nó.
Với mỗi random number request, sẽ có một hoặc nhiều giá trị ngẫu nhiên được tạo ra và đi kèm với chúng là các bằng chứng mật mã (cryptographic proof) cho biết cách mà các giá trị ngẫu nhiên được hình thành.
Cryptographic proof sẽ được công khai và được xác thực on-chain trước khi các ứng dụng có thể sử dụng. Điều này đảm bảo các giá trị ngẫu nhiên không bị giả mạo hoặc thao túng bởi một thực thể nào đó, bao gồm các oracle operators, miner, user hoặc các smart contract developer.

Chainlink VRF hoạt động theo Basic Request Model of Chainlink.
Một cách giải thích khác:
Cite
Chainlink VRF provides randomness in 3 steps:
- Requesting Randomness: A smart contract makes a request for randomness by calling the
requestRandomnessfunction provided by the Chainlink VRF. This involves sending a request to the Chainlink oracle along with the necessary fees.- Generating Randomness: The Chainlink oracle node generates a random number off-chain using a secure cryptographic method. The oracle also generates a proof that this number was generated in a verifiable manner.
- Returning the Result: The oracle returns the random number along with the cryptographic proof to the smart contract. The smart contract can then use the random number, and any external observer can verify the proof to confirm the authenticity and integrity of the randomness.
Cách mà Chainlink node thu thập thông tin về số ngẫu nhiên và gọi hàm fulfillRandomWords (hay fulfillOracleRequest ở các phiên bản trước) của consumer:
Cite
The request for randomness is 100% reliant on events, because when
requestRandomWordsemits theRandomWordsRequestedevent, that gets picked up by the Chainlink nodes and the nodes use the information to provide the randomness service to you by calling back yourfulfillRandomWords. In the absence of the event, they wouldn’t know where and what to send.Reference: Video: Smart Contract Lottery - Refactoring events data - Foundry Fundamentals
Nói một cách ngắn gọn, Chainlink node phụ thuộc vào event được emit ra bởi VRF coordinator để có thể gọi hàm fulfillRandomWords của consumer.
Two Methods to Request Randomness
Chainlink hỗ trợ hai cách để request số ngẫu nhiên:
- Subscription: tạo một subscription1 và nạp vào một lượng LINK nhất định. Sau đó, chúng ta có thể kết nối đến nhiều consuming contract (consumer). Các consumer sẽ giúp chúng ta gửi request đến Chainlink VRF oracle2.
- Sử dụng cách này nếu cần gửi nhiều request thường xuyên.
- Không cần phải ước tính phí giao dịch mà chỉ cần đảm bảo subscription có đủ LINK token.
- Khuyến khích sử dụng cách này vì ta không cần phải thực hiện rút LINK token từ các consuming contract mà không còn được sử dụng.
- Direct funding: sử dụng consuming contract để gửi request đến Chainlink VRF oracle3.
- Sử dụng cách này nếu gửi các request rời rạc không thường xuyên.
- Cần phải ước tính phí giao dịch cẩn thận và đảm bảo consuming contract có đủ LINK token.
Important
Lưu ý: cần phải chuyển vào subscription hay consuming contract một lượng LINK token tối thiểu thì mới có thể sử dụng.
Tip
- Luôn fund consuming contract của Oracle trước khi gọi thực thi.
- Luôn đảm bảo có hàm withdraw trong consuming contract.
- Có thể specify gas limit nếu xảy ra lỗi không thể estimate gas.
Footnotes
-
Tạo ở đây VRF | Subscription Management (chain.link). Nhớ chú ý lưu lại subcription ID vì ta sẽ truyền giá trị này vào constructor của consuming contract khi deploy. ↩
-
Tham khảo thêm sample consuming contract của subscription: VRFv2Consumer.sol. ↩
-
Tham khảo thêm sample consuming contract của direct funding: VRFv2DirectFundingConsumer.sol. ↩