Remix – Initialisierung der Vertragserstellung gibt Daten mit einer Länge von mehr als 24576 Bytes zurück. Die Bereitstellung wird wahrscheinlich fehlschlagen). Was kann getan werden?

Ich erhalte die folgende Fehlermeldung, wenn ich meinen Vertrag in Remix bereitstelle:

Die Initialisierung der Vertragserstellung gibt Daten mit einer Länge von mehr als 24576 Byte zurück. Die Bereitstellung wird wahrscheinlich fehlschlagen. Weitere Informationen: eip-170

Der Vertrag wird auf 2 Verträge aufgeteilt. A mit 250 Zeilen und B (B ist A) mit 500 Zeilen. Ich habe auch eine Bibliothek erstellt und einige meiner Funktionen in diese Bibliothek exportiert. Ich lade gerade in die Javascript-VM-Umgebung hoch. Beachten Sie, dass es immer noch nicht funktioniert, wenn ich das Kontrollkästchen „Optimierung aktivieren“ auf der Registerkarte „Kompilieren“ gültig mache. Ich habe ein paar Fragen:

1) Wie kann ich die Größe der Daten in Remix überprüfen? Ich bekomme eine Fehlermeldung, dass es über 24 KB ist, wie kann ich überprüfen, wie viel es genau ist?

2) Woran liegt das? Bezieht sich dies auf die Länge des Codes oder die Menge an Gas, die ausgeführt wird? Wenn es das Gas ist, wie kommt es, dass ich immer noch den gleichen Fehler bekomme, wenn ich dem Gaslimit auf der Registerkarte „Ausführen“ im Remix viel mehr Gas hinzufüge?

3) Gibt es gängige Methoden, um die Größe der Daten zu verringern, damit ich sie tatsächlich bereitstellen kann?

Danke

für Teil 1) Überprüfen Sie das Bytecode-Objekt Ihres Vertrags, es sollte 24 KB nicht überschreiten, Zeilen bedeuten nicht direkt einen größeren Bytecode, wie in @ricks Antwort erwähnt.
Okay habe das gemacht. Das Seltsame ist, dass ich, wie gesagt, die Verträge A und B habe und B A ist. Wenn ich die Abhängigkeit von B von A entferne und A einsetze, funktioniert alles und der Vertrag wird eingesetzt. Wenn ich den Bytecode kopiere und in eine txt-Datei einfüge, beträgt die Größe 60 KB. Ich bin verwirrt, da dieser Fehler besagt, dass er nicht größer als 24 KB sein kann? Erwähnenswert ist, dass, wenn B A ist, die Bytecode-Größe 202 KB beträgt: /
github.com/ethereum/EIPs/blob/master/EIPS/eip-170.md „Wenn die Initialisierung der Vertragserstellung Daten mit einer Länge von mehr als 0x6000 (2^14 + 2^13) Bytes zurückgibt, schlägt die Vertragserstellung mit einem Out of fehl Gasfehler." Überprüfen Sie also Ihren Vertragscode nach der Bereitstellung, da er keinen Initialisierungscode (Konstruktor und alle) enthält. Es sollte wahrscheinlich weniger als 24 KB (14952 Zeichen) sein.
Irgendeine Idee, wie man das in Remix macht? Vor dem Hochladen können Sie den Bytecode auf der Registerkarte Kompilieren überprüfen. Nach der Bereitstellung, wo Sie die Instanz des Vertrags sehen können, kann ich nicht sehen, wo ich den Bytecode davon überprüfen soll (Erinnerung daran, dass ich kein Testnetz wie Rinksby verwende, wo Sie Etherscan verwenden können, nur die Javascript-VM von Remix).
Gehen Sie in Remix zur Registerkarte Details, suchen Sie nach dem Objekt des Laufzeit-Bytecodes. Wenn Sie Zugriff über web3 haben, verwenden Sie dann web3.et.getCode (contractAddress).

