回調函式未觸發
我有這份契約。
pragma solidity >= 0.4.0; import "./oraclizeApi.sol"; contract USDPrice is usingOraclize { string public price; address public owner; event Log(string text); function USDPrice() { Log("Contract created."); owner = msg.sender; OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475); oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS); oraclize_setCustomGasPrice(20000000000 wei); } function getPrice() constant returns (string) { return price; } function __callback(bytes32 _myid, string _result){ require (owner == oraclize_cbAddress()); revert(); Log("Intra in callback"); Log(_result); price = _result; // let's save it as $ cents } function update() payable { if (oraclize_getPrice("URL") > this.balance) { Log("Not working"); // "Oraclize query was NOT sent, please add some ETH to cover for the query fee } else { // Oraclize can be queried oraclize_query(0,"URL", "https://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new"); Log("Working"); } } }
要部署它,我正在使用 Remix IDE 和 web3 提供程序( localhost:8545 我有我的 geth 連接和帳戶)。當我想執行更新功能時,它正在工作,查詢被發送,但回調函式沒有交易/觸發,我沒有得到任何結果。同樣在 Remix 控制台中我沒有錯誤。我不知道該怎麼做。誰能幫我?
使用者Rick Park的回答非常接近,因為您的
__callback
函式的第一行存在問題。您似乎有兩個 arequire
來檢查錯誤的變數, & 它後面緊跟著 arevert
。因此,即使要求通過,它也會立即觸發 revert 語句,因此您不會收到回調。您需要:
function __callback(...) public { require(msg.sender == oraclize_cbAddress()); // ... }
或者:
function __callback(...) public { if(msg.sender != oraclize_cbAddress()) revert(); // ... }
**注意:**前者是您將在 Solidty 中看到的更標準/慣用的方法。
第二件事要注意的是,如果您使用 Remix,則需要
Oraclize
通過右上角的設置選項卡載入外掛。這將載入 Oraclize 用於在本地網路環境(例如您正在使用的)中正確進行回調的幕後的 infastrucutre。如果你想完全本地化,你總是可以開始使用 Truffle 來管理和測試你的合約,並且 Oraclize 有他們的合約的 Truffle 版本供你閱讀。
您的回調永遠不會以這種方式工作。在這裡觀看:
require (owner == oraclize_cbAddress()); revert();
第一行顯然應該被觸發,因為所有者(你的契約中的一個公共變數,僅此而已!)永遠是空的或與 oraclize_… 不同,因為沒有人寫 oraclize_… 給它。所以 require 觸發器立即恢復。
但是,在奇怪的情況下,這裡沒有顯示的人應該寫 oraclize_… 在所有者中,你有一個明確的“恢復”,它應該被觸發。
似乎您將 require 解釋為“if”,但 require 不是那樣。
開始糾正這一點。
順便說一句,程式碼中還有一些其他錯誤。Fi 任何事件觸發器都寫為
emit Log(“Hi!”);
沒有發出它根本不應該編譯!你是怎麼測試的?
希望這可以幫助!