Solidity
具有可證明的隨機預言機的多個回調
我正在製作一個簡單的彩票遊戲,其中有每小時、每天和每週的獎品。我的合約具有為每種遊戲類型挑選獲勝者的功能。每種遊戲類型都會有不同數量的參賽作品,我需要根據參賽作品的數量生成一個隨機數來選擇獲勝者。
例如
function chooseHourly() public { address HourlyWinner = pickWinner(hourlyParticipants); .. } function chooseDaily() public { address dailyWinner = pickWinner(dailyParticipants); ... } function chooseWeekly() public { address weeklyWinner = pickWinner(weeklyParticipants); ... } function __callback( bytes32 _queryId, string memory _result, bytes memory _proof ) public { require(msg.sender == provable_cbAddress()); if ( provable_randomDS_proofVerify__returnCode( _queryId, _result, _proof ) != 0 ) { revert("Proof verification failed."); } else { randomNumber = uint256(keccak256(abi.encodePacked(_result))); emit generatedRandomNumber(randomNumber); } } function pickWinner(Entry[] memory entries) internal returns(address) { uint256 QUERY_EXECUTION_DELAY = 0; uint256 GAS_FOR_CALLBACK = 200000; provable_newRandomDSQuery( QUERY_EXECUTION_DELAY, entries.length, GAS_FOR_CALLBACK ); //Need to return a winner somehow. If I pick winner here, it would probably use the previously generated number, not the one just requested. }
但是我需要等待回調函式在pickWinner中選擇獲勝地址,並且回調函式不知道它將是哪個遊戲。我不確定建構它的最佳方法。我真的不想為每種遊戲類型創建單獨的合約,但是每個合約是否可以有多個不同的 oracle 呼叫,或者是否有另一種方法可以解決這個問題?
您在查詢可證明時不能傳遞其他資訊,因此,當我們收到回調時,我們無法提供任何其他資訊,因為回調是由可證明發送給我們的
您可以為每個匹配項指定一個特定 id,然後使用該特定 id 呼叫 provable 當我們查詢 provable 並接收回調時,它為我們提供查詢 id 參數