unendliches Gas für einfachen externen Funktionsaufruf erforderlich

Ich habe den folgenden in Remix generierten Solidity-Code minimiert, um das Problem zu demonstrieren. Dieser Code warnt davor, dass die test001.reger-Funktion unendlich viel Gas benötigt, was offensichtlich durch den Code nicht möglich ist.

Könnte jemand feststellen, was das Problem wirklich ist?

Ich habe mehrere Versionen der Aufrufsequenz des Remote-Aufrufs ausprobiert, und alle haben das gleiche Problem. (Andere Versionen sind im Funktionscode unten auskommentiert dargestellt.)

pragma solidity ^0.4.17;

contract test002 {

    address[] AddressList;

    event ItemAdded(address, address);


    function getItemCount() public view returns(uint) {return(AddressList.length);}
    function getItem(uint index) public view returns(address) {return(AddressList[index]);}

    function addItem(address inItem) public {
        AddressList[AddressList.length] = inItem;
        ItemAdded(this, inItem);
    }

}

contract test001 {

    address AA;

    event Creation(address, address);

    function test001() public {
        AA = new test002();

        Creation(address(this), AA);
    }

    function register() public {
        // option 1
//        test002(AA).addItem(address(this));

        // option 2        
//        test002 A = test002(AA);
//        A.addItem(this);

        // option 3
        test002 A = test002(AA);
        A.addItem(address(this));
    }



}

Antworten (1)

Ich glaube, das ist nur eine Einschränkung des Solidity-Compilers. Jeder Aufruf zu einem anderen Vertrag löst diese Warnung aus, da Solidity nicht weiß, wie viel Gas der andere Vertrag benötigt.

Hier ist es technisch möglich, dass der Compiler per statischer Analyse erkennt, dass die von Ihnen verwendete Adresse immer aus new test002()dem Konstruktor stammt, aber das ist eigentlich ein ziemlich schwieriger Schluss. Der Solidity-Compiler ist nicht so schlau, also gibt er auf und sagt, dass Sie einen anderen Vertrag aufrufen und daher das erforderliche Gas zur Kompilierungszeit nicht bestimmt werden kann.

Es ist sicher, die Warnung einfach zu ignorieren.

BEARBEITEN

Behebung des Fehlers, den Sie im Kommentar erwähnt haben.

Diese Zeile versucht immer, über das Ende eines Arrays hinaus zu schreiben:

AddressList[AddressList.length] = inItem;

Sie müssen entweder zuerst die Länge des Arrays erweitern, wie folgt:

AddressList.length += 1
AddressList[AddressList.length - 1] = inItem;

oder (besser) einfach verwenden push:

AddressList.push(inItem);
Beim Erstellen des Vertrags/der Verträge in Remix schlägt der Registrierungsaufruf aufgrund des folgenden Fehlers fehl, da keine Debugging-Möglichkeit besteht. "transact to test001.register error: Gas benötigt übersteigt Freibetrag oder Transaktion immer fehlgeschlagen"
Bist du dir sicher? Bei mir schlägt es mit "transact to test001.register errored: VM error: revert" fehl. Oh, habe gerade deine Kommentarbearbeitung gesehen. Ja, dieser Fehler ist ähnlich. Beides hat nichts mit der unendlichen Gaswarnung zu tun.
Siehe meine Bearbeitung für die Ursache dieses Fehlers.
Vielen Dank! Das scheint dieses Problem für dieses Beispiel zu lösen! Ich werde jetzt zurückgehen und versuchen, diesen Fix auf den ursprünglichen Code anzuwenden und zu sehen, was passiert.