Я пытаюсь реализовать этот шаблон:
contract Producer {
uint8 public SOME_VALUE=12;
}
contract Consumer {
Producter currentProducer;
function setProducer(address addr) { currentProducer = Producer(addr); }
function getSome() returns (uint8) { return currentProducer.SOME_VALUE(); }
}
Он компилируется, я могу развернуть своего потребителя и связать производителя.
Но я хочу убедиться, что addr действительно является производителем, когда я привязываю его к своему потребителю:
function setProducer(address addr) {
Producer newProducer = Producer(addr);
require(newProducer.SOME_VALUE() > 0);
currentProducer =newProducer;
}
Таким образом, я уверен, что подключаю Producer, а не что-то еще (мне не нравится, как я это делаю, но это лучшее решение, которое я нашел)
Но, просто добавив это требование, я больше не могу развертывать. Необходимый газ взлетает до небес ... может быть бесконечным, поскольку, независимо от того, насколько высоко я его поставил, транзакция терпит неудачу после достижения предела (такое же поведение в Remix или в локальной тестовой сети). Обратите внимание, что во время развертывания функция setProducer() не вызывается.
Это ошибка? Или, что наиболее вероятно: я что-то упустил?
Спасибо за вашу помощь
Я реализовал ваш код, добавив несколько деталей, и он работает. Единственная странность в том, что вы определяете тип Producter
и Producer
. Так что проблемы в основном опечатка. (Бывает)
pragma solidity ^0.4.23;
contract Producer {
uint8 public SOME_VALUE=12;
}
contract Consumer {
Producer currentProducer;
function setProducer(address addr) public {
Producer newProducer = Producer(addr);
require(newProducer.SOME_VALUE() > 0);
currentProducer =newProducer;
}
function getSome() public view returns (uint8) {
return currentProducer.SOME_VALUE();
}
}
Надеюсь это поможет
Филипп
Хайме
Дипак Бхавсар