我正在尝试使用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()函数并发送一些以太和gas时,它应该调用kraken.com api,并使用返回的内容更新ETHXBT的值。但是,ETHXBT的值始终是空的。我知道oraclize_query正在被调用,因为timesCalled变量是增量的。因此,返回的结果似乎存在问题,尽管直接转到https://api.kraken.com/0/public/Ticker?pair=ETHXBT显示不应该有任何问题。
我已经在https://ropsten.etherscan.io/address/0x2c51daecf702f2afe3abee2cc84570ee17f75650上部署了上面的合同(我尝试过多次调用update() )。
发布于 2017-10-02 11:51:55
看起来该查询正在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的键。
发布于 2017-10-03 02:10:47
问题是我正在使用的萎缩测试网络有问题。我认为我发布的代码应该运行正常。
https://ethereum.stackexchange.com/questions/27500
复制相似问题