Nostr WoT

Dokumentation

Alles, was Sie brauchen, um Web of Trust in Ihre Anwendung zu integrieren.

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.

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();
}

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

javascript
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

NameTypBeschreibung
eventUnsignedEventEreignis mit kind, content, tags und created_at (Unix-Zeit in Sekunden)

Rückgabe

Promise<SignedEvent>

Beispiel

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)

Verschlüsselt eine Nachricht mit NIP-04, dem älteren Verschlüsselungsformat für Direktnachrichten.

Parameter

NameTypBeschreibung
pubkeystringÖffentlicher Schlüssel des Empfängers mit 64 Hexadezimalzeichen
plaintextstringZu verschlüsselnde Nachricht

Rückgabe

Promise<string>

Beispiel

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

nip04.decrypt(pubkey, ciphertext)

Entschlüsselt eine NIP-04-Nachricht.

Parameter

NameTypBeschreibung
pubkeystringÖffentlicher Schlüssel des Absenders mit 64 Hexadezimalzeichen
ciphertextstringZeichenfolge der verschlüsselten Nachricht

Rückgabe

Promise<string>

Beispiel

javascript
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

NameTypBeschreibung
pubkeystringÖffentlicher Schlüssel des Empfängers mit 64 Hexadezimalzeichen
plaintextstringZu verschlüsselnde Nachricht

Rückgabe

Promise<string>

Beispiel

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

nip44.decrypt(pubkey, ciphertext)

Entschlüsselt eine NIP-44-Nachricht.

Parameter

NameTypBeschreibung
pubkeystringÖffentlicher Schlüssel des Absenders mit 64 Hexadezimalzeichen
ciphertextstringZeichenfolge der verschlüsselten Nachricht

Rückgabe

Promise<string>

Beispiel

javascript
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

javascript
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.

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 };
  }
}

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.