Oracles

回調函式未觸發

  • December 23, 2018

我有這份契約。

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來檢查錯誤的變數, & 它後面緊跟著 a revert。因此,即使要求通過,它也會立即觸發 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!”);

沒有發出它根本不應該編譯!你是怎麼測試的?

希望這可以幫助!

引用自:https://ethereum.stackexchange.com/questions/64503