Developer and self-hosted

Nostr

Nostr es un plugin de canal descargable (@openclaw/nostr) que permite a OpenClaw recibir y responder mensajes directos cifrados con NIP-04 mediante relés de Nostr. Una cuenta por gateway; solo mensajes directos.

Instalación

bash
openclaw plugins install @openclaw/nostr

Use la especificación del paquete sin versión para seguir la etiqueta de la versión oficial actual. Fije una versión exacta solo cuando necesite una instalación reproducible.

Desde un checkout local (flujos de trabajo de desarrollo):

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

Reinicie el gateway después de instalar o habilitar plugins. La incorporación (openclaw onboard) y openclaw channels add muestran Nostr desde el catálogo compartido de canales una vez instalado el plugin.

Configuración no interactiva

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 --use-env para mantener NOSTR_PRIVATE_KEY en el entorno en lugar de almacenar la clave en la configuración (solo para la cuenta predeterminada).

Configuración rápida

  1. Genere un par de claves de Nostr (si es necesario):
bash
# Mediante naknak key generate
  1. Añádalo a la configuración:
json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",    },  },}
  1. Exporte la clave:
bash
export NOSTR_PRIVATE_KEY="nsec1..."
  1. Reinicie el gateway.

Referencia de configuración

Clave Tipo Valor predeterminado Descripción
privateKey string obligatorio Clave privada en formato nsec o hexadecimal; se permiten referencias a secretos
relays string[] ['wss://relay.damus.io', 'wss://nos.lol'] URL de relés (WebSocket)
dmPolicy string pairing Política de acceso a mensajes directos
allowFrom string[] [] Claves públicas de remitentes permitidos
enabled boolean true Habilitar o deshabilitar el canal
name string - Nombre para mostrar
profile object - Metadatos del perfil NIP-01

Metadatos del perfil

Los datos del perfil se publican como un evento NIP-01 kind:0. Se pueden administrar desde la interfaz de control (Canales -> Nostr -> Perfil) o definir directamente en la configuración.

Ejemplo:

json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      profile: {        name: "openclaw",        displayName: "OpenClaw",        about: "Bot asistente personal para mensajes directos",        picture: "https://example.com/avatar.png",        banner: "https://example.com/banner.png",        website: "https://example.com",        nip05: "openclaw@example.com",        lud16: "openclaw@example.com",      },    },  },}

Notas:

  • Las URL del perfil deben usar https://.
  • Al importar desde relés, se combinan los campos y se conservan las anulaciones locales.

Control de acceso

Políticas de mensajes directos

  • emparejamiento (predeterminado): los remitentes desconocidos reciben un código de emparejamiento.
  • lista de permitidos: solo las claves públicas incluidas en allowFrom pueden enviar mensajes directos.
  • abierta: mensajes directos entrantes públicos (requiere allowFrom: ["*"]).
  • deshabilitada: se ignoran los mensajes directos entrantes.

Notas sobre la aplicación:

  • Las firmas de los eventos entrantes se verifican antes de aplicar la política de remitentes y descifrar mediante NIP-04, por lo que los eventos falsificados se rechazan de inmediato.
  • Las respuestas de emparejamiento se envían sin descifrar ni procesar el cuerpo del mensaje directo original.
  • Se limita la frecuencia de los mensajes directos entrantes (globalmente y por remitente), y las cargas útiles demasiado grandes se descartan antes de descifrarlas.

Ejemplo de lista de permitidos

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

Formatos de clave

Formatos aceptados:

  • Clave privada: nsec... o una cadena hexadecimal de 64 caracteres
  • Claves públicas (allowFrom): npub... o formato hexadecimal

Relés

Valores predeterminados: relay.damus.io y nos.lol.

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

Consejos:

  • Use entre 2 y 3 relés para obtener redundancia.
  • Evite usar demasiados relés (latencia y duplicación).
  • Los relés de pago pueden mejorar la fiabilidad.
  • Los relés locales son adecuados para las pruebas (ws://localhost:7777).

Compatibilidad con protocolos

NIP Estado Descripción
NIP-01 Compatible Formato básico de eventos y metadatos del perfil
NIP-04 Compatible Mensajes directos cifrados (kind:4)
NIP-17 Planificado Mensajes directos envueltos como regalo
NIP-44 Planificado Cifrado con control de versiones

Pruebas

Relé local

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

Prueba manual

  1. Anote la clave pública del bot que aparece en los registros del gateway o en openclaw channels status (hexadecimal; conviértala a npub en su cliente si es necesario).
  2. Abra un cliente de Nostr (Amethyst, Damus, etc.).
  3. Envíe un mensaje directo a la clave pública del bot.
  4. Verifique la respuesta.

Solución de problemas

No se reciben mensajes

  • Verifique que la clave privada sea válida.
  • Asegúrese de que las URL de los relés sean accesibles y usen wss:// (o ws:// para conexiones locales).
  • Confirme que enabled no sea false.
  • Compruebe si hay errores de conexión con los relés en los registros del gateway.

No se envían respuestas

  • Compruebe que el relé acepte escrituras.
  • Verifique la conectividad saliente.
  • Compruebe si se alcanzan los límites de frecuencia del relé.

Respuestas duplicadas

  • Es algo esperado cuando se usan varios relés.
  • Los mensajes se deduplican mediante el identificador del evento; solo la primera entrega desencadena una respuesta.

Seguridad

  • Nunca confirme claves privadas en el repositorio.
  • Use variables de entorno para las claves.
  • Considere allowlist para bots de producción.
  • Las firmas se verifican antes de aplicar la política de remitentes, y esta se aplica antes de descifrar, por lo que los eventos falsificados se rechazan de inmediato y los remitentes desconocidos no pueden forzar la ejecución completa de las operaciones criptográficas.

Limitaciones (MVP)

  • Solo mensajes directos (sin chats grupales).
  • Sin archivos multimedia adjuntos.
  • Solo NIP-04 (se prevé la envoltura de regalo de NIP-17).

Contenido relacionado

Was this useful?
On this page

On this page