Ich versuche, die Oraclize-Beispielverträge unter https://github.com/oraclize/ethereum-examples/tree/master/solidity zu verwenden , einschließlich KrakenPriceTicker.sol
. Hier ist mein Vertrag (sehr leicht modifiziert):
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++;
}
}
}
Wenn die update()
Funktion aufgerufen und etwas Äther und Gas mitgeschickt wird, sollte sie die kraken.com-API aufrufen und den Wert von ETHXBT
mit dem aktualisieren, was zurückgegeben wird. Der Wert von ETHXBT
ist jedoch immer leer. Ich weiß, dass der oraclize_query
aufgerufen wird, weil die timesCalled
Variable inkrementiert. Es scheint also ein Problem mit dem zurückgegebenen Ergebnis zu geben, obwohl ein direkter Aufruf von https://api.kraken.com/0/public/Ticker?pair=ETHXBT zeigt, dass es kein Problem geben sollte.
Ich habe den obigen Vertrag unter https://ropsten.etherscan.io/address/0x2c51daecf702f2afe3abee2cc84570ee17f75650 bereitgestellt (ich habe mehrmals versucht anzurufen update()
).
Es sieht so aus, als ob die Abfrage auf der Oraclize-Testseite funktioniert. Sie können sehen, wie es hier funktioniert . Es hat eine Anfrage wie:
json(https://api.kraken.com/0/public/Ticker?pair=ETHXBT).result.XETHXXBT.c[0]
mit einer Antwort von0.068000
Es scheint, dass Ihre Syntax falsch ist, wenn Sie .result.XETHXXBT.c.0
statt verwenden, .result.XETHXXBT.c[0]
da das Ergebnis ein Array und kein benannter Schlüssel ist0
Das Problem war, dass das Ropsten-Testnetzwerk, das ich verwendete, Probleme hatte. Ich glaube, der Code, den ich gepostet habe, sollte normalerweise gut laufen.