Erweiterungs-API
Die Erweiterung stellt window.nostr für Identität, Ereignissignierung und NIP-04/NIP-44-Nachrichtenverschlüsselung bereit.
Installiere die Erweiterung, wähle ein Konto und verbinde deine Website nach Aufforderung. Signieren und Verschlüsseln erfordern ein signierfähiges Konto und gegebenenfalls das Entsperren des Tresors. Ein bekannter öffentlicher Schlüssel kann auch bei gesperrtem Tresor gelesen werden.
Einrichtung
Prüfe vor dem Aufruf, ob die benötigte Methode vorhanden ist. Ein vorhandener Provider bedeutet nicht, dass die Website verbunden oder eine Anfrage genehmigt ist.
// 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();
}NIP-07-Signier-API
Die Erweiterung implementiert die NIP-07-Signier-API über window.nostr.
getPublicKey()
Gibt den öffentlichen Schlüssel des aktiven Kontos im Hexadezimalformat zurück. Die Website muss verbunden sein und Zugriff auf die Identität haben.
Rückgabe
Promise<string>
Beispiel
const pubkey = await window.nostr.getPublicKey();
console.log(pubkey); // "3bf0c63f..."signEvent(event)
Signiert das Ereignis und ergänzt id, pubkey und sig. Übergib created_at selbst; der Signierer übernimmt diesen Zeitstempel. Ein übergebener pubkey muss zum aktiven Konto gehören. Signieren veröffentlicht das Ereignis nicht.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
event | UnsignedEvent | Ereignis mit kind, content, tags und created_at (Unix-Zeit in Sekunden) |
Rückgabe
Promise<SignedEvent>
Beispiel
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)
Verschlüsselt eine Nachricht mit NIP-04, dem älteren Verschlüsselungsformat für Direktnachrichten.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
pubkey | string | Öffentlicher Schlüssel des Empfängers mit 64 Hexadezimalzeichen |
plaintext | string | Zu verschlüsselnde Nachricht |
Rückgabe
Promise<string>
Beispiel
const encrypted = await window.nostr.nip04.encrypt(
recipientPubkey,
"Secret message"
);nip04.decrypt(pubkey, ciphertext)
Entschlüsselt eine NIP-04-Nachricht.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
pubkey | string | Öffentlicher Schlüssel des Absenders mit 64 Hexadezimalzeichen |
ciphertext | string | Zeichenfolge der verschlüsselten Nachricht |
Rückgabe
Promise<string>
Beispiel
const plaintext = await window.nostr.nip04.decrypt(
senderPubkey,
ciphertext
);
console.log(plaintext); // "Secret message"nip44.encrypt(pubkey, plaintext)
Verschlüsselt eine Nachricht mit NIP-44. Dieses Beispiel verwendet den Standardaufruf mit zwei Argumenten.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
pubkey | string | Öffentlicher Schlüssel des Empfängers mit 64 Hexadezimalzeichen |
plaintext | string | Zu verschlüsselnde Nachricht |
Rückgabe
Promise<string>
Beispiel
const encrypted = await window.nostr.nip44.encrypt(
recipientPubkey,
"Secret message"
);nip44.decrypt(pubkey, ciphertext)
Entschlüsselt eine NIP-44-Nachricht.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
pubkey | string | Öffentlicher Schlüssel des Absenders mit 64 Hexadezimalzeichen |
ciphertext | string | Zeichenfolge der verschlüsselten Nachricht |
Rückgabe
Promise<string>
Beispiel
const plaintext = await window.nostr.nip44.decrypt(
senderPubkey,
ciphertext
);
console.log(plaintext); // "Secret message"getRelays()
Gibt die in der Erweiterung konfigurierten Relay-URLs zurück. Jeder Eintrag enthält read: true und write: true. Diese Methode ruft keine NIP-65-Relay-Richtlinien des Kontos ab und kann ein leeres Objekt zurückgeben.
Rückgabe
Promise<Record<string, { read: boolean; write: boolean }>>
Beispiel
const relays = await window.nostr.getRelays();
// {
// "wss://relay.damus.io": { read: true, write: true },
// "wss://nos.lol": { read: true, write: true }
// }Verbindung, Berechtigungen und Fehler
Aufrufe geben Promises zurück und können scheitern, wenn Nutzer ablehnen, die Website getrennt ist, der Identitätszugriff deaktiviert ist oder das Zeitlimit abläuft. Schreibgeschützte Konten können weder signieren noch verschlüsseln.
Ein Kontowechsel kann eine ausstehende Anfrage ungültig machen. Seitenaufrufe laufen nach 120 Sekunden ab, einschließlich der Wartezeit auf Verbindung, Berechtigung oder Entsperrung. Fange Fehler ab und ermögliche einen erneuten Versuch; Fehlermeldungen sind keine stabilen maschinenlesbaren Codes.
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 };
}
}Verwende das SDK für Abfragen des Follow-Graphen und die WoT Oracle API für Informationen zu öffentlichen Stummschaltungen. Diese Informationen bleiben von der Follow-Distanz getrennt und ergeben keinen kombinierten Vertrauenswert. Die Erweiterung stellt Identität und Signierung bereit.