Developer and self-hosted
Nostr
Status: Opcjonalny dołączony Plugin (domyślnie wyłączony do czasu skonfigurowania).
Nostr to zdecentralizowany protokół sieci społecznościowych. Ten kanał umożliwia OpenClaw odbieranie zaszyfrowanych wiadomości bezpośrednich (DM) i odpowiadanie na nie przez NIP-04.
Dołączony Plugin
Bieżące wydania OpenClaw dostarczają Nostr jako dołączony Plugin, więc zwykłe spakowane kompilacje nie wymagają osobnej instalacji.
Starsze/niestandardowe instalacje
- Onboarding (
openclaw onboard) orazopenclaw channels addnadal pokazują Nostr ze współdzielonego katalogu kanałów. - Jeśli Twoja kompilacja wyklucza dołączony Nostr, zainstaluj pakiet npm bezpośrednio.
openclaw plugins install @openclaw/nostr
Użyj samego pakietu, aby śledzić bieżący oficjalny tag wydania. Przypnij dokładną wersję tylko wtedy, gdy potrzebujesz powtarzalnej instalacji.
Użyj lokalnej kopii roboczej (przepływy deweloperskie):
openclaw plugins install --link <path-to-local-nostr-plugin>
Uruchom ponownie Gateway po zainstalowaniu lub włączeniu pluginów.
Konfiguracja nieinteraktywna
openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY"
openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY" --relay-urls "wss://relay.damus.io,wss://relay.primal.net"
Użyj --use-env, aby zachować NOSTR_PRIVATE_KEY w środowisku zamiast przechowywać klucz w konfiguracji.
Szybka konfiguracja
- Wygeneruj parę kluczy Nostr (jeśli potrzebna):
# Using nak
nak key generate
- Dodaj do konfiguracji:
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
},
},
}
- Wyeksportuj klucz:
export NOSTR_PRIVATE_KEY="nsec1..."
- Uruchom ponownie Gateway.
Dokumentacja konfiguracji
| Klucz | Typ | Domyślnie | Opis |
|---|---|---|---|
privateKey |
string | wymagane | Klucz prywatny w formacie nsec lub hex |
relays |
string[] | ['wss://relay.damus.io', 'wss://nos.lol'] |
Adresy URL przekaźników (WebSocket) |
dmPolicy |
string | pairing |
Zasady dostępu do DM |
allowFrom |
string[] | [] |
Dozwolone klucze publiczne nadawców |
enabled |
boolean | true |
Włącz/wyłącz kanał |
name |
string | - | Nazwa wyświetlana |
profile |
object | - | Metadane profilu NIP-01 |
Metadane profilu
Dane profilu są publikowane jako zdarzenie NIP-01 kind:0. Możesz zarządzać nimi z Control UI (Channels -> Nostr -> Profile) albo ustawić je bezpośrednio w konfiguracji.
Przykład:
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
profile: {
name: "openclaw",
displayName: "OpenClaw",
about: "Personal assistant DM bot",
picture: "https://example.com/avatar.png",
banner: "https://example.com/banner.png",
website: "https://example.com",
nip05: "[email protected]",
lud16: "[email protected]",
},
},
},
}
Uwagi:
- Adresy URL profilu muszą używać
https://. - Importowanie z przekaźników scala pola i zachowuje lokalne nadpisania.
Kontrola dostępu
Zasady DM
- pairing (domyślnie): nieznani nadawcy otrzymują kod parowania.
- allowlist: DM mogą wysyłać tylko klucze publiczne z
allowFrom. - open: publiczne przychodzące DM (wymaga
allowFrom: ["*"]). - disabled: ignoruj przychodzące DM.
Uwagi dotyczące wymuszania:
- Podpisy zdarzeń przychodzących są weryfikowane przed zasadami nadawcy i odszyfrowaniem NIP-04, więc sfałszowane zdarzenia są odrzucane wcześnie.
- Odpowiedzi parowania są wysyłane bez przetwarzania pierwotnej treści DM.
- Przychodzące DM są ograniczane limitem szybkości, a zbyt duże ładunki są odrzucane przed odszyfrowaniem.
Przykład allowlist
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
dmPolicy: "allowlist",
allowFrom: ["npub1abc...", "npub1xyz..."],
},
},
}
Formaty kluczy
Akceptowane formaty:
- Klucz prywatny:
nsec...lub 64-znakowy hex - Klucze publiczne (
allowFrom):npub...lub hex
Przekaźniki
Domyślnie: relay.damus.io i nos.lol.
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"],
},
},
}
Wskazówki:
- Używaj 2-3 przekaźników dla redundancji.
- Unikaj zbyt wielu przekaźników (opóźnienia, duplikacja).
- Płatne przekaźniki mogą poprawić niezawodność.
- Lokalne przekaźniki dobrze sprawdzają się w testach (
ws://localhost:7777).
Obsługa protokołu
| NIP | Status | Opis |
|---|---|---|
| NIP-01 | Obsługiwane | Podstawowy format zdarzeń + metadane profilu |
| NIP-04 | Obsługiwane | Szyfrowane DM (kind:4) |
| NIP-17 | Planowane | DM w opakowaniu prezentowym |
| NIP-44 | Planowane | Szyfrowanie wersjonowane |
Testowanie
Lokalny przekaźnik
# Start strfry
docker run -p 7777:7777 ghcr.io/hoytech/strfry
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
relays: ["ws://localhost:7777"],
},
},
}
Test ręczny
- Zanotuj klucz publiczny bota (npub) z logów.
- Otwórz klienta Nostr (Damus, Amethyst itd.).
- Wyślij DM na klucz publiczny bota.
- Zweryfikuj odpowiedź.
Rozwiązywanie problemów
Wiadomości nie są odbierane
- Zweryfikuj, czy klucz prywatny jest prawidłowy.
- Upewnij się, że adresy URL przekaźników są osiągalne i używają
wss://(lubws://lokalnie). - Potwierdź, że
enablednie ma wartościfalse. - Sprawdź logi Gateway pod kątem błędów połączeń z przekaźnikami.
Odpowiedzi nie są wysyłane
- Sprawdź, czy przekaźnik akceptuje zapisy.
- Zweryfikuj łączność wychodzącą.
- Uważaj na limity szybkości przekaźników.
Zduplikowane odpowiedzi
- Oczekiwane przy używaniu wielu przekaźników.
- Wiadomości są deduplikowane według identyfikatora zdarzenia; tylko pierwsze dostarczenie wywołuje odpowiedź.
Bezpieczeństwo
- Nigdy nie commituj kluczy prywatnych.
- Używaj zmiennych środowiskowych dla kluczy.
- Rozważ
allowlistdla botów produkcyjnych. - Podpisy są weryfikowane przed zasadami nadawcy, a zasady nadawcy są wymuszane przed odszyfrowaniem, więc sfałszowane zdarzenia są odrzucane wcześnie, a nieznani nadawcy nie mogą wymusić pełnej pracy kryptograficznej.
Ograniczenia (MVP)
- Tylko wiadomości bezpośrednie (bez czatów grupowych).
- Brak załączników multimedialnych.
- Tylko NIP-04 (planowany gift-wrap NIP-17).
Powiązane
- Przegląd kanałów — wszystkie obsługiwane kanały
- Parowanie — uwierzytelnianie DM i przepływ parowania
- Grupy — zachowanie czatu grupowego i kontrola wzmianek
- Routing kanałów — routing sesji dla wiadomości
- Bezpieczeństwo — model dostępu i utwardzanie