Вызов внешнего контракта приводит к бесконечной потребности в газе

Я пытаюсь реализовать этот шаблон:

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() не вызывается.

Это ошибка? Или, что наиболее вероятно: я что-то упустил?

Спасибо за вашу помощь

Ответы (1)

Я реализовал ваш код, добавив несколько деталей, и он работает. Единственная странность в том, что вы определяете тип 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(); 

    }
}

Надеюсь это поможет

Большое спасибо Хайме. Плохо: в приведенном мной образце кода была ошибка. В оригинальной переменная состояния была установлена ​​в ее объявлении (я отредактировал свой пост, чтобы исправить). Кроме того, я обнаружил, что проблема не в конкретном «require()», на который я указал. Если я закомментирую любую случайную строку, вызывающую Producer, я смогу развернуть... это не удастся, только если все вызовы функций Producer оставлены без комментариев. #головная боль
Хорошо. Я обновил ответ, у вас опечатка в коде. Я реализовал и протестировал его с помощью remix. Смотрите подробности в ответе. Дайте мне знать, как это происходит.
Я также пытаюсь сделать то же самое, используя версию Solidity 0.7.0, но получаю сообщение об ошибке.