執行 oraclize 回調函式的問題
我一直在嘗試使用 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 在這裡。我可以看到問題的兩個潛在根源:
- 合約餘額中沒有足夠的資金來支付三個新的查詢
- 沒有為回調函式提供足夠的氣體
您是否嘗試在回調中發送更多的 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。