Sperrgaslimit beim Zusammenstellen des Vertrages überschritten Solidity Browser

Die Verwendung von Solidity Browser ( https://ethereum.github.io/browser-solidity/ ) zum Minen eines Vertrags im Testnetz mit injiziertem web3- und Metamask-Konto löst diesen Fehler aus:

callback contain no result Gas required exceeds limit: 3000000

Dieser Vertrag (Quellcode => https://gist.github.com/computerphysicslab/f362383f9d3fed26becba48b934bbcfc ) wird voraussichtlich rund 6 Millionen Gas kosten, um bereitgestellt zu werden (gemäß JS VM-Umgebung). Beim Versuch, das Gaslimit zu erhöhen, werden jedoch diese Fehler ausgegeben:

callback contain no result Gas required exceeds limit: 4000000
callback contain no result Gas required exceeds block gas limit: 5000000
callback contain no result Gas required exceeds block gas limit: 6000000
callback contain no result Gas required exceeds block gas limit: 10000000
...

Es scheint also nicht möglich zu sein, den Vertrag abzubauen, da es ein Blockgaslimit von etwa 5 Millionen Gas gibt. Kann man diese Grenze irgendwie überwinden?

Ref.:

Solidity-Browser-Compiler stürzt ab

Warum stürzt der browserbasierte Solidity-Compiler ab, wenn der Code zu lang ist?

Überschreitung des Gasblock-Grenzfehlers beim Einsatz in der Nähe des Gasblock-Grenzvertrags

Antworten (3)

Sofern die Bergleute das Blockgaslimit nicht erhöhen, besteht Ihre einzige Möglichkeit darin, den Vertrag in mehrere Verträge aufzuteilen.

Jeder Vertrag hat also eine eigene Adresse, und Sie können zwischen ihnen telefonieren. Zum Beispiel kann ein ICO Crowdsale aufgeteilt werden in:

  • Crowdsale: Verwalten Sie den Crowdsale, wie Token zugeteilt werden, Belohnungen, Öffnen, Schließen
  • Token: Implementiert ERC20, kann Token erstellen, Übertragung genehmigen
  • Wallet: Verwalten Sie während des Crowdsales erhaltene Gelder

Auch die Aufteilung hilft bei einem Sicherheitsaudit, da jeder Vertrag einen begrenzten Umfang hat.

Jeder Vertrag kann unabhängig bereitgestellt werden, und über eine Konfigurationsmethode schließen Sie die Einrichtung ab.

Ich habe es versucht, aber das Aufteilen des Vertrags mithilfe von include-Befehlen reduziert nicht die gesamten Gaskosten der Bereitstellung.
Durch die Verwendung von include wird der Vertrag nicht geteilt. Das ist nur eine Anweisung an den Compiler, all diese Dinge in einem Vertrag zusammenzufassen.
@JuanIgnacioPérezSacristán Ich habe mit einem Beispiel aktualisiert
Wie hängen diese Verträge zusammen? Als Bibliotheken? Oder durch Erbschaft? Mein Code verwendet auch Vererbung und erfordert zu viel Gas, was die Bereitstellung unmöglich macht.
@JuanIgnacioPérezSacristán Inheritance zieht den gesamten Code zusammen. Sie müssen in separate Verträge aufgeteilt werden, damit jeder unabhängig bereitgestellt werden kann. Schauen Sie sich status ico github.com/status-im/status-network-token an , sie haben separate Verträge und ein Skript, das sie bereitstellt, und legen die anfängliche Konfiguration fest. Sie verwenden Trüffel, die es wirklich einfach machen, mehrere Verträge bereitzustellen und zu konfigurieren.
Manchmal ist es sinnvoll, Bibliotheken zu verwenden, wenn der Code wiederverwendet werden kann, wie zum Beispiel in SafeMath. Weil Bibliotheken die gleichen gemeinsamen Daten verwenden. Wenn die Verträge getrennt sind, können sie nur über die öffentlichen Methoden auf die Daten zugreifen.

Tatsächlich wird das maximale Gas pro Transaktion angegeben, eth.getBlock('latest').gasLimitdas heute rund 4,7 Millionen beträgt.

Bearbeiten: Das Gaslimit steigt und es scheint, dass das Ziel darin besteht, ein Limit von 6,7 Millionen zu erreichen, sodass Sie Ihren Vertrag möglicherweise bald einsetzen können, ohne etwas zu tun. Quelle: Reddit

Um Ihren Vertrag bereitzustellen, müssen Sie die Bereitstellungskosten reduzieren.

Es gibt Möglichkeiten, die Gaskosten zu senken:

  1. Vertrag vereinfachen. (insbesondere Konstrukteure)
  2. Verwenden Sie den Optimierer
  3. Auf mehrere Verträge aufteilen.
  4. Umgestalten, um Bibliotheken zu verwenden

Sie können beispielsweise versuchen, SafeMath anstelle Ihrer eigenen Implementierung zu verwenden.

Oder obwohl Sie es vielleicht getan haben, können Sie einen Teil entfernen, der zum Debuggen verwendet wird

// @notice For debugging purposes when using solidity online browser
function whoAmI() constant returns (address) {
    return msg.sender;
}

Übrigens ist die Diskussion zur Erhöhung des Gaslimits im Gange, einige Miner-Pools haben es bereits erhöht, aber einige große verwenden immer noch dieses "alte" Limit, das verwendet wird, um DDOS-Angriffe zu verhindern. Dieser Thread auf Reddit erklärt ein wenig das aktuelle Problem mit dem Gaslimit.

Sehr hilfreiche Tipps. Mein Code ist bereits in mehrere Verträge aufgeteilt, erfordert aber immer noch zu viel Gas zum Bereitstellen.
Ich habe meine Antwort bearbeitet. Das Gaslimit steigt und es scheint, dass das Ziel darin besteht, 6,7 Mio. zu erreichen. Genug, um Ihren Vertrag bereitzustellen. Ich hoffe für dich, dass du es in ein paar Stunden/Tagen schaffst, ohne deinen Vertrag anzutasten
Hallo nochmal :) Wir haben mehr als 6 Millionen für das Gaslimit erreicht, können Sie versuchen, den Vertrag erneut bereitzustellen?

Sie müssen einige der Dinge, wie Safemath, in einen Bibliotheksvertrag aufnehmen , den Sie als separate Verträge bereitstellen können. Sonst gibt es für Sie keine Möglichkeit, die Gaskosten zu senken.