Solidity

執行 oraclize 回調函式的問題

  • April 28, 2019

我一直在嘗試使用 oraclize brigde 在私人網路上執行兩個契約。第一個執行完美,但是第二個由於某種原因不會呼叫回調函式(儘管已發送查詢),除非我從函式中刪除一些程式碼。這是其中程式碼的有問題的部分:

pragma solidity ^0.4.16;
import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract CFDBroker is usingOraclize {

  using strings for *;

  mapping (uint => uint) instruments;
  mapping (bytes32 => uint) queries;
  uint public GOLD;
  uint public EURUSD;
  uint public DJI;
////////////////////////////////////////////////////////////////////////////////

  function sendFunds() payable {

      getData();

  }
////////////////////////////////////////////////////////////////////////////////

  function __callback(bytes32 myid, string result, bytes proof) {

      require(msg.sender == oraclize_cbAddress());

      if (queries[myid] == 1){
          //parse and update gold
          var s = result.toSlice();
          GOLD = parseInt(s.beyond("$".toSlice()).until("/".toSlice()).toString())*100;
          instruments[1] = GOLD;

      } else{
          if(queries[myid] == 2){
              //parse and update eur/usd
              s = result.toSlice();
              var r = result.toSlice().beyond(".".toSlice());
              EURUSD = parseInt(s.beyond("$".toSlice()).until(".".toSlice()).concat(r));
              instruments[2] = EURUSD;

          } else{
              if(queries[myid] == 3){
                  //update DJI
                  DJI = parseInt(result)*100;
                  instruments[3]=DJI;

              }
          }
      }

      update();

      //getData(); --supposed source of the problem

  }

  /**
   *  Instrument IDs:
   *  0 - ASK FOR ALL
   *  1 - GOLD
   *  2 - EUR/USD
   *  3 - DJI
   */
  function getData() private{

      queries[oraclize_query(50, "WolframAlpha","gold price in usd")] = 1; //ask for gold
      queries[oraclize_query(50, "WolframAlpha","eur/usd")] = 2; // ask for eur/usd
      queries[oraclize_query(50, "WolframAlpha","DJI price")] = 3; //ask for DJI

  }}

它是一個差價合約經紀商模型,報價部分應該每 60 秒更新 3 種金融工具的價格。當回調中的 getData() 被註釋時,它工作正常。總而言之,看起來和這個問題很相似:link

該契約是我學生項目的一部分,我將非常感謝任何幫助:)。

來自 Oraclize 的 Marco 在這裡。我可以看到問題的兩個潛在根源:

  1. 合約餘額中沒有足夠的資金來支付三個新的查詢
  2. 沒有為回調函式提供足夠的氣體

您是否嘗試在回調中發送更多的 gas 或增加合約餘額?

首先,你應該檢查有沒有錯字。輸入函式是一個容易的錯誤。_callback__callback_,不僅_之前只有單。callback這是一個容易被忽視的!

其次,當您在 Remix 中時,導航到Settings,查看該Plugin區域並點擊外掛。Oraclize僅將 remix 與Oraclize您可以使用 oraclize 的模組綁定。如果您使用的是 web3/injected 提供程序,這意味著您使用的是 Rospten/Kovan 測試網或您的本地私有網路,您將收到以下消息:

此 Oraclize 外掛目前無法通過 web3/injected 提供程序進行混音。這僅適用於記憶體模式(JavaScript VM)。如果您想使用基於 Oraclize 的合約,請首先驗證 Oraclize 是否與您正在使用的區塊鏈集成 - 如果沒有,您可以通過專用的 ethereum-bridge 實例啟用它

所以你只能在 JavaScript VM 中使用 Oraclize,或者你需要為你的本地私有網路和像 Ropsten 這樣的測試網使用 ethereum-bridge。

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