Solidity
使用範例合約時 Oraclize 無法返回數據
我正在嘗試使用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 測試網路有問題。我相信我發布的程式碼應該可以正常執行。