WoT Oracle
Высокопроизводительный индексатор графа подписок Nostr. Запросы за доли миллисекунды, отвечающие на вопрос «сколько переходов разделяет этих двух пользователей?»
Что он делает
WoT Oracle непрерывно синхронизирует списки подписок (события Kind 3) с реле Nostr, формируя граф всей социальной сети в оперативной памяти. Затем он предоставляет REST API для запроса социальной дистанции между любыми двумя pubkey.
Пример: Если Алиса подписана на Боба, а Боб подписан на Кэрол, то расстояние от Алисы до Кэрол составляет 2 перехода.
Производительность
API-эндпоинты
GET /distance
Запрос социальной дистанции между двумя pubkey.
GET /distance?from=PUBKEY1&to=PUBKEY2{
"from": "PUBKEY1",
"to": "PUBKEY2",
"distance": 2,
"paths": 5,
"mutual": false,
"bridging_nodes": ["PUBKEY3", "PUBKEY4"]
}POST /distance/batch
Запрос дистанций от одного pubkey до нескольких целей.
POST /distance/batch
Content-Type: application/json
{
"from": "PUBKEY1",
"targets": ["PUBKEY2", "PUBKEY3", "PUBKEY4"]
}{
"from": "PUBKEY1",
"results": [
{ "to": "PUBKEY2", "distance": 1 },
{ "to": "PUBKEY3", "distance": 2 },
{ "to": "PUBKEY4", "distance": null }
]
}GET /stats
Получение статистики об индексированном графе.
{
"total_pubkeys": 1250000,
"total_follows": 8500000,
"last_sync": "2024-01-15T10:30:00Z",
"cache_hit_rate": 0.85
}GET /health
Эндпоинт проверки работоспособности для мониторинга.
{ "status": "healthy", "uptime": 864000 }Самостоятельный хостинг
Запустите собственный экземпляр WoT Oracle. Полный контроль над вашей инфраструктурой доверия.
Docker (рекомендуется)
Docker Compose
Из исходного кода (Rust 1.75+)
Конфигурация
Настройка через переменные окружения:
| Переменная | По умолчанию | Описание |
|---|---|---|
RELAYS | damus, nos.lol, nostr.band | URL реле через запятую |
HTTP_PORT | 8080 | Порт сервера |
DB_PATH | wot.db | Расположение базы данных SQLite |
RATE_LIMIT_PER_MINUTE | 100 | Ограничение запросов на IP |
CACHE_SIZE | 10000 | Количество записей LRU-кэша |
CACHE_TTL_SECS | 300 | Время жизни кэша (5 мин) |
Архитектура
Хранение графа
Граф в оперативной памяти для быстрого обхода, с резервным хранением в SQLite. Непрерывная синхронизация с настроенных реле Nostr.
Поиск пути
Двунаправленный поиск в ширину (BFS) одновременно с обоих концов, встреча посередине для сложности O(b^(d/2)).
Кэширование
LRU-кэш с настраиваемым размером и временем жизни. Большинство запросов попадают в кэш со временем ответа менее миллисекунды.
Ограничение частоты запросов
Ограничение частоты запросов по IP защищает сервис от злоупотреблений. Настраиваемые лимиты для различных сценариев развёртывания.
Публичный экземпляр
Публичный экземпляр доступен для разработки и тестирования:
https://wot-oracle.mappingbitcoin.comОграничение: 100 запросов в минуту на IP. Для продуктивного использования рекомендуется самостоятельный хостинг.
Открытый исходный код
Написан на Rust. Лицензия MIT. Разверните для своего сообщества или внесите улучшения.