Nostr WoT
Backend API

WoT Oracle

Высокопроизводительный индексатор графа подписок Nostr. Запросы за доли миллисекунды, отвечающие на вопрос «сколько переходов разделяет этих двух пользователей?»

Что он делает

WoT Oracle непрерывно синхронизирует списки подписок (события Kind 3) с реле Nostr, формируя граф всей социальной сети в оперативной памяти. Затем он предоставляет REST API для запроса социальной дистанции между любыми двумя pubkey.

Пример: Если Алиса подписана на Боба, а Боб подписан на Кэрол, то расстояние от Алисы до Кэрол составляет 2 перехода.

Производительность

<1msЗадержка кэшированного запроса
<50msЗадержка некэшированного запроса
10,000+Запросов в секунду
O(b^d/2)Двунаправленный BFS

API-эндпоинты

GET /distance

Запрос социальной дистанции между двумя pubkey.

http
GET /distance?from=PUBKEY1&to=PUBKEY2
json
{
  "from": "PUBKEY1",
  "to": "PUBKEY2",
  "distance": 2,
  "paths": 5,
  "mutual": false,
  "bridging_nodes": ["PUBKEY3", "PUBKEY4"]
}

POST /distance/batch

Запрос дистанций от одного pubkey до нескольких целей.

http
POST /distance/batch
Content-Type: application/json

{
  "from": "PUBKEY1",
  "targets": ["PUBKEY2", "PUBKEY3", "PUBKEY4"]
}
json
{
  "from": "PUBKEY1",
  "results": [
    { "to": "PUBKEY2", "distance": 1 },
    { "to": "PUBKEY3", "distance": 2 },
    { "to": "PUBKEY4", "distance": null }
  ]
}

GET /stats

Получение статистики об индексированном графе.

json
{
  "total_pubkeys": 1250000,
  "total_follows": 8500000,
  "last_sync": "2024-01-15T10:30:00Z",
  "cache_hit_rate": 0.85
}

GET /health

Эндпоинт проверки работоспособности для мониторинга.

json
{ "status": "healthy", "uptime": 864000 }

Самостоятельный хостинг

Запустите собственный экземпляр WoT Oracle. Полный контроль над вашей инфраструктурой доверия.

Docker (рекомендуется)

terminal
# Pull and run the image
$docker pull ghcr.io/nostr-wot/nostr-wot-oracle:v1.0.0
$
$docker run -d \
$ -p 8080:8080 \
$ -v wot-data:/app/data \
$ ghcr.io/nostr-wot/nostr-wot-oracle:v1.0.0

Docker Compose

terminal
$git clone https://github.com/nostr-wot/nostr-wot-oracle.git
$cd wot-oracle
$docker-compose up -d

Из исходного кода (Rust 1.75+)

terminal
$git clone https://github.com/nostr-wot/nostr-wot-oracle.git
$cd wot-oracle
$cargo build --release
$./target/release/nostr-wot-oracle

Конфигурация

Настройка через переменные окружения:

ПеременнаяПо умолчаниюОписание
RELAYSdamus, nos.lol, nostr.bandURL реле через запятую
HTTP_PORT8080Порт сервера
DB_PATHwot.dbРасположение базы данных SQLite
RATE_LIMIT_PER_MINUTE100Ограничение запросов на IP
CACHE_SIZE10000Количество записей LRU-кэша
CACHE_TTL_SECS300Время жизни кэша (5 мин)

Архитектура

Хранение графа

Граф в оперативной памяти для быстрого обхода, с резервным хранением в SQLite. Непрерывная синхронизация с настроенных реле Nostr.

Поиск пути

Двунаправленный поиск в ширину (BFS) одновременно с обоих концов, встреча посередине для сложности O(b^(d/2)).

Кэширование

LRU-кэш с настраиваемым размером и временем жизни. Большинство запросов попадают в кэш со временем ответа менее миллисекунды.

Ограничение частоты запросов

Ограничение частоты запросов по IP защищает сервис от злоупотреблений. Настраиваемые лимиты для различных сценариев развёртывания.

Публичный экземпляр

Публичный экземпляр доступен для разработки и тестирования:

https://wot-oracle.mappingbitcoin.com

Ограничение: 100 запросов в минуту на IP. Для продуктивного использования рекомендуется самостоятельный хостинг.

Открытый исходный код

Написан на Rust. Лицензия MIT. Разверните для своего сообщества или внесите улучшения.