Solidity
堅固性 |布朗尼:多次中獎彩票不起作用
Github 儲存庫位於此處:https ://github.com/supsam89/digiwear_nft_drop
我遇到問題的命令是
brownie run scripts/deploy.py
我正在嘗試部署一個掉落/彩票合約,該合約會根據參賽者隨機挑選多個獲勝者(然後最終將 NFT 轉移給他們)。
當我結束丟棄/彩票功能時,它要麼花費太長時間(氣體密集),要麼不起作用。執行後
time.sleep(60)
狀態保持為“計算中的獲勝者”。我認為導致 NFTDrop.sol 中的問題的功能:
function endDrop() public onlyOwner { drop_state = DROP_STATE.CALCULATING_WINNERS; bytes32 requestId = requestRandomness(keyhash, fee); emit RequestedRandomness(requestId); } function fulfillRandomness(bytes32 _requestId, uint256 _randomness) internal override { require( drop_state == DROP_STATE.CALCULATING_WINNERS, "Not calculating winners yet!" ); require(_randomness > 0, "randomness-not-found"); uint256[] memory expandedValues = expand(_randomness, tokenAmount); for (uint256 i = 0; i < tokenAmount; i++) { uint256 indexOfWinner = expandedValues[i] % entrants.length; recentWinner = entrants[indexOfWinner]; winners.push(recentWinner); } drop_state = DROP_STATE.CLOSED; randomness = _randomness; } function expand(uint256 _randomness, uint256 _numberOfTokens) public pure returns (uint256[] memory expandedValues) { expandedValues = new uint256[](_numberOfTokens); for (uint256 i = 0; i < _numberOfTokens; i++) { expandedValues[i] = uint256(keccak256(abi.encode(_randomness, i))); } return expandedValues; }
任何對問題的幫助或關於如何更好地編碼的建議將不勝感激!
提前致謝。
根據Chainlink 文件。
回調的最大 Gas 如果您的 fulfillRandomness 函式使用超過 200k 的 gas,交易將失敗。
你的
fulfillRandomness
函式需要太多的氣體,你必須縮短它。