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.
Es gibt viele Fälle, in denen der Gasschätzer infinite
Gas 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 infinite
die 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.
medwedew1088
Cyberience