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
Implementé su código agregando algunos detalles y funciona. Lo único extraño es que defines el tipo Producter
y 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
Felipe
Jaime
Deepak Bhavsar