Der Aufruf eines externen Vertrags führt zu einem unendlichen Gasbedarf

Ich versuche dieses Muster umzusetzen:

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

Es wird kompiliert, ich kann meinen Consumer bereitstellen und einen Produzenten binden.

Aber ich möchte sicherstellen, dass addr wirklich ein Producer ist, wenn ich es an meinen Consumer binde:

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

Auf diese Weise bin ich sicher, dass ich einen Produzenten verlinke und nichts anderes (ich mag die Art und Weise nicht, wie ich das mache, aber das ist die beste Lösung, die ich bisher gefunden habe)

Aber wenn ich nur diese Anforderung hinzufüge, kann ich sie nicht mehr bereitstellen. Das benötigte Gas schießt in die Höhe ... kann unendlich sein, da die Transaktion, egal wie hoch ich es setze, nach Erreichen des Limits fehlschlägt (dasselbe Verhalten bei Remix oder in einem lokalen Testnet). Bitte beachten Sie, dass zum Zeitpunkt der Bereitstellung die Funktion setProducer() nicht aufgerufen wird.

Ist das ein Fehler? Oder am wahrscheinlichsten: übersehe ich etwas?

Vielen Dank für Ihre Hilfe

Antworten (1)

Ich habe Ihren Code implementiert und ein paar Details hinzugefügt, und es funktioniert. Das einzig Seltsame ist, dass Sie den Typ definieren Producterund ist Producer. Das Problem ist also im Grunde ein Tippfehler. (es passiert)

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

    }
}

Hoffe das hilft

Vielen Dank Jaime. Mein Fehler: Es gab einen Fehler in dem von mir bereitgestellten Beispielcode. Im Original wurde die Zustandsvariable in ihrer Deklaration festgelegt (ich habe meinen Beitrag korrigiert). Außerdem fand ich heraus, dass das Problem nicht in dem speziellen "require()" lag, auf das ich hingewiesen hatte. Wenn ich eine zufällige Zeile auskommentiere, die den Producer aufruft, kann ich bereitstellen ... es schlägt nur fehl, wenn alle Aufrufe von Producer-Funktionen unkommentiert bleiben. #kopfschmerzen
OK. Ich habe die Antwort aktualisiert, Sie haben einen Tippfehler im Code. Ich habe es mit Remix implementiert und getestet. Siehe die Details in der Antwort. Lassen Sie mich wissen, wie es geht.
Ich versuche auch, dasselbe mit der Solidity-Version 0.7.0 zu tun, aber ich erhalte eine Fehlermeldung