NIP-01 define el protocolo fundamental de Nostr, estableciendo las estructuras de datos y los patrones de comunicación sobre los que se construyen todos los demás NIPs.

Eventos

Los eventos son el único tipo de objeto en Nostr. Cada pieza de datos, desde una actualización de perfil hasta una publicación de texto o una reacción, se representa como un evento con esta estructura:

  • id: Hash SHA256 del evento serializado (identificador único)
  • pubkey: La clave pública del creador (32 bytes en hex, secp256k1)
  • created_at: Marca de tiempo Unix
  • kind: Entero que categoriza el tipo de evento
  • tags: Array de arrays para metadatos
  • content: El contenido (la interpretación depende del kind)
  • sig: Firma Schnorr que demuestra autenticidad

Kinds

Los kinds determinan cómo los relays almacenan y manejan los eventos:

  • Eventos regulares (1, 2, 4-44, 1000-9999): Se almacenan normalmente, se guardan todas las versiones
  • Eventos reemplazables (0, 3, 10000-19999): Solo se guarda el más reciente por pubkey
  • Eventos efímeros (20000-29999): No se almacenan, solo se reenvían a los suscriptores
  • Eventos direccionables (30000-39999): El más reciente por combinación de pubkey + kind + etiqueta d

Los kinds principales incluyen: 0 (metadatos de usuario), 1 (nota de texto), 3 (lista de seguidos).

Comunicación Cliente-Relay

Los clientes se comunican con los relays a través de conexiones WebSocket usando arrays JSON:

Cliente a relay:

  • ["EVENT", <event>] - Publicar un evento
  • ["REQ", <sub-id>, <filter>, ...] - Suscribirse a eventos
  • ["CLOSE", <sub-id>] - Terminar una suscripción

Relay a cliente:

  • ["EVENT", <sub-id>, <event>] - Entregar evento coincidente
  • ["EOSE", <sub-id>] - Fin de eventos almacenados (ahora transmitiendo en vivo)
  • ["OK", <event-id>, <true|false>, <message>] - Confirmación de aceptación/rechazo
  • ["NOTICE", <message>] - Mensaje legible para humanos

Filtros

Los filtros especifican qué eventos recuperar, con campos que incluyen: ids, authors, kinds, #e/#p/#t (valores de etiquetas), since/until, y limit. Las condiciones dentro de un filtro usan lógica AND; múltiples filtros en un REQ se combinan con lógica OR.


Fuentes primarias:

Mencionado en:

Ver también: