Использование Oraclize для присвоения значения другой переменной контракта

Я использую 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, но получаю ошибки.

contract MyContract {
  uint public BTCUSD;
}

Я использую линтер на атоме, и это ошибки, которые я получаю в зависимости от того, как я пытаюсь присвоить значение:

Элемент «BTCUSD» не найден или не отображается после поиска в зависимости от аргумента в типе (контракт MyContract)

Похоже, что использование следующего кода устранило бы ошибки линтера, но по-прежнему не компилируется > контракт PriceFeed использует Oraclize, Options {
Ваш «Мой контракт» может сразу использовать Oraclize, зачем иметь два контракта? Кстати, вызов метода внешнего контракта, например, для установки значения, работает по-другому: MyContractInterface(mycontract_address).setterMethodforBTCUSD(BTCUSD). Мое предложение по-прежнему состоит в том, чтобы использовать Oraclize сразу из MyContract, если вам действительно не нужно разделить два контракта.

Ответы (1)

Как упоминает в комментарии @Thomas Bertani, Oraclize можно использовать непосредственно в MyContract. Если вам нужно использовать 2 контракта, расширяя его комментарий, то вам нужно создать сеттер и вызывать сеттер на конкретном экземпляре MyContract. Пример:

contract MyContract {
  uint public BTCUSD;

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

contract PriceFeed {
    function setVal(address addr) {
        MyContract(addr).set(2);
    }
}
Спасибо за ответ, есть ли способ найти «основной» адрес MyContract, используя что-то вроде self.address ?
Вы должны быть внутри MyContractи можете использовать this.