Solidity

具有可證明的隨機預言機的多個回調

  • January 23, 2020

我正在製作一個簡單的彩票遊戲,其中有每小時、每天和每週的獎品。我的合約具有為每種遊戲類型挑選獲勝者的功能。每種遊戲類型都會有不同數量的參賽作品,我需要根據參賽作品的數量生成一個隨機數來選擇獲勝者。

例如

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 參數

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