Перейти к содержанию

Подписка на поток данных (State History / SHiP)

Подписка на поток данных в экосистеме COOPOS — это клиентская библиотека и примеры на TypeScript: подключение к узлу с State History (SHiP) по WebSocket, приём бинарного потока (блоки, трассы, дельты таблиц) и выдача данных в приложение в удобном для обработки виде (в т.ч. через RxJS).

Исходный код и инструкции: репозиторий coopenomics/coopos-ship-reader.


Зачем нужен отдельный клиент

На стороне nodeos протокол SHiP минимален: узел отдаёт сырые бинарные сообщения. Клиент должен хранить актуальные ABI, десериализовать действия и строки таблиц и учитывать микрофорки, если состояние строится вне узла.

Библиотека закрывает эту часть: поток оформлен как подписка (RxJS), тяжёлую десериализацию можно выносить в worker threads — удобно для индексаторов, синхронизации с PostgreSQL, GraphQL и других сервисов с непрерывной историей, а не разовыми HTTP-запросами.


С чем работает в связке

Компонент Роль
Узел COOPOS с state_history_plugin Источник потока по SHiP (TCP или Unix socket). См. State History (SHiP).
State-нода (выделенная или совмещённая с API) Типовой хост SHiP для «архивной» подачи истории.
Light-нода Состояние с момента снимка и новые блоки; при включённом SHiP поток ограничен тем, что есть на узле (не полная история с генезиса). Часто индексатор смотрит на отдельную state-ноду, а light оставляют под локальный API и P2P.
Клиент подписки Подключение к ws_url, запрос диапазона блоков, обработка потоков блоков, дельт, ABI.

Транспорт и формат сообщений — как у SHiP в COOPOS.


Как устроено кратко

  1. Приложение берёт get_info по HTTP узла (часто тот же хост, что Chain API), чтобы знать голову цепи и при необходимости chain_id.
  2. Задаётся конфигурация: WebSocket SHiP (state-history-endpoint или аналог), число потоков десериализации, фильтры дельт/таблиц, параметры запроса (start_block_num, флаги fetch_block / fetch_traces / fetch_deltas и т.д.).
  3. После start() приложение получает Observable-потоки: блоки, строки по дельтам, обновления ABI после setabi в цепи.
  4. Подписчики пишут данные во внешнее хранилище, в шину событий или в кэш.

Примеры — в examples и README coopos-ship-reader.


Где читать дальше