Solidity

堅固性 |布朗尼:多次中獎彩票不起作用

  • October 12, 2021

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函式需要太多的氣體,你必須縮短它。

引用自:https://ethereum.stackexchange.com/questions/111465