Capítulo 1

¿Por qué Nostr?

Qué sale mal cuando una sola empresa es dueña del servidor, y cómo los relays cambian las reglas del juego.

¡Hola, soy Nos! Antes de tocar ninguna clave, vamos a romper algunos servidores. Por la ciencia.

La mañana en que Alice desapareció

Alice hornea los mejores rollos de canela del barrio. En cinco años reunió una audiencia de 20.000 personas en una gran red social. Ahí es donde sus clientes ven el menú del día, donde ella avisa cuando se agota todo y donde sus clientes de siempre la saludan.

Un martes abre la app y ve un recuadro gris: “Tu cuenta ha sido suspendida.” No hay ningún humano a quien llamar. No hay forma de exportar la lista de sus seguidores. Un filtro automático decidió algo, y cinco años de relaciones se quedaron en silencio con un solo clic.

Nadie tuvo que hackear a Alice. Nadie tuvo que discutir con ella. La empresa simplemente era dueña de la sala en la que ella hablaba, y le apagó el micrófono.

No se trata solo de baneos

Ese mismo punto único de control también decide qué ves (el algoritmo), cuánto cuesta (comisiones, anuncios) y si el lugar sigue existiendo (cierres, adquisiciones, caídas). Un baneo es solo la versión más dramática del problema.

Cuatro formas de armar una red social

Tomemos a los mismos cinco amigos (Alice, Bob, Carol, Dave y Erin) y conectémoslos de cuatro formas distintas. Tu trabajo es ser el mono del caos: tumba servidores y luego pulsa Banear a Alice para ver a quién se le sigue escuchando.

  • Centralizada: una empresa, un servidor, todo el mundo vive ahí.
  • Federada: muchos servidores independientes que se reenvían publicaciones entre sí. Es el modelo de federación de Mastodon y del correo electrónico.
  • Nostr: relays sencillos que guardan y reenvían notas, y personas que publican en varios relays a la vez.
  • Bluesky: un diseño más nuevo en el que tus datos viven en un servidor de datos personal (PDS), y grandes agregadores cosen las publicaciones de todos en líneas de tiempo.

Arenero de topologías

Cinco amigos, cuatro formas de armar una red social. Tumba servidores y relays, o banea a Alice, y mira quién todavía puede llegar a su audiencia.

Haz clic o pulsa Enter sobre un servidor o relay para dejarlo fuera de línea. Después prueba a banear a Alice.

Una empresa maneja el único servidor. Todo el mundo vive ahí.

BigCoAAliceBBobCCarolDDaveEErin
Conversaciones que siguen funcionando 20 de 20

Todos los servidores y relays están en línea. Todos pueden llegar a todos.

¿Quién todavía llega a su audiencia?

  • Se le escucha por completo llega a 4 de 4
  • Se le escucha por completo llega a 4 de 4
  • Se le escucha por completo llega a 4 de 4
  • Se le escucha por completo llega a 4 de 4
  • Se le escucha por completo llega a 4 de 4

Todos los servidores y relays están en línea. Todos pueden llegar a todos.

Prueba este orden: tumba BigCo en la red Centralizada, tea.social en la Federada, alpha en Nostr y el AppView en Bluesky. Después vuelve a cada una y pulsa Banear a Alice. ¿Notas el patrón?

¿Qué acaba de pasar?

La red Centralizada es un solo tronco: córtalo y cae el árbol entero. Si banean a Alice, simplemente desaparece, porque la empresa es la red.

La red Federada es mucho mejor. Perder una instancia solo afecta a quienes viven en ella. Pero mira la fila de Alice en el marcador: “Cuenta perdida junto con tea.social.” En un mundo federado tu nombre se ve como @alice@tea.social, y esa segunda mitad es el casero. Si la instancia cierra, o el administrador te banea, tu cuenta y tu lista de seguidores se van con ella. Puedes mudarte, pero solo mientras el antiguo casero siga abriendo la puerta.

Nostr ni se inmuta. La identidad de Alice no es una cuenta en el servidor de nadie: es un par de claves que vive en su propio dispositivo. Cada nota que escribe está firmada con su clave secreta, así que cualquier relay puede guardarla y cualquier lector puede comprobar que de verdad la escribió ella. Envía cada nota a dos relays. Si uno muere, o la banea, el otro todavía la tiene.

