Implement in Your Contract
The process is similar to Chainlink VRF, but simpler.
Overview
This guide provides a step-by-step approach to implementing L1 VRF (Verifiable Random Function) on BitcoinL1. For the full implementation details, refer to the GitHub repository.
Prerequisites
Solidity development environment
Foundry/Forge for development and testing
Wrapped Bitcoin (WBTC) for fees
Key Implementation Steps
1. Set Up Your Consumer Contract
Inherit from
VRFConsumerBaseV2
Define critical VRF parameters:
uint8 private constant NUM_WORDS = 1; // Currently supports 1 random numberu int16 private _requestConfirmations = 2; uint32 private constant CALLBACK_GAS_LIMIT = 1500000; uint64 private constant SUB_ID = 0; bytes32 private constant KEY_HASH = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; address coordinatorAddress = 0x6868BdCA28c4731aada101945Ea83D0854eFBb29;
2. Implement Required Functions
Constructor initializing
VRFConsumerBaseV2
fulfillRandomWords()
method to process random numbersUtility functions for managing requests:
function getRequestConfirmations() public view returns (uint16); function setRequestConfirmations(uint16 requestConfirmations) public onlyOwner; function setCoordinator(address newCoordinator) public onlyOwner;
3. Subscription and Fee Management
Set up a subscription address
Ensure address has sufficient WBTC
Set allowance for coordinator
Be prepared to pay 0.000005 BTC per random number request
Randomness Request Flow
Call
requestRandomWord(VRFV2PlusClient.RandomWordsRequest calldata req)
Coordinator collects fee (0.000005 BTC in WBTC)
Fulfillment service calls
fulfillRandomWords()
Process random number in your contract
Security Considerations
Validate all inputs
Maintain WBTC balance
Monitor gas costs
Handle edge cases carefully
Development Setup
forge install openzeppelin/openzeppelin-contracts --no-commit
forge install smartcontractkit/chainlink --no-commit
Additional Resources
Chainlink VRF Documentation (for reference, not really needed for L1 VRF)
Last updated