Nostr WoT

Documentazione

Tutto ciò di cui hai bisogno per integrare Web of Trust nella tua applicazione.

API dell’estensione

L’estensione espone window.nostr per identità, firma degli eventi e crittografia dei messaggi NIP-04/NIP-44.

Installa l’estensione, seleziona un account e collega il sito quando richiesto. Firma e crittografia richiedono un account in grado di firmare e possono richiedere lo sblocco del vault. Leggere una chiave pubblica nota non richiede lo sblocco.

Configurazione

Verifica che il metodo necessario esista prima di chiamarlo. La presenza del provider non significa che il sito sia collegato o che una richiesta sia autorizzata.

javascript
// Feature detection
function hasNostr() {
  return typeof window !== "undefined" &&
         typeof window.nostr?.getPublicKey === "function";
}

// Wait for the extension to load
async function waitForNostr(timeout = 3000) {
  const start = Date.now();
  while (!hasNostr() && Date.now() - start < timeout) {
    await new Promise(r => setTimeout(r, 100));
  }
  return hasNostr();
}

API di firma NIP-07

L’estensione implementa l’API di firma NIP-07 tramite window.nostr.

getPublicKey()

Restituisce la chiave pubblica esadecimale dell’account attivo. Richiede il collegamento del sito e l’accesso all’identità.

Restituisce

Promise<string>

Esempio

javascript
const pubkey = await window.nostr.getPublicKey();
console.log(pubkey); // "3bf0c63f..."

signEvent(event)

Firma l’evento e aggiunge id, pubkey e sig. Fornisci created_at; il firmatario conserva quel timestamp. Se fornisci pubkey, deve corrispondere all’account attivo. La firma non pubblica l’evento.

Parametri

NomeTipoDescrizione
eventUnsignedEventEvento contenente kind, content, tags e created_at (tempo Unix in secondi)

Restituisce

Promise<SignedEvent>

Esempio

javascript
const signed = await window.nostr.signEvent({
  kind: 1,
  content: "Hello Nostr!",
  tags: [],
  created_at: Math.floor(Date.now() / 1000),
});
console.log(signed.sig); // schnorr signature

nip04.encrypt(pubkey, plaintext)

Cifra un messaggio con NIP-04, il precedente formato di crittografia dei messaggi diretti.

Parametri

NomeTipoDescrizione
pubkeystringChiave pubblica del destinatario con 64 caratteri esadecimali
plaintextstringMessaggio da cifrare

Restituisce

Promise<string>

Esempio

javascript
const encrypted = await window.nostr.nip04.encrypt(
  recipientPubkey,
  "Secret message"
);

nip04.decrypt(pubkey, ciphertext)

Decifra un messaggio NIP-04.

Parametri

NomeTipoDescrizione
pubkeystringChiave pubblica del mittente con 64 caratteri esadecimali
ciphertextstringStringa del messaggio cifrato

Restituisce

Promise<string>

Esempio

javascript
const plaintext = await window.nostr.nip04.decrypt(
  senderPubkey,
  ciphertext
);
console.log(plaintext); // "Secret message"

nip44.encrypt(pubkey, plaintext)

Cifra un messaggio con NIP-44. Questo esempio usa la chiamata standard con due argomenti.

Parametri

NomeTipoDescrizione
pubkeystringChiave pubblica del destinatario con 64 caratteri esadecimali
plaintextstringMessaggio da cifrare

Restituisce

Promise<string>

Esempio

javascript
const encrypted = await window.nostr.nip44.encrypt(
  recipientPubkey,
  "Secret message"
);

nip44.decrypt(pubkey, ciphertext)

Decifra un messaggio NIP-44.

Parametri

NomeTipoDescrizione
pubkeystringChiave pubblica del mittente con 64 caratteri esadecimali
ciphertextstringStringa del messaggio cifrato

Restituisce

Promise<string>

Esempio

javascript
const plaintext = await window.nostr.nip44.decrypt(
  senderPubkey,
  ciphertext
);
console.log(plaintext); // "Secret message"

getRelays()

Restituisce gli URL dei relay configurati nell’estensione. Ogni voce contiene read: true e write: true. Questo metodo non recupera le politiche dei relay NIP-65 dell’account e può restituire un oggetto vuoto.

Restituisce

Promise<Record<string, { read: boolean; write: boolean }>>

Esempio

javascript
const relays = await window.nostr.getRelays();

// {
//   "wss://relay.damus.io": { read: true, write: true },
//   "wss://nos.lol": { read: true, write: true }
// }

Collegamento, autorizzazioni ed errori

Le chiamate restituiscono promesse e possono fallire se l’utente rifiuta, il sito è scollegato, l’accesso all’identità è disabilitato o scade il tempo. Gli account di sola lettura non possono firmare né cifrare.

Un cambio di account può invalidare una richiesta in attesa. Le chiamate dalla pagina scadono dopo 120 secondi, inclusa l’attesa di collegamento, autorizzazione o sblocco. Gestisci gli errori e consenti di riprovare; i messaggi di errore non sono codici stabili per l’elaborazione automatica.

javascript
async function signNote(content) {
  const provider = window.nostr;
  if (typeof provider?.getPublicKey !== "function" ||
      typeof provider?.signEvent !== "function") {
    return { ok: false, reason: "provider-unavailable" };
  }

  try {
    const pubkey = await provider.getPublicKey();
    if (!pubkey) return { ok: false, reason: "no-active-account" };

    const event = await provider.signEvent({
      pubkey,
      kind: 1,
      content,
      tags: [],
      created_at: Math.floor(Date.now() / 1000),
    });
    return { ok: true, event };
  } catch (error) {
    return { ok: false, reason: "request-failed", error };
  }
}

Usa l’SDK per interrogare il grafo dei follow e l’API WoT Oracle per consultare i silenziamenti pubblici. Queste informazioni sono separate dalla distanza nel grafo e non producono un punteggio di fiducia combinato. L’estensione fornisce identità e firma.