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.
// 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
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
| Nome | Tipo | Descrizione |
|---|---|---|
event | UnsignedEvent | Evento contenente kind, content, tags e created_at (tempo Unix in secondi) |
Restituisce
Promise<SignedEvent>
Esempio
const signed = await window.nostr.signEvent({
kind: 1,
content: "Hello Nostr!",
tags: [],
created_at: Math.floor(Date.now() / 1000),
});
console.log(signed.sig); // schnorr signaturenip04.encrypt(pubkey, plaintext)
Cifra un messaggio con NIP-04, il precedente formato di crittografia dei messaggi diretti.
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
pubkey | string | Chiave pubblica del destinatario con 64 caratteri esadecimali |
plaintext | string | Messaggio da cifrare |
Restituisce
Promise<string>
Esempio
const encrypted = await window.nostr.nip04.encrypt(
recipientPubkey,
"Secret message"
);nip04.decrypt(pubkey, ciphertext)
Decifra un messaggio NIP-04.
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
pubkey | string | Chiave pubblica del mittente con 64 caratteri esadecimali |
ciphertext | string | Stringa del messaggio cifrato |
Restituisce
Promise<string>
Esempio
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
| Nome | Tipo | Descrizione |
|---|---|---|
pubkey | string | Chiave pubblica del destinatario con 64 caratteri esadecimali |
plaintext | string | Messaggio da cifrare |
Restituisce
Promise<string>
Esempio
const encrypted = await window.nostr.nip44.encrypt(
recipientPubkey,
"Secret message"
);nip44.decrypt(pubkey, ciphertext)
Decifra un messaggio NIP-44.
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
pubkey | string | Chiave pubblica del mittente con 64 caratteri esadecimali |
ciphertext | string | Stringa del messaggio cifrato |
Restituisce
Promise<string>
Esempio
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
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.
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.