Я использую 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)
Как упоминает в комментарии @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
и можете использовать this
.
Шаян
Томас Бертани
MyContractInterface(mycontract_address).setterMethodforBTCUSD(BTCUSD)
. Мое предложение по-прежнему состоит в том, чтобы использовать Oraclize сразу из MyContract, если вам действительно не нужно разделить два контракта.