Unendliche Gasschätzung von solc für einfache Funktion

Hier ist ein einfacher Solidity-Vertrag:

pragma solidity ^0.4.16;

contract Test {
    uint[] array;

    function testGasEstimation() public {
        array.length = 1;
    }
}

Hier ist die Ausgabe vonsolc --gas Test.sol

======= Test.sol:Test =======
Gas estimation:
construction:
   88 + 44200 = 44288
external:
   testGasEstimation(): infinite

Ähnliche array.push(1);Schätzungen zu unendlichem Gas.

Antworten (2)

Es gibt viele Fälle, in denen der Gasschätzer infiniteGas meldet. Dies bedeutet jedoch nicht unbedingt, dass Ihr Code eine Endlosschleife enthält oder dass Ihr Code falsch ist, sondern nur der Schätzer ist ziemlich restriktiv, wenn er Entscheidungen darüber trifft, wie viel Gas durch den Code verbraucht werden kann. Insbesondere alle Rückwärtssprünge oder Schleifen im Assembler-Code führen dazu, dass unendliches Gas gemeldet wird .

Für das bereitgestellte Codebeispiel array.length = 1;fügt der Compiler den Bytecode hinzu, der alle Array-Elemente außerhalb der neuen Grenze zurücksetzt. Wenn das Array beispielsweise 10 Elemente enthält und Sie dann seine Länge auf 1 setzen, wird der Code über 9 Elemente iterieren und die Speicherplätze für sie zurücksetzen. Diese Operation beinhaltet eine Schleife, deshalb meldet der Schätzer infinitedie Gasschätzung.

array.push()enthält das Festlegen der neuen Länge des Arrays, sodass es aus den gleichen Gründen auf unendlich geschätzt wird.

Weitere Details mit Links zum Schätzcode können Sie hier nachlesen . Wie erhalte ich die Kosten (in Gas) des nicht konstanten Funktionsaufrufs?

Ein dynamisches Array könnte eine unendliche Länge haben, unabhängig davon, ob Sie es auf 1 setzen.

Bedeutet es, dass das Festlegen der Länge des potenziell unendlichen Arrays auf 1 möglicherweise unendlich viel Gas benötigt?
Unter Ihnen und mir wissen Sie, aber der Compiler kann das nicht herausfinden, weil er nicht wissen kann, dass Sie möglicherweise eine Funktion oder einen späteren Aufruf haben, der den Wert ändert, ja, Sie haben eine Konstante, aber für den Compiler interpretiert er sie als a variabel, und als solche könnte unendlich sein, dies ist nur eine Vermutung meines Verständnisses, gp nicht zur Bank darüber ...: D