Выполнение пользовательских фрагментов JavaScript через неинтерактивную консоль (geth --exec)

У меня есть фрагмент JavaScript для получения последней транзакции в/из учетной записи. После запуска экземпляра geth я сделал это в интерактивной консоли JS:

jsFunction — это функция в файле name.js.

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

Но когда я пытаюсь сделать то же самое в неинтерактивном режиме, у меня ничего не получается:

$ 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

Я выполнил ту же команду (geth --exec) с обычными функциями web3.js, такими как eth.getTransaction , eth.getBlock , и она отлично работает. Я не понимаю, что не так с выполнением пользовательских скриптов. Поддерживает ли клиент geth эту функцию? Я что-то упускаю?

PS: я запускаю частный блокчейн, но не упомянул --datadir , --networkid , --genesis и т. д . в приведенных выше командах для удобства чтения.

Я думаю, вы должны сделать все в одну строкуgeth --exec 'loadscript("/path/to/file/filename.js"); jsFunction(<params>); ' attach ipc:/path/to/ipc
Нет, это опечатка. Это LoadScript, а не LoadScript

Ответы (1)

Каждый geth exec запускает один интерпретатор. Поэтому, если вы определяете функцию в первом, она недоступна во втором... Пожалуйста, объедините их в один exec:

Подводить итоги:

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

Это также сработало:

geth --exec "loadscript(\"/path/to/file/filename.js\");jsFunction(<params>)" attach ipc:/path/to/ipc
Я не пытаюсь выполнить контракт. Мой вопрос относится к пользовательскому коду JS. eth.compile.solidity — это встроенная функция web3.js.
Попытался изменить ' на ", а также попытался изменить 'loadScript("/path/to/file/filename.js")' на "loadScript(\"/path/to/file/filename.js\")" . Все еще получаю такая же ошибка.
Упс. Пожалуйста, не обращайте внимания на опечатку. Я выполнил его правильно с большой буквы S. Все равно не повезло.
Предупреждение: если у вас есть два разных исполняемых файла, это два разных контекста. Так что это похоже на игру с двумя разными интерпретаторами.