
vrf的使用
官方文档 使用教程在Getting Started里 查询各个网络的参数在Supported Networks里
案例代码
触发请求,生成requestId
uint256 requestId = s_vrfCoordinator.requestRandomWords(
VRFV2PlusClient.RandomWordsRequest({
keyHash: i_gasLane, // 最大的gas价格级别
subId: i_subscriptionId, // 订阅id
requestConfirmations: REQUEST_CONFIRMATIONS, // 需要被多少个chainLink节点验证
callbackGasLimit: i_callbackGasLimit, // 调用回填方法所消耗的最大的gas数量
numWords: NUM_WORDS, // 请求回来的随机数个数
extraArgs: VRFV2PlusClient._argsToBytes(
VRFV2PlusClient.ExtraArgsV1({nativePayment: false}) // 是用LINK支付还是eth支付
)
})
);
详细参数解释:https://docs.chain.link/vrf/v2-5/getting-started#contract-variables 另外不同的网络对某些参数的最大值有限制
回填随机数
function fulfillRandomWords(
uint256,
uint256[] calldata randomWords
) internal override {
uint256 indexOfWinner = (randomWords[0] % s_players.length);
address payable winner = s_players[indexOfWinner];
s_recentWinner = winner;
}
操作说明
创建订阅
控制面板:https://vrf.chain.link/
点击Create Subscription
邮箱,程序名称填写对应的信息,然后点击Create
钱包弹窗签名,然后等待确认

添加资金
往订阅号里,添加LINK

添加消费者
将我们的合约地址填入订阅,作为消费者

领水地址
https://faucets.chain.link/sepolia

安装依赖
chainlink的vrf2.5项目地址:https://github.com/smartcontractkit/chainlink-brownie-contracts
forge install /smartcontractkit/chainlink-brownie-contracts
我自己Fork的项目地址:https://github.com/minner-fun/chainlink-brownie-contracts/tree/fix/vrfV2_5Mock 由于官方给的V2_5Mock文件会报构造函数参数的错误,所以我进行了一点修改,给构造函数添加了一个用不到的参数
// lib\chainlink-brownie-contracts\contracts\src\v0.8\vrf\mocks\VRFCoordinatorV2_5Mock.sol
constructor(uint96 _baseFee, uint96 _gasPrice, int256 _weiPerUnitLink) SubscriptionAPI(msg.sender) {
i_base_fee = _baseFee;
i_gas_price = _gasPrice;
i_wei_per_unit_link = _weiPerUnitLink;
setConfig();
}
//lib\chainlink-brownie-contracts\contracts\src\v0.8\vrf\dev\SubscriptionAPI.sol
constructor(address _sender) ConfirmedOwner(msg.sender) {
address sender = _sender;
}
Mock
需要部署VRFCoordinatorV2_5Mock, LinkToken,实际案例
创建订阅,充值,添加消费者
在本地链调试的时候需要全套的vrf功能。实际案例