在项目中,我依靠Chainlink VRF来获得一个随机单词来决定抽奖获胜者,但我未能在VRF订阅中保持最小的LINK余额,因此所有请求都待处理。(我认为交易没有成功发送,所以我错误地调用了该函数几次)。
在我将一些Link令牌转移到我的VRF订阅后,所有的随机数都被发送到我的合约中。在这种情况下,我只需要这些随机单词中的第一个用于抽奖,但我不确定现在存储在智能合约中的随机单词是否为第一个。
如果基于随机单词的交易由于某种原因没有成功,那么在历史上哪里可以找到随机单词,以便这些交易可以重新发送?
我的问题是:
获得Chainlink VRF生成的历史随机词的最佳实践是什么?
提前感谢。
在做了一些调查之后,我会回答这个问题。
最好的做法是在你的智能合约中保持随机单词的数组,或者你可以在你的消费者智能合约的fulfillment
函数中添加一个事件来记录requestId和相应的随机单词。
但如果没有事件或其他变量来记录智能合约中的随机单词,您可以执行以下操作:
- 从智能合约
VRFCoordinatorV2
中的事件RandomWordsFulfilled
中获取requestId和randomness,可以在VRF节点发送的交易中找到。
emit RandomWordsFulfilled(requestId, randomness, payment, success);
- 从
VRFCoordinatorV2
智能合约的RandomWordsRequested
事件中获取numWords
emit RandomWordsRequested(
keyHash,
requestId,
preSeed,
subId,
requestConfirmations,
callbackGasLimit,
numWords,
msg.sender
);
- 随机字是由以下逻辑中的randomness和numWords生成的,该逻辑在智能合约
VRFCoordinatorV2
的fulfillRandomWords
函数中定义。您可以使用相同的逻辑来获取历史随机单词。
for (uint256 i = 0; i < numWords; i++) {
randomWords[i] = uint256(keccak256(abi.encode(randomness, i)));
}