Developer and self-hosted

Nostr

Стан: Опціональний вбудований plugin (вимкнений за замовчуванням, доки його не налаштовано).

Nostr — це децентралізований протокол для соціальних мереж. Цей канал дає OpenClaw змогу отримувати зашифровані прямі повідомлення (DM) через NIP-04 і відповідати на них.

Вбудований plugin

Поточні випуски OpenClaw постачають Nostr як вбудований plugin, тож звичайні пакетовані збірки не потребують окремого встановлення.

Старіші/користувацькі встановлення

  • Onboarding (openclaw onboard) і openclaw channels add все ще показують Nostr зі спільного каталогу каналів.
  • Якщо ваша збірка не містить вбудований Nostr, установіть npm-пакет напряму.
openclaw plugins install @openclaw/nostr

Використовуйте базовий пакет, щоб стежити за поточним офіційним тегом випуску. Закріплюйте точну версію лише тоді, коли вам потрібне відтворюване встановлення.

Використовуйте локальний checkout (dev workflows):

openclaw plugins install --link <path-to-local-nostr-plugin>

Перезапустіть Gateway після встановлення або ввімкнення plugins.

Неінтерактивне налаштування

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"

Використовуйте --use-env, щоб зберігати NOSTR_PRIVATE_KEY у середовищі замість запису ключа в конфігурацію.

Швидке налаштування

  1. Згенеруйте пару ключів Nostr (за потреби):
# Using nak
nak key generate
  1. Додайте до конфігурації:
{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
    },
  },
}
  1. Експортуйте ключ:
export NOSTR_PRIVATE_KEY="nsec1..."
  1. Перезапустіть Gateway.

Довідник конфігурації

Ключ Тип За замовчуванням Опис
privateKey string обов’язково Приватний ключ у форматі nsec або hex
relays string[] ['wss://relay.damus.io', 'wss://nos.lol'] URL ретрансляторів (WebSocket)
dmPolicy string pairing Політика доступу DM
allowFrom string[] [] Дозволені pubkeys відправників
enabled boolean true Увімкнути/вимкнути канал
name string - Відображуване ім’я
profile object - Метадані профілю NIP-01

Метадані профілю

Дані профілю публікуються як подія NIP-01 kind:0. Ними можна керувати з Control UI (Channels -> Nostr -> Profile) або задати напряму в конфігурації.

Приклад:

{
  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]",
      },
    },
  },
}

Примітки:

  • URL профілю мають використовувати https://.
  • Імпорт із ретрансляторів об’єднує поля та зберігає локальні перевизначення.

Контроль доступу

Політики DM

  • pairing (за замовчуванням): невідомі відправники отримують код pairing.
  • allowlist: DM можуть надсилати лише pubkeys у allowFrom.
  • open: публічні вхідні DM (потрібно allowFrom: ["*"]).
  • disabled: ігнорувати вхідні DM.

Примітки щодо примусового застосування:

  • Підписи вхідних подій перевіряються перед політикою відправника та розшифруванням NIP-04, тому підроблені події відхиляються рано.
  • Відповіді pairing надсилаються без обробки початкового тіла DM.
  • Вхідні DM мають обмеження частоти, а завеликі payloads відкидаються перед розшифруванням.

Приклад allowlist

{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      dmPolicy: "allowlist",
      allowFrom: ["npub1abc...", "npub1xyz..."],
    },
  },
}

Формати ключів

Підтримувані формати:

  • Приватний ключ: nsec... або 64-символьний hex
  • Pubkeys (allowFrom): npub... або hex

Ретранслятори

За замовчуванням: relay.damus.io і nos.lol.

{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"],
    },
  },
}

Поради:

  • Використовуйте 2–3 ретранслятори для резервування.
  • Уникайте надмірної кількості ретрансляторів (затримка, дублювання).
  • Платні ретранслятори можуть підвищити надійність.
  • Локальні ретранслятори підходять для тестування (ws://localhost:7777).

Підтримка протоколів

NIP Стан Опис
NIP-01 Підтримується Базовий формат подій + метадані профілю
NIP-04 Підтримується Зашифровані DM (kind:4)
NIP-17 Заплановано DM у gift-wrap
NIP-44 Заплановано Версійне шифрування

Тестування

Локальний ретранслятор

# Start strfry
docker run -p 7777:7777 ghcr.io/hoytech/strfry
{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      relays: ["ws://localhost:7777"],
    },
  },
}

Ручний тест

  1. Занотуйте pubkey бота (npub) із журналів.
  2. Відкрийте клієнт Nostr (Damus, Amethyst тощо).
  3. Надішліть DM на pubkey бота.
  4. Перевірте відповідь.

Усунення несправностей

Повідомлення не надходять

  • Перевірте, що приватний ключ чинний.
  • Переконайтеся, що URL ретрансляторів доступні та використовують wss:// (або ws:// для локального).
  • Підтвердьте, що enabled не дорівнює false.
  • Перевірте журнали Gateway на помилки з’єднання з ретрансляторами.

Відповіді не надсилаються

  • Перевірте, що ретранслятор приймає записи.
  • Перевірте вихідне з’єднання.
  • Стежте за обмеженнями частоти ретранслятора.

Дубльовані відповіді

  • Очікувано під час використання кількох ретрансляторів.
  • Повідомлення дедуплікуються за ID події; лише перша доставка запускає відповідь.

Безпека

  • Ніколи не комітьте приватні ключі.
  • Використовуйте змінні середовища для ключів.
  • Розгляньте allowlist для production-ботів.
  • Підписи перевіряються перед політикою відправника, а політика відправника застосовується перед розшифруванням, тому підроблені події відхиляються рано, а невідомі відправники не можуть примусити виконувати повну криптографічну роботу.

Обмеження (MVP)

  • Лише прямі повідомлення (без групових чатів).
  • Без медіавкладень.
  • Лише NIP-04 (NIP-17 gift-wrap заплановано).

Пов’язане