Open1
Chainlink VRFを振り返る
Chainlink VRFのgetting startedはやったことあったけど、いざ実際に使おうと思った時に結構忘れてたので一問一答形式でメモ
今回やりたかったこと
- オンチェーンでの抽選
- 参加者の中から5人当選する
ドキュメントはどこ?
必要なパッケージは?
Chainlink VRFって使う度にLINKが必要って聞いたけど、どう払うの?
以下の二つの方式がある
VRF direct funding
- Chainlink VRFにランダム値を要求する度に、consuming contractsに対してLINKを送信する
Subscriptions
- 予めSubscription AccountにLINKをdepositしておき、ランダム値を要求する度に勝手にそこから引かれていく
とりあえずSubscriptionsを使っておけば良さそう
Subscription Accountってどうやって作るの?
以下ダッシュボードから作れる
ランダム値を要求するコントラクトと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)
上で出てきた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;
}
テストどうやるの?
- 本来Chainlink側が用意してくれるSubscription Accountと、ランダム値を登録してくれるコントラクトを自前でローカルやテストネットにデプロイすればOK
- 当然、自分で
fulfill
をコールする必要がある(値は上手いこと計算してくれる)
https://docs.chain.link/vrf/v2/subscription/examples/test-locally