Open1

Chainlink VRFを振り返る

ぽけなぽけな

Chainlink VRFのgetting startedはやったことあったけど、いざ実際に使おうと思った時に結構忘れてたので一問一答形式でメモ

今回やりたかったこと

  • オンチェーンでの抽選
  • 参加者の中から5人当選する

ドキュメントはどこ?

https://docs.chain.link/vrf/v2/subscription/examples/get-a-random-number

必要なパッケージは?

https://docs.chain.link/resources/create-a-chainlinked-project

Chainlink VRFって使う度にLINKが必要って聞いたけど、どう払うの?

以下の二つの方式がある

VRF direct funding

  • Chainlink VRFにランダム値を要求する度に、consuming contractsに対してLINKを送信する

Subscriptions

  • 予めSubscription AccountにLINKをdepositしておき、ランダム値を要求する度に勝手にそこから引かれていく

とりあえずSubscriptionsを使っておけば良さそう

Subscription Accountってどうやって作るの?

以下ダッシュボードから作れる
https://vrf.chain.link/

ランダム値を要求するコントラクトとSubscription Accountはどうやって紐づける?

  • コントラクト側:Subscription Account作成時に発行されるSubscriptionIDを登録する
  • Subscription Account側:ランダム値を要求してくるコントラクトのアドレスを登録する
    • addConsumer(address)

ランダム値を5個要求するのってどうやるの?

requestRandomWordsの引数であるnumWordsに5と入れてあげればいい

COORDINATOR.requestRandomWords(
            keyHash,
            s_subscriptionId,
            requestConfirmations,
            callbackGasLimit,
            numWords
        );

fulfill時は配列で返ってくる

function fulfillRandomWords(uint256 _requestId,uint256[] memory _randomWords)

https://docs.chain.link/vrf/v2/subscription/examples/get-a-random-number

上で出てきたkeyHash, callbackGasLimitは何設定すればいいの?

keyHash

  • 各ネットワークに一般道、高速道路、新幹線のようにレーンがあって、それぞれに対応しているHashがある感じ
  • 例えばEthereum mainnetだと、200 gwei, 500 gwei, 1000gweiの3つがある
  • お金と速度のトレードオフっぽい
    https://docs.chain.link/vrf/v2/subscription/supported-networks

callbackGasLimit

  • fulfillコール時のガスリミット
  • 一つのランダム値を登録するのに20,000ガスくらいかかるらしい
  • exampleでは、3つのランダム値を登録する場合はちょい多めの100,000を設定してる
  • fulfill時の処理のよって要調整

ランダム値を範囲指定したい場合は?

シンプルに剰余を使おう

function fulfillRandomWords(
  uint256, /* requestId */
  uint256[] memory randomWords
) internal override {
  // Assuming only one random word was requested.
  s_randomRange = (randomWords[0] % 50) + 1;
}

https://docs.chain.link/vrf/v2/best-practices#getting-a-random-number-within-a-range

テストどうやるの?

  • 本来Chainlink側が用意してくれるSubscription Accountと、ランダム値を登録してくれるコントラクトを自前でローカルやテストネットにデプロイすればOK
  • 当然、自分でfulfillをコールする必要がある(値は上手いこと計算してくれる)
    https://docs.chain.link/vrf/v2/subscription/examples/test-locally