Antworten (2)

Das von Ihnen gemeldete Codegrößenproblem bedeutet einfach, dass Ihr Code in einem zu großen Low-Level-Programm kompiliert wird. Zu viele Bytes drin.

Nichts im Zusammenhang mit Benzin oder Gasmangel: Es ist einfach größer als erlaubt.

Normalerweise treten solche Probleme bei sehr langen Listen und/oder bei Vorhandensein sehr großer statischer Konstanten (Arrays, Tabellen usw.) auf. In diesem Fall sollten Sie einige separate SW-Einheiten haben (wie Sie es anscheinend bereits getan haben) und den erforderlichen Speicherplatz reduzieren.

ABER es kann ein Problem im Zusammenhang mit der Remix-IDE sein. Bevor Sie fortfahren, speichern Sie Ihre Dateien, leeren Sie den Browser-Cache und starten Sie den Browser neu. (Übrigens scheint Chrome eine bessere Beziehung zu Remix zu haben als andere Browser ...)

Wenn Sie andererseits Ihren Code schrittweise entwickeln, neue Funktionen hinzufügen und sie testen, bevor Sie fortfahren, versuchen Sie einfach, einen Schritt zurück zu setzen, der die letzte hinzugefügte Funktion löscht, und stellen Sie sicher, dass der Fehler nicht mehr auftritt. Danach vereinfachen Sie alles, was Sie können.

Wenn der Fehler beim Löschen Ihrer letzten Hinzufügung nicht auftaucht, kann das Gesamtdesign von Natur aus schlecht und zu speicherintensiv sein.

Siehe Wie schätze ich die Größe meines Vertragscodes? es ist zu groß, um es jetzt auch einzusetzen !

Es ist wichtig zu betonen, dass das Aufteilen des Vertrags in mehr als einen Vertrag/Bibliotheken die Bytecodegröße reduziert, wenn und nur wenn sie separat bereitgestellt werden können und Sie sie separat bereitstellen. Andernfalls ist der resultierende Bytecode größer!

Überprüfen Sie auch Ihre öffentlichen Variablen: Es kann sein, dass einige von ihnen "privat" werden. In diesem Fall erstellt der Compiler keinen Getter für sie (das Nettoergebnis dieses Eingriffs hängt der Übersichtlichkeit halber von vielen anderen Dingen ab ... versuchen Sie es trotzdem).

Danke Rick, sehr hilfreich. Würde es Ihnen etwas ausmachen, sich meinen Kommentar zu @sp4c3 anzusehen und dies ebenfalls zu klären?
Ich habe einen sehr nützlichen Link hinzugefügt: Versuchen Sie, das zu lesen!
„Es ist wichtig zu betonen, dass die Aufteilung des Vertrags in mehr als einen Vertrag/Bibliotheken die Bytecode-Größe reduziert, wenn und nur wenn sie separat bereitgestellt werden können und Sie sie separat bereitstellen. Andernfalls ist der resultierende Bytecode größer!“ Wie kann ich damit umgehen? Das heißt, ich sollte die Bibliothek bereitstellen, die Adresse abrufen und dann in meinem Vertrag darauf verweisen? Wenn ja, ist es möglich, es in Remix zu simulieren? Danke
Ich denke, es könnte besser für Sie sein, eine oder mehrere neue Fragen zu diesem Thema zu stellen und zu versuchen, vollständige Beiträge aus der gesamten Community zu erhalten. Stellen Sie sich auf jeden Fall vor, Ihren Vertrag aufzuteilen, indem Sie Funktionen in einen zweiten Vertrag verschieben und sie wie in „otherContract.transfer(from, to, value);“ aufrufen. o.ä. Dies in einem Kommentar zu erklären, kann schwierig sein, aber der Multivertragsansatz ist allgemein bekannt.

Aktivieren Sie die Optimierung für Smart Contracts in Remix. Es wird erfolgreich sein