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

Она поможет вам построить собственную P2P-сеть и связать участников, где все участники будут найдены автоматически, что крайне актуально на фоне различных блокировок. Накопилось много приятных изменений, о которых я и хочу рассказать.

https://habr.com/ru/articles/943652/

Для начала крайне рекомендую ознакомиться с прошлой статьей. В ней я рассказываю, что это за библиотека, и объясняю, почему задумывал librats как альтернативу libp2p. И даю примеры кода для использования.

Последний стабильный релиз на данный момент — 0.5.3. Библиотека в бинарном виде и исходном коде доступна под:

  • Windows (64-bit)

  • Linux (64-bit)

  • Android (32-bit / 64-bit)

  • macOS (64-bit)

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

старая версия rats-search
старая версия rats-search

Одно из ключевых изменений — завершена работа над поддержкой Node.js. Теперь библиотеку можно полноценно использовать в Node.js, Python и на Android.

Основной интерфейс доступа — FFI. В отличие от libp2p, где реализации на разных языках часто отличаются возможностями, librats предоставляет единый API и полный набор функций везде. Больше нет ситуаций, когда, например, mDNS на одном языке работает, а на другом — нет.

архитектура использования библиотеки из разных языков
архитектура использования библиотеки из разных языков


Ещё одно ключевое изменение — значительная оптимизация работы DHT. Я серьезно доработал алгоритмы обнаружения узлов, внедрив поддержку таких механизмов, как branch-factor и RTT-routing (маршрутизация с учетом задержек).

Теперь таблицы маршрутизации, как и списки пиров, сохраняются между сессиями. Это позволяет эффективно выстраивать топологию сети и находить участников даже в условиях жестких блокировок при заблокированных bootstrap-узлах.

Само анонсирование своего протокола и поиск участников стал значительно быстрее и совмещено с поиском пиров.

С точки зрения поиска пиров, все осталось как раньше:

if (!ratsClient_->start()) {
    qWarning() << "Failed to start librats client";
    emit error("Failed to start P2P network");
    return false;
}

// Start DHT discovery on specified port
if (ratsClient_->start_dht_discovery(dhtPort_)) {
    qInfo() << "DHT discovery started on port" << dhtPort_;
} else {
    qWarning() << "Failed to start DHT discovery";
}

Серьезно доработан модуль протокола BitTorrent — теперь он функционирует гораздо стабильнее и эффективнее.

И, наконец, о примерах. В прошлый раз читатели спрашивали, есть ли реальные кейсы использования помимо сэмплов самой библиотеки. Отвечаю: загляните в https://github.com/librats/rats-search/commits/cpp/ . Там сейчас находится будущая версия rats-search 2.0, полностью переписанная на Qt с использованием librats.

альфа-версия
альфа-версия

Ну и конечно различные функции можно просто потыкать из самого консольного клиента (доступно через команду help):

справка для консольного клиента из librats
справка для консольного клиента из librats

Всем спасибо за внимание :-)

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


  1. MAXH0
    13.12.2025 15:59

    Интересно. Вы не могли бы описать минимальный рабочий сценарий. Например в следующей статье. Или кинуть ссылку где он описан. Например связать два и более браузерных приложения или программы на python.


    1. DEgITx Автор
      13.12.2025 15:59

      В прошлой статье как раз делился базовыми примерами на C++ чтук 6-7 базовых на русском - https://github.com/librats/librats / https://librats.com/ от простых к более сложным, так же они в самом readme есть на английском (секция Quick Start). Но вообще это хорошая идея, может действительно стоит отдельной статьей или видео где будет "создаем клиент" шаг за шагом описано какие функции мы вызываем и показать как клиенты друг с другом соединяются, общаются, что-то передают со скриншотами на каждом этапе создания с пояснениями что и зачем. Есть в планах улучшить и документацию и примеры. Единственное что наверное надо будет как-то дублировать примеры и на разных языках, включая python :).


  1. MikeFFFF
    13.12.2025 15:59

    а возможно ли использование librats как заменитель https://gitlab.com/Monsterovich/lanemu или https://yggdrasil-network.github.io/ ?


    1. DEgITx Автор
      13.12.2025 15:59

      Навскидку почитал, думаю в каком-то смысле проект ближе к yggdrasil, он так же позволяет создавать свои mesh сети с шифрованием и участниками - так что для него думаю да, является заменой или альтернативой. Lanemu по описанию некоторые выстраивание VPN туннелей поверх сетей - в librats vpn не используется, коммуникация выстраивается поверх низкоуровневых протоколов tcp/udp

      если кратко то топология такая:

      Протокол TCP -> шифрование -> librats коммуникация (пакеты) -> протоколы обмена (евенты и gossipsub) -> обмен файлами и другие высокоуровневые функции
      Протокол UDP -> DHT/mDNS -> обнаружение участников и routing таблицы -> соединение с участниками

      Важной особенностью librats еще является то что он умеет для маршутизации переиспользовать bittorrent сеть ( BitTorrent Mainline DHT - около 16-28 миллионов узлов) ускоряя поиск участников и дополняя сеть. Это более обширная DHT сеть, и думаю самая большая из имеющихся.

      Вообще в целом библиотека с учетом наличия gossipsub вполне может подойти для выстраивания неблокируемых месседжеров, где все участники служат proxy-механизмами :)