Bluesky queda en un punto intermedio. Las cuentas pueden moverse entre servidores de datos, lo cual es genial. Pero en la práctica la mayoría lee a través de un gran relay y un gran AppView, así que tumbar cualquiera de los dos todavía deja a oscuras casi todo hoy en día.

Un mal día: la peor caída individual Para cada modelo tumbamos el servidor o relay cuya caída hace más daño, y contamos cuántas conversaciones entre amigos sobreviven.
Usa las flechas para moverte entre los datos.
Calculado en vivo a partir de las redes de cinco amigos del arenero de arriba.

Por qué los relays son tontos a propósito

Este es el truco que hace funcionar a Nostr: los relays no hablan entre sí y no son dueños de nadie. Un relay es un pequeño servidor que acepta notas firmadas (llamadas eventos) a través de un WebSocket y se las entrega a quien las pida.

Piensa en los relays como apartados de correos más que como una plaza pública. Alice alquila un apartado en dos oficinas de correos y deja una copia de cada carta en ambos. Los carteros de sus amigos (sus clientes) saben qué oficinas usa y van a recoger sus cartas allí. Si una oficina se incendia o se niega a atenderla, las cartas siguen esperando en la otra, y mañana Alice puede abrir un tercer apartado sin pedirle permiso a nadie.

Esa es toda la receta:

  1. Tú eres tus claves. Sin registro, sin nombre de usuario que te puedan confiscar. Tu clave pública (npub) es tu nombre.
  2. Cada nota va firmada. Los relays no pueden falsificar ni editar en secreto lo que dijiste.
  3. Publica en todas partes. Eliges varios relays y puedes cambiarlos cuando quieras.
  4. Los lectores te siguen a ti. Los clientes usan tu lista de relays publicada para encontrar tus notas: ese es el modelo outbox.
Bajo el capó: lo que realmente recibe un relay Mostrar detalles

Todo en Nostr tiene una única forma de datos, definida en NIP-01. Un cliente se la envía a un relay dentro de un mensaje EVENT a través de un WebSocket:

["EVENT", {
  "id": "<sha256 de 32 bytes del evento serializado, en hex>",
  "pubkey": "<clave pública de Alice de 32 bytes, en hex>",
  "created_at": 1735689600,
  "kind": 1,
  "tags": [],
  "content": "¡Los rollos de canela vuelven a las 8!",
  "sig": "<firma Schnorr de 64 bytes del id, en hex>"
}]

El relay responde con ["OK", "<event id>", true, ""] si guardó la nota, o con false más un motivo (por ejemplo "blocked: ..." o "rate-limited: ...") si la rechaza. Fíjate en lo que falta: no hay id de cuenta, ni contraseña, ni nombre de servidor en la identidad de Alice. El pubkey y la sig son todo lo que un relay (o un lector) necesita para saber quién la escribió.

Bajo el capó: publicar en varios relays con nostr-tools Mostrar detalles

La redundancia es solo un bucle. Con nostr-tools:

import { finalizeEvent, generateSecretKey } from "nostr-tools/pure";
import { SimplePool } from "nostr-tools/pool";

const sk = generateSecretKey(); // tu identidad: 32 bytes aleatorios que nunca salen del dispositivo
const note = finalizeEvent(
  { kind: 1, created_at: Math.floor(Date.now() / 1000), tags: [], content: "¡hola, relays!" },
  sk, // calcula el pubkey, el id y la firma
);

const pool = new SimplePool();
const relays = ["wss://relay.alpha.example", "wss://relay.beta.example"];
// Una promesa por relay: basta con que *algún* relay acepte la nota.
await Promise.any(pool.publish(relays, note));

Un relay que rechaza la nota no puede modificarla ni hacerla pasar por suya; lo único que puede hacer es negarse a guardarla.

Bajo el capó: el modelo outbox (NIP-65) Mostrar detalles

¿Cómo se encuentran el cliente de Bob y los relays de Alice? Alice publica un pequeño evento reemplazable de kind 10002 con la lista de sus relays, tal como describe NIP-65:

{
  "kind": 10002,
  "tags": [
    ["r", "wss://relay.alpha.example"],
    ["r", "wss://relay.beta.example", "write"],
    ["r", "wss://relay.gamma.example", "read"]
  ],
  "content": "",
  "...": "pubkey, created_at, id y sig como siempre"
}

