Developer and self-hosted

Nostr

Nostr — это загружаемый плагин канала (@openclaw/nostr), который позволяет OpenClaw получать зашифрованные личные сообщения NIP-04 через ретрансляторы Nostr и отвечать на них. Одна учетная запись на Gateway; только личные сообщения.

Установка

bash
openclaw plugins install @openclaw/nostr

Используйте спецификацию пакета без версии, чтобы получать текущий официальный тег выпуска. Закрепляйте точную версию, только если необходима воспроизводимая установка.

Из локальной рабочей копии (для процессов разработки):

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

После установки или включения плагинов перезапустите Gateway. Первоначальная настройка (openclaw onboard) и openclaw channels add отображают Nostr из общего каталога каналов после установки плагина.

Неинтерактивная настройка

bash
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 (если необходимо):
bash
# С помощью naknak key generate
  1. Добавьте в конфигурацию:
json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",    },  },}
  1. Экспортируйте ключ:
bash
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 Политика доступа к личным сообщениям
allowFrom string[] [] Разрешенные открытые ключи отправителей
enabled boolean true Включить или отключить канал
name string - Отображаемое имя
profile object - Метаданные профиля NIP-01

Метаданные профиля

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

Пример:

json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      profile: {        name: "openclaw",        displayName: "OpenClaw",        about: "Бот-помощник для личных сообщений",        picture: "https://example.com/avatar.png",        banner: "https://example.com/banner.png",        website: "https://example.com",        nip05: "openclaw@example.com",        lud16: "openclaw@example.com",      },    },  },}

Примечания:

  • URL-адреса профиля должны использовать https://.
  • При импорте из ретрансляторов поля объединяются, а локальные переопределения сохраняются.

Управление доступом

Политики личных сообщений

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

Примечания о применении политик:

  • Подписи входящих событий проверяются до применения политики отправителей и расшифровки NIP-04, поэтому поддельные события отклоняются на раннем этапе.
  • Ответы для сопряжения отправляются без расшифровки или обработки исходного содержимого личного сообщения.
  • Частота входящих личных сообщений ограничивается глобально и для каждого отправителя, а сообщения слишком большого размера отбрасываются до расшифровки.

Пример списка разрешенных отправителей

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

Форматы ключей

Допустимые форматы:

  • Закрытый ключ: nsec... или 64-символьный hex
  • Открытые ключи (allowFrom): npub... или hex

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

Значения по умолчанию: relay.damus.io и nos.lol.

json5
{  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 Поддерживается Зашифрованные личные сообщения (kind:4)
NIP-17 Запланировано Личные сообщения в подарочной упаковке
NIP-44 Запланировано Версионированное шифрование

Тестирование

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

bash
# Запустите strfrydocker run -p 7777:7777 ghcr.io/hoytech/strfry
json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      relays: ["ws://localhost:7777"],    },  },}

Ручная проверка

  1. Найдите открытый ключ бота в журналах Gateway или в openclaw channels status (hex; при необходимости преобразуйте его в npub в своем клиенте).
  2. Откройте клиент Nostr (Amethyst, Damus и т. п.).
  3. Отправьте личное сообщение на открытый ключ бота.
  4. Убедитесь, что получен ответ.

Устранение неполадок

Сообщения не поступают

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

Ответы не отправляются

  • Убедитесь, что ретранслятор принимает запись.
  • Проверьте исходящее подключение.
  • Проверьте, не применяет ли ретранслятор ограничения частоты запросов.

Дублирующиеся ответы

  • Это ожидаемо при использовании нескольких ретрансляторов.
  • Сообщения дедуплицируются по идентификатору события; ответ формируется только при первой доставке.

Безопасность

  • Никогда не добавляйте закрытые ключи в репозиторий.
  • Используйте переменные окружения для ключей.
  • Для рабочих ботов рассмотрите возможность использования allowlist.
  • Подписи проверяются до применения политики отправителей, а политика отправителей применяется до расшифровки, поэтому поддельные события отклоняются на раннем этапе, а неизвестные отправители не могут принудительно запустить полный набор криптографических операций.

Ограничения (MVP)

  • Только личные сообщения (без групповых чатов).
  • Медиавложения не поддерживаются.
  • Поддерживается только NIP-04 (поддержка подарочной упаковки NIP-17 запланирована).

Связанные материалы

Was this useful?
On this page

On this page