Wie behebe ich Javascript-Stapelüberläufe beim Kompilieren sehr großer Dateien mit Solc?

Wenn ich mit solc eine sehr große Datei übersetze, läuft der Stack über. Dies passiert am häufigsten in node, da der Standard-Stack nur 984 kByte groß ist, was Sie seltsamerweise für ein Programm aus den 1990er Jahren erwarten würden, außer dass node nicht aus den 1990er Jahren stammt.

Dies ist der Fehler, den Sie erhalten:not ok 1 RangeError: Maximum call stack size exceeded

Es ist wahrscheinlich, dass der von Solc verwendete Javascript-Wrapper ein O(n)-Stack-Verhalten hat, z. B. eine rekursive Funktion.

Ich hatte dieses Problem und habe am Ende diese Lösung verwendet: stackoverflow.com/a/44398946/1937418
@bingen siehe Antwort unten. Portabilitäts- und Upgrade-Probleme beim Überschreiben des standardmäßigen Knotenspeicherorts. In diesen Tagen von Docker ist dies jedoch wahrscheinlich der richtige Weg, vorausgesetzt, Sie verwenden einen Docker-Container zum Ausführen von node.

Antworten (2)

Danke dafür!

Am Ende gemacht: node --stack-size=4096 .\node_modules\truffle\build\cli.bundled.js compile,

statt truffle compile(nach einem Blick in node_modules/.bin/truffle).

EDIT: Unter Ubuntu funktioniert das auch:node --stack-size=4096 node_modules/.bin/truffle compile

Dies funktioniert von der Befehlszeile aus, ist aber sehr umständlich:

alias node='node --stack-size=4096'

Es ist umständlich, weil Sie die Stapelgröße überall angeben müssen, wo Sie node aufrufen, und auf den meisten Systemen können Sie die Option nicht in einem Shebang unterbringen. ZB funktionieren alle Node-Utilities wie Mocha oder Tape nicht so einfach wie beabsichtigt.

Sie könnten 'node' in Ihrem Pfad überschreiben, aber das ist nicht sehr portabel, Sie müssen daran denken, dies in Ihrer Produktions- sowie in Entwicklungs- und Staging-Umgebungen zu tun.

Es wäre schön, wenn es eine Umgebungsvariable wäre, aber der Knoten unterstützt das nicht.

Die andere Option besteht darin, Ihren Solidity-Code in mehrere Dateien aufzuteilen, was einfacher ist, sobald es importportabel funktioniert.