Una etiqueta r sin marcador significa “lectura y escritura”. Para mostrar las notas de Alice, el cliente de Bob obtiene su kind 10002 y abre suscripciones en sus relays de escritura (write); para llegar a Alice (respuestas, menciones), publica en sus relays de lectura (read). Por eso el arenero deja que cualquier lector consulte cualquier relay en el que Alice escribe: el cliente va hacia el autor, y no al revés.

Bajo el capó: Mastodon y Bluesky, con un poco más de precisión Mostrar detalles
  • Mastodon / ActivityPub. Tu identidad es @nombre@instancia, que se resuelve a través del endpoint WebFinger de la instancia, y tus publicaciones se firman con claves que guarda la instancia. La migración de cuentas existe (una actividad Move redirige a los seguidores), pero necesita que la instancia antigua siga en línea y colabore.
  • Bluesky / AT Protocol. Tu identidad es un DID (normalmente did:plc) que apunta a tu PDS actual, y tus publicaciones viven ahí en un repositorio firmado. Las cuentas pueden migrar entre PDS, lo que es portabilidad real. Las líneas de tiempo, sin embargo, salen de relays que rastrean todos los PDS y de AppViews que los indexan; cualquiera puede montar uno, pero hoy la mayor parte del tráfico pasa por unos pocos muy grandes.
  • Nostr. La identidad es la clave de firma y cada evento lleva su propia firma, así que no hay nada que migrar: simplemente apuntas a otros relays.

La puntuación del arenero (mira sandbox.ts en los componentes de este capítulo) considera que una conversación sigue viva cuando la publicación de un autor puede llegar a un lector a través de infraestructura en línea que no lo banea, y las personas nunca hacen de relay entre sí.

¿Esto es simplemente “cero moderación”?

No, y es un matiz importante. Cada relay es libre de poner sus propias reglas: bloquear spam, cobrar por el acceso (un relay de pago) o aceptar solo a los miembros de una comunidad. Cada cliente puede filtrar lo que ves, por ejemplo usando tu red de confianza.

Lo que Nostr elimina es el único cuello de botella. La moderación pasa a ser una decisión de muchos relays y muchas apps, en lugar del veredicto de una sola empresa que además tiene tu identidad. Esa propiedad tiene nombre: resistencia a la censura.

Nada es gratis

Ser dueño de tu identidad significa ser dueño del riesgo: si pierdes tu clave secreta no hay botón de “olvidé mi contraseña” (más adelante veremos la pérdida de claves y cómo protegerte). Y con muchos relays independientes no hay una búsqueda global ni un único “contador de visitas” que consultar. El capítulo 12 está dedicado por completo a estas concesiones.

¿De dónde salió Nostr?

Nostr significa “Notes and Other Stuff Transmitted by Relays” (notas y otras cosas transmitidas por relays). Lo propuso en 2020 un desarrollador conocido como fiatjaf, como un protocolo deliberadamente diminuto: un formato de eventos en JSON, un puñado de mensajes por WebSocket y firmas de clave pública. Todo lo demás se añade mediante propuestas opcionales y numeradas llamadas NIPs (Nostr Implementation Possibilities), que se mantienen de forma abierta en github.com/nostr-protocol/nips.

El resto de este curso es un recorrido por esa receta. Lo siguiente: el par de claves que eres tú.

Comprobación rápida

En una red federada como Mastodon, ¿qué le pasa a la cuenta de Alice si su instancia cierra para siempre?

Elige una respuesta

El relay alpha banea a Alice en Nostr. ¿Por qué Bob todavía puede leer sus notas?

Elige una respuesta

¿Cuál de estas afirmaciones sobre los relays de Nostr es verdadera?

Elige una respuesta

Lo esencial

  • En una plataforma centralizada, la empresa tiene tu cuenta, tu audiencia y el interruptor de apagado.
  • La federación reparte los servidores, pero tu cuenta sigue viviendo en (y muriendo con) una sola instancia.
  • En Nostr tu identidad es un par de claves que tú guardas, y publicas las mismas notas firmadas en varios relays a la vez.
  • Los relays son simples y reemplazables: perder uno, o que uno te banee, no te cuesta la voz.
  • Nostr es resistente a la censura, no libre de moderación: cada relay y cada cliente sigue eligiendo qué guarda y qué muestra.