Ausführen von benutzerdefinierten JavaScript-Snippets über die nicht interaktive Konsole (geth --exec)

Ich habe ein JavaScript-Snippet, um die letzte Transaktion zu/von einem Konto abzurufen. Nach dem Starten der Geth-Instanz habe ich dies in der interaktiven JS-Konsole getan:

jsFunction ist eine Funktion in filename.js

>loadScript("/path/to/file/filename.js")
true
>jsFunction(<parameters>)
<Returns the results as expected>

Aber wenn ich versuche, dasselbe im nicht interaktiven Modus zu tun, schlägt es fehl:

$ geth --exec 'loadScript("/path/to/file/filename.js")' attach ipc:/path/to/ipc
true
$ geth --exec 'jsFunction(<parameters>)' attach ipc:/path/to/ipc
ReferenceError: 'jsFunction' is not defined
    at <anonymous>:1:1

Ich habe den gleichen Befehl (geth --exec) mit normalen web3.js-Funktionen wie eth.getTransaction , eth.getBlock ausgeführt und es funktioniert gut. Ich verstehe nicht, was an der Ausführung benutzerdefinierter Skripts falsch ist. Unterstützt der Geth-Client diese Funktionalität? Übersehe ich etwas?

PS: Ich betreibe eine private Blockchain, habe aber --datadir , --networkid und --genesis usw. in den obigen Befehlen aus Gründen der Lesbarkeit nicht erwähnt.

Ich denke, Sie sollten alles in einer einzigen Zeile tungeth --exec 'loadscript("/path/to/file/filename.js"); jsFunction(<params>); ' attach ipc:/path/to/ipc
Nein es ist ein Tippfehler. Es ist LoadScript, nicht LoadScript

Antworten (1)

Jeder Geth- Exec startet einen Interpreter. Wenn Sie also eine Funktion in der ersten definieren, ist sie in der zweiten nicht verfügbar ... Bitte führen Sie sie in einer Exec zusammen:

Um zusammenzufassen:

 geth --exec 'loadScript("/path/to/file/filename.js"); jsFunction(...)' attach

Das hat auch funktioniert:

geth --exec "loadscript(\"/path/to/file/filename.js\");jsFunction(<params>)" attach ipc:/path/to/ipc
Ich versuche nicht, einen Vertrag auszuführen. Meine Frage bezieht sich speziell auf benutzerdefinierten JS-Code. eth.compile.solidity ist eine eingebaute web3.js-Funktion .
Versucht, ' in " zu ändern und auch versucht, 'loadScript("/path/to/file/filename.js")' in "loadScript(\"/path/to/file/filename.js\" )" zu ändern . Immer noch das gleicher Fehler.
Hoppla. Bitte ignorieren Sie den Tippfehler. Ich habe es richtig mit einem großen S ausgeführt. Immer noch kein Glück.
Warnung: Wenn Sie zwei verschiedene Execs haben, handelt es sich um zwei unterschiedliche Kontexte. Es ist also, als würde man mit zwei unterschiedlichen Interpreten spielen.