(обновлено: 27.05.21)
вступление
Итак, вы хотите общаться со своим локальным узлом Geth или Parity через IPC вместо HTTP или Websockets? Межпроцессное взаимодействие (IPC) включено по умолчанию - в отличие от HTTP и Websockets - (правка: кажется, что это неправда), с его помощью вы можете сделать классную кластеризацию и управление рабочими (что отлично подходит для горизонтального масштабирования), и эй это ваше приложение - почему бы вам не использовать IPC?
Или, может быть, вы похожи на меня и не хотите задействовать сетевой стек. Я поискал окончательный ответ, перенаправляется ли обратная петля операционной системой или она включает TCP / IP, но я не нашел ничего, кроме нескольких старых ответов SO. Не знаю, может, это рефлексия на «HTTP». Двигаемся дальше.
JSON-RPC
JSON-RPC - это протокол удаленного вызова процедур (RPC), который мы можем использовать для связи с Geth, Parity, а также с другими клиентами Ethereum. Поскольку мы используем Javascript, мы могли бы использовать библиотеку Web3js, но это руководство не об этом.
Вот ссылка на вики-страницу Ethereum, где вы можете найти список методов JSON-RPC: «https://eth.wiki/json-rpc/API
Начиная
Надеюсь, к настоящему моменту у вас есть готовый к работе узел Geth или Parity. Кстати, есть ограничения на использование «легкого» режима. У вас не возникнет проблем с этим руководством, но имейте это в виду, когда будете адаптировать его для своего случая использования.
После запуска Geth или Parity вы увидите, что файл появится в файловой системе в этом месте:
Linux
Geth: ~/.ethereum/geth.ipc
Четность: ~/.local/share/io.parity.ethereum/jsonrpc.ipc
Mac
Гет: ~/Library/Ethereum/geth.ipc
Parity:
~/Library/Application\ Support/io.parity.ethereum/jsonrpc.ipc
Windows
Гет: ~\Appdata\Roaming\Ethereum\geth.ipc
Parity:
~\AppData\Local\Parity\Ethereum\jsonrpc.ipc
Прежде чем начать, найдите этот файл и убедитесь, что он там есть. Некоторые из этих путей могут измениться с обновлениями.
Ваш клиент Node.js
Есть несколько модулей, которые имеют дело с IPC, node-ipc и json-ipc-lib - два из них. Node уже поставляется с net, и, предположительно, это то, что в любом случае использует более популярный node-ipc, так что это то, что мы будем использовать.
const net = require('net'); const os = require('os'); const client = net.createConnection({ path:os.homedir()+'/.local/share/io.parity.ethereum/jsonrpc.ipc'}, () => { console.log('Connected to server...'); });
Это связывает нас с сервером IPC, который вы можете адаптировать к Geth. Некоторым методам Geth и Parity требуются параметры, но этому нет, поэтому список пуст.
let obj = { jsonrpc : "2.0", method : "web3_clientVersion", params : [], id : 01 }; client.write(JSON.stringify(obj),() => { console.log('Call made.'); });
Как видите, функция client.write
отправляет данные на сервер.
Чтобы прослушать ответ сервера:
client.on('data', (data) => { console.log('Oh hey, some data: \n'+ data.toString()); client.end(); });
client.end()
предназначен для продолжения и закрытия соединения, но вы можете установить его, если сочтете нужным.
Не забудьте отключить слушателя:
client.on('end', () => { console.log('Disconnected from server. Adios amigo!'); });
В результате я получаю:
Connected to server... Call made Oh hey, some data: {"jsonrpc":"2.0","result":"Parity-Ethereum//v2.3.0-beta-10657d9-20190115/x86_64-linux-gnu/rustc1.31.1","id":01} Disconnected from server. Adios amigo!
Весь код
const net = require('net'); const os = require('os'); const client = net.createConnection({ path:os.homedir()+'/.local/share/io.parity.ethereum/jsonrpc.ipc'}, () => { console.log('Connected to server...'); }); let obj = { jsonrpc : "2.0", method : "web3_clientVersion", params : [], id : 01, }; client.write(JSON.stringify(obj),() => { console.log('Call made'); }); client.on('data', (data) => { console.log('Oh hey, some data: \n'+ data.toString()); client.end(); }); client.on('end', () => { console.log('Disconnected from server. Adios amigo!'); });
Вывод
Идти по IPC-маршруту для связи с Geth или Parity довольно просто, а для небольших сообщений вам не нужны никакие внешние модули.
В этой статье вы увидели простую реализацию с использованием модуля Node.jsnet
для выполнения вызовов на сервер с использованием методов, найденных в документации Ethereum. Вы также узнали, как можно отслеживать события с сервера и обрабатывать полученные данные с помощью обратных вызовов.