Solidity
已解決 CHAINLINK VRF V2 不呼叫回調函式 fulfillRandomWords()
我有以下程式碼使用 REMIX Injected Web3 部署到 AVALANCHE FUJI TESTNET
import '@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol'; import '@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol'; contract ULotto is VRFConsumerBaseV2{ VRFCoordinatorV2Interface COORDINATOR; //values for CHAIN Link Integration uint64 s_subscriptionId; address vrfCoordinator = 0x2eD832Ba664535e5886b75D64C46EB9a228C2610; bytes32 s_keyHash = 0x354d2f95da55398f44b7cff77da56283d9c6c829a4bdf1bbcaf2ad6a4d081f61; uint32 callbackGasLimit = 2000000; uint16 requestConfirmations = 3; uint32 numWords = 6; uint256[] public s_results; constructor(uint64 subscriptionId) VRFConsumerBaseV2(vrfCoordinator){ owner = msg.sender; lotteryIdCounter = 1; COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); s_subscriptionId = subscriptionId; } function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override { s_results = randomWords; } function drawNumbers() public onlyOwner returns (uint256 requestId){ //dragons require logic here requestId = COORDINATOR.requestRandomWords( s_keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords ); } }
當我呼叫抽獎號碼時,我可以從 testnet.snowtrace.io/ 看到對我的函式的回調有錯誤。
有人可以指出我正確的方向嗎?
有一些事情需要檢查這樣的問題。
- 檢查契約是否是 VRF 訂閱中的消費者,正如上面提到的 Richard Horrocks
- 仔細檢查您為契約提供了正確的訂閱 ID
- 嘗試執行該
fulfillRandomWords
函式以查看氣體需求。如果涉及回調中的邏輯,通常callbackGasLimit
需要增加 will。
對於將來可能會查看此問題的任何人。
作為總結,您需要關注回复的 2 位理查茲的回饋。
要考慮的重要一點是如何處理 randomWords。盡量使內容
fulfillRandomWords()
簡單,可能只是保存uint256[] randomWords
. 我有循環來處理我的響應,我認為這就是導致交易為out of gas
or的原因revert
。