Solidity

使用範例合約時 Oraclize 無法返回數據

  • October 3, 2017

我正在嘗試使用https://github.com/oraclize/ethereum-examples/tree/master/solidity上的範例 Oraclize 契約,包括KrakenPriceTicker.sol. 這是我的契約(稍作修改):

pragma solidity ^0.4.0;
import "github.com/oraclize/ethereum-api/oraclizeAPI_0.4.sol";

contract KrakenPriceTicker is usingOraclize {

   string public ETHXBT;
   uint public timesCalled;
   uint public timesFailed;

   event newOraclizeQuery(string description);
   event newKrakenPriceTicker(string price);


   function KrakenPriceTicker() payable {
       oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
   }

   function __callback(bytes32 myid, string result, bytes proof) {
       ETHXBT = result;
       newKrakenPriceTicker(ETHXBT);
       update();
   }

   function update() payable {
       if (oraclize_getPrice("URL") > this.balance) {
           newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee");
           timesFailed++;
       } else {
           newOraclizeQuery("Oraclize query was sent, standing by for the answer..");
           oraclize_query(60, "URL", "json(https://api.kraken.com/0/public/Ticker?pair=ETHXBT).result.XETHXXBT.c.0");
           timesCalled++;
       }
   }

}

update()呼叫該函式並發送一些乙太和氣體時,它應該呼叫 kraken.com api 並ETHXBT使用返回的值更新 的值。但是, 的值ETHXBT始終為空。我知道oraclize_query正在呼叫,因為timesCalled變數確實增加了。因此,返回的結果似乎存在問題,儘管直接訪問https://api.kraken.com/0/public/Ticker?pair=ETHXBT顯示應該沒有任何問題。

我已經在https://ropsten.etherscan.io/address/0x2c51daecf702f2afe3abee2cc84570ee17f75650部署了上述契約(我嘗試update()過多次呼叫)。

看起來該查詢正在 Oraclize 測試站點上執行。你可以看到它在這里工作。它有一個請求,例如:

json(https://api.kraken.com/0/public/Ticker?pair=ETHXBT).result.XETHXXBT.c[0]

回應0.068000

當您使用.result.XETHXXBT.c.0而不是時,您的語法似乎不正確,.result.XETHXXBT.c[0]因為結果是一個數組而不是一個名為的鍵0

問題是我使用的 ropsten 測試網路有問題。我相信我發布的程式碼應該可以正常執行。

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