TestRPC-Einschränkungen

Gibt es einige testRPC-Einschränkungen? Ich erlebe häufig „Kein Gas“-Ausnahmen für Verträge mit einer mäßigen Anzahl von Methoden. Lassen Sie uns zum Beispiel einen Vertrag haben:

contract TestSize{
    event Test1(uint param1, string param2); function test1(uint param1, string param2){ Test1(param1, param2);}
    event Test2(uint param1, string param2); function test2(uint param1, string param2){ Test2(param1, param2);}
    event Test3(uint param1, string param2); function test3(uint param1, string param2){ Test3(param1, param2);}
    ...
    event Test87(uint param1, string param2); function test87(uint param1, string param2){ Test87(param1, param2);}
}

Dieser Vertrag lässt sich problemlos auf testRPC mit Trüffel bereitstellen, das verwendete Gas ist 6614230.

Wenn ich jedoch eine zusätzliche Zeile mit test88/Test88 hinzufüge:

contract TestSize{
    event Test1(uint param1, string param2); function test1(uint param1, string param2){ Test1(param1, param2);}
    event Test2(uint param1, string param2); function test2(uint param1, string param2){ Test2(param1, param2);}
    event Test3(uint param1, string param2); function test3(uint param1, string param2){ Test3(param1, param2);}
    ...
    event Test87(uint param1, string param2); function test87(uint param1, string param2){ Test87(param1, param2);}
    event Test88(uint param1, string param2); function test88(uint param1, string param2){ Test88(param1, param2);}
}

Der Einsatz endet ohne Gasausnahme und verbraucht im Grunde die Menge an Gas, die ich ihm gebe:

eth_sendTransaction

  Transaction: 0x5b838c29352638fc360302f9b15920359feb4d107837684e2ff2a4637e2c2c89
  Contract created: 0x7703276d61ff3a1e081d1ed1d3bbf1738cb0d554
  Gas usage: 9000000000
  Block Number: 24
  Block Time: Thu Jan 25 2018 19:12:53 GMT+0100 (CET)
  Runtime Error: out of gas

Irgendwelche Ideen? Es schränkt die Entwicklung sogar etwas größerer Verträge ernsthaft ein.

Antworten (2)

Ganache-cli (früher testrpc genannt) ermöglicht es, eine beliebig große Gasmenge mit dem -lParameter einzustellen.

Um beispielsweise das Gaslimit auf 100M einzustellen, können Sie verwenden

ganache-cli -l 100000000

Weitere Optionen finden Sie auf der Readme-Seite in ihrem Github-Repo https://github.com/trufflesuite/ganache-cli .

Natürlich habe ich die Zahl erhöht, wie Sie sehen können - das Gas, das mit der Vertragserstellung Tx gesendet UND verbraucht wurde, betrug 9 Milliarden - was eine lächerliche Zahl ist. Etwas sehr Seltsames in testrpc.
Es ist wahrscheinlich, dass Sie ein internes Limit erreichen, was dazu führt, dass die Bereitstellung fehlschlägt und sich mit dem gesamten verbleibenden Gas auflädt.
Das will ich herausfinden :)

Ich bin kürzlich den gleichen Weg gegangen, den Sie beschrieben haben. Bis hin zu "N Kopien derselben trivialen Funktion, foo_NNNN()". Meine Schlussfolgerung ist, dass das Problem die Bytecode-Größe ist, und es scheint, dass der Schuldige möglicherweise EIP170 ist, das die Bytecode-Größe auf 24 KB begrenzt.

Andere haben vorgeschlagen, Code in Bibliotheken auszulagern, und das hilft, denke ich. Dies ist eine grundlegende und unvermeidbare Einschränkung der Komplexität des Codes in Ethereum, und ich weiß nicht, wie ich das umgehen soll. Da Sie manchmal einen so komplexen Codekörper haben, erhöht das Finden einer Stelle zum Teilen nur seine Größe (b / c zu viele Aufrufe über die Schnittebene).

Tut mir leid, dass ich nichts vorschlagen kann, aber ich bin an derselben Stelle, deshalb.