WoT Oracle
Interroga distanze dei follow diretti e osservazioni pubbliche di silenziamento via HTTP. Versione 0.3.0, senza estensione.
Cosa Fa
L’Oracle indicizza follow kind-3 e chiavi pubbliche delle liste di silenziamento kind-10000 ricevuti dai relay configurati. La copertura si limita a questi eventi. Distanza e silenziamenti restano segnali separati; l’API non li combina in un punteggio di fiducia.
Esempio: Se Alice segue Bob e Bob segue Carol, la distanza da Alice a Carol è di 2 salti.
Funzioni della versione
Endpoint API
Risposte illustrative con chiavi pubbliche esadecimali sintetiche di 64 caratteri. I risultati dipendono dagli eventi indicizzati. Consulta il riferimento API per tutti gli endpoint, inclusi /mutes, /trust e /ready.
GET /distance
Interroga la distanza sociale tra due pubkey.
GET /distance?from=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&to=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&max_hops=3{
"from": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"to": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"hops": 2,
"path_count": 1,
"mutual_follow": false
}POST /distance/batch
Interroga le distanze da una pubkey a più destinazioni.
POST /distance/batch
Content-Type: application/json
{
"from": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"targets": [
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
],
"max_hops": 3
}{
"from": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"results": [
{
"from": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"to": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"hops": 2,
"path_count": 1,
"mutual_follow": false
}
]
}GET /stats
Ottieni statistiche sul grafo indicizzato.
GET /stats{
"node_count": 3,
"edge_count": 2,
"nodes_with_follows": 2,
"mute_edge_count": 0,
"nodes_with_mute_lists": 1,
"sync": {
"running": true,
"ready": false,
"last_event_received_at": 0,
"last_persisted_at": 0,
"persisted_events": 0,
"lagged_notifications": 0,
"persistence_errors": 0,
"coverage": "configured_relays_only"
},
"cache": {
"size": 0,
"capacity": 10000,
"ttl_secs": 300
},
"locks": {
"write_lock_count": 0,
"write_lock_avg_us": 0,
"write_lock_max_us": 0,
"read_lock_count": 0,
"read_lock_avg_us": 0,
"read_lock_max_us": 0
}
}GET /health
Stato del processo e versione. Usa /ready per verificare la disponibilità dell’acquisizione.
GET /health{
"status": "healthy",
"version": "0.3.0"
}Hosting autonomo
Gli esempi usano v0.3.0. Docker e Compose espongono localhost:8080. Le installazioni pubbliche richiedono un reverse proxy che sostituisca le intestazioni IP del client. La compilazione nativa richiede Rust 1.93, pkg-config e le librerie di sviluppo OpenSSL.
Docker (Consigliato)
Docker Compose
Dal codice sorgente (Rust 1.93)
Configurazione
I valori seguenti sono quelli predefiniti del binario nativo. L’immagine Docker usa /app/data/wot.db; Compose espone solo l’interfaccia locale per impostazione predefinita. La cache ammette 100–100000 voci, il TTL 10–3600 secondi e il limite 1–1000 richieste/minuto.
| Variabile | Predefinito | Descrizione |
|---|---|---|
RELAYS | wss://relay.damus.io,wss://nos.lol,wss://relay.primal.net/,wss://relay.mostr.pub/ | URL dei relay separati da virgola |
HTTP_PORT | 8080 | Porta del server |
DB_PATH | wot.db | Posizione del database SQLite |
RATE_LIMIT_PER_MINUTE | 100 | Limite query per IP |
CACHE_SIZE | 10000 | Numero massimo di voci nella cache Moka |
CACHE_TTL_SECS | 300 | Scadenza della cache (5 min) |
Architettura
Archiviazione del Grafo
Grafo in memoria per attraversamento veloce, supportato da SQLite per la persistenza. Si sincronizza continuamente dai relay Nostr configurati.
Ricerca del Percorso
La ricerca in ampiezza bidirezionale calcola i percorsi diretti più brevi. Il tempo dipende da dimensioni del grafo, ramificazioni e profondità.
Cache
Cache Moka con capacità e TTL configurabili. Le voci vengono invalidate quando cambia la revisione del grafo. La latenza dipende dall’installazione e dal carico.
Limitazione delle Richieste
Limitazione per IP per proteggere il servizio da abusi. Limiti configurabili per diversi scenari di distribuzione.
Istanza Pubblica
Un'istanza pubblica è disponibile per sviluppo e test:
https://wot-oracle.mappingbitcoin.comI limiti dipendono dall’installazione. Gestisci HTTP 429 con attese crescenti. La saturazione delle query restituisce 503; /health e /ready non sono soggetti al limite degli endpoint dati.
Codice aperto
Scritto in Rust. Licenza MIT. Ospita per la tua comunità o contribuisci con miglioramenti.