(обновлено: 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. Вы также узнали, как можно отслеживать события с сервера и обрабатывать полученные данные с помощью обратных вызовов.