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 numbers

  • Utility 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

  1. Call requestRandomWord(VRFV2PlusClient.RandomWordsRequest calldata req)

  2. Coordinator collects fee (0.000005 BTC in WBTC)

  3. Fulfillment service calls fulfillRandomWords()

  4. 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

Last updated