Contract-Development

使用 Oraclize 為另一個合約變數賦值

  • June 30, 2016

我正在使用 oraclize 使用以下程式碼獲取價格資訊:

import "oraclizeAPI.sol";

contract PriceFeed is usingOraclize{
 uint public BTCUSD;

 function PriceFeed(){
   oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
   update(0); // first check at contract creation
 }

 function __callback(bytes32 myid, string result, bytes proof) {
   if (msg.sender != oraclize_cbAddress()) throw;
   BTCUSD = parseInt(result, 2); // save it as $ cents
   // The following line is what I do which ends up with the error message
  //MyContract.BTCUSD = BTCUSD;

   update(360); // schedule another check in 60 seconds
 }

 function update(uint delay){
   oraclize_query(delay, "URL",
     "json(https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD).USD");
 }
}

現在我在同一個文件中有第二個合約,它有一個名為 BTCUSD 的變數。當我從 oraclize 獲得回調時,我需要更新該變數。我嘗試了多種方法,使用 MyContract.BTCUSD = BTCUSD 樣式分配在兩個合約上編寫了 setter/getter 方法,但我得到了錯誤。

contract MyContract {
 uint public BTCUSD;
}

我在 atom 上使用 linter,這些是我得到的錯誤,具體取決於我如何嘗試分配值:

在類型(契約 MyContract)中依賴參數查找後,成員“BTCUSD”未找到或不可見

正如@Thomas Bertani 在評論中提到的那樣,Oraclize 可以直接用於MyContract. 如果您需要使用 2 個合約,擴展他的評論,那麼您需要創建一個 setter,並在MyContract. 例子:

contract MyContract {
 uint public BTCUSD;

 function set(uint val) {
     BTCUSD = val;
 }
}

contract PriceFeed {
   function setVal(address addr) {
       MyContract(addr).set(2);
   }
}

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