Всем привет! Я продолжаю развивать свою библиотеку для создания распределённых приложений, которая уже легла в основу новой версии rats-search (распределённого торрент-поисковика) и, судя по всему, UltraVNC (VNC клиент).

Она позволяет развернуть собственную P2P-сеть, связать пользователей между собой и выстроить коммуникацию посредством различных потоков данных (бинарных, строковых и т.п.). Главная особенность — автоматическое обнаружение участников (peer discovery), что крайне актуально в условиях постоянных блокировок и сетевых ограничений.

На данный момент библиотека поддерживает языки C/C++, Android (Java), Python и Node.js.

Это очередное обновление и ещё большая стабилизация различных функций. Обо всём подробнее далее.

Последний стабильный релиз на сегодня — 1.0.0. Исходный код и бинарные файлы доступны для скачивания для:

  • Windows (64-bit)

  • Linux (64-bit)

  • Android (32-bit / 64-bit)

  • macOS (64-bit)

https://github.com/librats/librats/releases

Доступ к функционалу библиотеки организован через FFI (Foreign Function Interface).

Поддерживается следующие возможности:

  • Поиск пиров в сети — автоматическое обнаружение участников через DHT (совместим с BitTorrent Mainline DHT) для глобальной сети и через mDNS для локальной.

  • Обход NAT без настройки роутера — встроенная поддержка UPnP, NAT-PMP, ICE, STUN и TURN. Библиотека сама просит роутер пробросить порт, поэтому пиры за NAT могут принимать входящие соединения без ручной настройки.

  • Сквозное шифрование — протокол Noise (Curve25519 + ChaCha20-Poly1305) с автоматическим управлением ключами, взаимной аутентификацией и совершенной прямой секретностью.

  • Передача файлов — потоковая отправка файлов и целых папок с контролем целостности (CRC32 + SHA-256), возможностью паузы/возобновления/отмены и атомарной доставкой.

  • Масштабируемый обмен сообщениями — протокол GossipSub для публикации/подписки по темам с организацией сообщений и их фильтрацией.

  • Поддержка многих языков — единый API для C++, C, Node.js (с TypeScript), Java/Android и Python, работающий на Windows, Linux, macOS и Android.

  • Удобный API для разработчика — событийная модель (on(), once(), off()), обмен сообщениями в JSON, отслеживание состояния соединений в реальном времени и гибкая система логирования.

  • и т.п. :)

Ключевые изменения и исправления с момента выхода предыдущей статьи (в ней была версия 0.7.0), их было еще больше но тем не менее:

  • Исправлено определение порта в peer exchange для входящих подключений (раньше при обмене списками пиров мог попадать неверный порт)

  • Переход на I/O poller для списка клиентов

  • Поддержка IPv6 в DHT

  • Поддержка защиты от Sybil attack - BEP 42 - это так же улучшает связность сети с qbittorrent клиентами и другими современными реализациями DHT.

  • Поддержка протоколов UPnP и NAT-PMP для "пробивания" роутеров.

  • Детекция двойного NAT

  • Поддержка implied_port из BEP 5 для DHT

  • Поддержка ротации логов

  • Поддержка алгоритма vote для DHT

  • Network monitor — отслеживание изменений состояния сети (смена интерфейсов/адресов). Будет гораздо лучше чувствовать себя на android где это актуально.

  • Исправлен краш на macOS при коротком жизненном цикле и use-after-scope в Node.js-биндингах (спасибо Simon’s Hub)

Из интересного (о чём уже было сказано выше): обнаружил форк библиотеки для клиента UltraVNC — приятненько :).

На этом пока про библиотеку все, всем приятного использования. Теперь пару слов про ключевой клиент rats-search. Было много стабилизаций со времени прошлой версии.

Наконец стабилизировался запуск вместе с Manticore ( https://github.com/librats/rats-search/issues/244 ) - было очень много комментариев с этой проблемой.

Появилась возможность экспорта .torrent файлов. Восстановлена загрузка описаний с разных трекеров:

Ну и, соответственно, все фичи из librats тоже доступны. А, кстати, версия на macOS под ARM наконец-то работает как надо :)

Комментарии (5)


  1. Void-Cowboy
    03.06.2026 20:14

    круто! не знал что такое есть причем довольно давно уже относительно

    единое что - не хватает не зашифрованного режима для использования в закрытых сетях (по крайней мере не увидел в реадми)

    например что бы если шарится через играсиль (то есть локальная сеть как выглядит для стороннего приложения) то оверхед на шифрование не нужен (да и в целом в локальной домашней сети можно напрямую отдавать)


    1. DEgITx Автор
      03.06.2026 20:14

      можно и отключить шифрование полностью если не нужно перед стартом:

      client.initialize_encryption(false);
      client.start();

      вообще noise довольно эффективный, создает минимальный оверхед, но не нужен так не нужен :)


  1. apcs660
    03.06.2026 20:14

    Хорошая либа


  1. domix32
    03.06.2026 20:14

    Сборку примеров в CI добавить бы.


    1. DEgITx Автор
      03.06.2026 20:14

      хм, в целом можно, организую