Llamar a un contrato externo conduce a una necesidad infinita de gas

Estoy tratando de implementar este patrón:

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(); }
}

Compila, puedo implementar mi Consumidor y puedo vincular a un productor.

Pero quiero asegurarme de que addr sea realmente un Productor cuando lo vinculo a mi Consumidor:

function setProducer(address addr) { 
    Producer newProducer = Producer(addr);
    require(newProducer.SOME_VALUE() > 0);
    currentProducer =newProducer; 
}

De esta manera, estoy seguro de que estoy vinculando un Productor y nada más (no me gusta la forma en que hago esto, pero esa es la mejor solución que encontré hasta ahora)

Pero con solo agregar este requerimiento, ya no puedo implementar. El gas que se necesita está por las nubes... puede ser infinito ya que, no importa qué tan alto lo ponga, la transacción falla después de alcanzar el límite (Mismo comportamiento en Remix o en una red de prueba local). Tenga en cuenta que, en el momento de la implementación, no se llama a la función setProducer().

¿Es esto un error? O lo más probable: ¿me estoy perdiendo algo?

Gracias por tu ayuda

Respuestas (1)

Implementé su código agregando algunos detalles y funciona. Lo único extraño es que defines el tipo Productery es Producer. Así que el problema es básicamente un error tipográfico. (Sucede)

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(); 

    }
}

Espero que esto ayude

Muchas gracias Jaime. Mi error: hubo un error en el código de muestra que proporcioné. En el original, la variable de estado se estableció en su declaración (edité mi publicación para corregir). Además, descubrí que el problema no estaba en el "requerimiento ()" particular que señalé. Si comento cualquier línea aleatoria que llame al productor, puedo implementar... falla solo cuando todas las llamadas a las funciones del productor se dejan sin comentar. #dolor de cabeza
De acuerdo. Actualicé la respuesta, tienes un error tipográfico en el código. Lo implementé y lo probé usando remix. Ver el detalle en la respuesta. Déjame saber como va.
También estoy tratando de hacer lo mismo usando la versión 0.7.0 de solidity pero recibo un error