在链链VRF中获得历史随机数的最佳实践是什么?



在项目中,我依靠Chainlink VRF来获得一个随机单词来决定抽奖获胜者,但我未能在VRF订阅中保持最小的LINK余额,因此所有请求都待处理。(我认为交易没有成功发送,所以我错误地调用了该函数几次)。

在我将一些Link令牌转移到我的VRF订阅后,所有的随机数都被发送到我的合约中。在这种情况下,我只需要这些随机单词中的第一个用于抽奖,但我不确定现在存储在智能合约中的随机单词是否为第一个。

如果基于随机单词的交易由于某种原因没有成功,那么在历史上哪里可以找到随机单词,以便这些交易可以重新发送?

我的问题是:

获得Chainlink VRF生成的历史随机词的最佳实践是什么?

提前感谢。

在做了一些调查之后,我会回答这个问题。

最好的做法是在你的智能合约中保持随机单词的数组,或者你可以在你的消费者智能合约的fulfillment函数中添加一个事件来记录requestId和相应的随机单词。

但如果没有事件或其他变量来记录智能合约中的随机单词,您可以执行以下操作:

  1. 从智能合约VRFCoordinatorV2中的事件RandomWordsFulfilled中获取requestId和randomness,可以在VRF节点发送的交易中找到。
emit RandomWordsFulfilled(requestId, randomness, payment, success);
  1. VRFCoordinatorV2智能合约的RandomWordsRequested事件中获取numWords
emit RandomWordsRequested(
keyHash,
requestId,
preSeed,
subId,
requestConfirmations,
callbackGasLimit,
numWords,
msg.sender
);
  1. 随机字是由以下逻辑中的randomness和numWords生成的,该逻辑在智能合约VRFCoordinatorV2fulfillRandomWords函数中定义。您可以使用相同的逻辑来获取历史随机单词。
for (uint256 i = 0; i < numWords; i++) {
randomWords[i] = uint256(keccak256(abi.encode(randomness, i)));
}

相关内容

最新更新