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 (рабочие процессы разработки):
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 в окружении, а не сохранять ключ в конфигурации.
Быстрая настройка
- Сгенерируйте пару ключей Nostr (если нужно):
# Using naknak key generate- Добавьте в конфигурацию:
{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", }, },}- Экспортируйте ключ:
export NOSTR_PRIVATE_KEY="nsec1..."- Перезапустите 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. Ими можно управлять из интерфейса управления (Каналы -> Nostr -> Профиль) или задать напрямую в конфигурации.
Пример:
{ 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: "openclaw@example.com", lud16: "openclaw@example.com", }, }, },}Примечания:
- URL профиля должны использовать
https://. - Импорт из реле объединяет поля и сохраняет локальные переопределения.
Контроль доступа
Политики DM
- pairing (по умолчанию): неизвестные отправители получают код pairing.
- allowlist: отправлять DM могут только pubkeys из
allowFrom. - open: публичные входящие DM (требует
allowFrom: ["*"]). - disabled: игнорировать входящие DM.
Примечания по применению:
- Подписи входящих событий проверяются до политики отправителя и расшифровки NIP-04, поэтому поддельные события отклоняются на раннем этапе.
- Ответы pairing отправляются без обработки тела исходного DM.
- Входящие DM ограничиваются по частоте, а слишком большие payload отбрасываются до расшифровки.
Пример 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 strfrydocker run -p 7777:7777 ghcr.io/hoytech/strfry{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", relays: ["ws://localhost:7777"], }, },}Ручной тест
- Запишите pubkey бота (npub) из логов.
- Откройте клиент Nostr (Damus, Amethyst и т. д.).
- Отправьте DM на pubkey бота.
- Проверьте ответ.
Устранение неполадок
Сообщения не приходят
- Проверьте, что приватный ключ действителен.
- Убедитесь, что URL реле доступны и используют
wss://(илиws://для локального). - Убедитесь, что
enabledне равноfalse. - Проверьте логи Gateway на ошибки подключения к реле.
Ответы не отправляются
- Проверьте, принимает ли реле запись.
- Проверьте исходящее подключение.
- Следите за ограничениями частоты на стороне реле.
Дублирующиеся ответы
- Ожидаемо при использовании нескольких реле.
- Сообщения дедуплицируются по ID события; только первая доставка вызывает ответ.
Безопасность
- Никогда не коммитьте приватные ключи.
- Используйте переменные окружения для ключей.
- Рассмотрите
allowlistдля production-ботов. - Подписи проверяются до политики отправителя, а политика отправителя применяется до расшифровки, поэтому поддельные события отклоняются на раннем этапе, а неизвестные отправители не могут принудительно запускать полный набор криптографических операций.
Ограничения (MVP)
- Только личные сообщения (без групповых чатов).
- Нет медиа-вложений.
- Только NIP-04 (gift-wrap NIP-17 запланирован).
Связанные материалы
- Обзор каналов — все поддерживаемые каналы
- Pairing — аутентификация DM и поток pairing
- Группы — поведение группового чата и ограничение по упоминаниям
- Маршрутизация каналов — маршрутизация сессий для сообщений
- Безопасность — модель доступа и усиление защиты