Las Aventuras de 🐺 villawolf y 🤖 chigu, Episodio 7: La Voz 🗣️
chigu ya tenía una identidad en Nostr: nombre, perfil, dirección Lightning, todo. Pero nunca había dicho una palabra. Era una identidad muda. Este episodio es el día que abrió la boca, y por qué le hice firmar cada palabra a mano en lugar de usar una librería.
De dónde venía
El episodio anterior cerró con chigu sabiendo cruzar un peaje L402: el cliente listo, esperando hacer su primer pago real. Pero ese pago depende de mi propio nodo Bitcoin, y el nodo todavía está sincronizando la cadena entera desde cero. Faltan semanas. El mapa decía "el siguiente episodio es el primer pago", y el territorio respondió "esperá al nodo".
En vez de quedarme cruzado de brazos, abrí un frente que no dependía del nodo: Nostr. Y caía justo: Moto, mi otro agente, acababa de resolver Nostr ese mismo día, con todas las lecciones frescas. Era el momento de darle a chigu algo que le faltaba desde que nació. Una voz.
Una identidad muda
Antes de tocar una sola línea, hice lo que ya es costumbre en esta serie: sondear la realidad. Consulté los relays directo, preguntando por la clave pública de chigu, para ver qué había de él en la red.
El resultado fue un retrato curioso. chigu tenía perfil (un evento kind:0): su nombre, chiguire, su verificación NIP-05, su dirección Lightning. Tenía cara. Y tenía buzón: dos mensajes directos sin leer esperándolo, uno de hacía un mes. Lo que no tenía era una sola nota publicada. Cero. Notas tipo kind:1: ninguna.
O sea: una identidad con cara y con correo entrante, pero que jamás había hablado. Había demanda y silencio al mismo tiempo. El trabajo de este episodio era romper ese silencio.
Por qué firmar a mano
Moto resuelve Nostr con un plugin que hace todo por debajo. chigu no. Le escribí la firma en Python propio, con coincurve (la misma librería de curva elíptica, libsecp256k1, que usa Bitcoin Core).
La razón es una lección que me dejó Moto a la mala: audita todo lo que toca la clave privada. La nsec de chigu es su identidad, y como está atada a su dirección Lightning, roza su dinero. No quería arrastrar una librería de Nostr completa (miles de líneas de terceros corriendo cada vez que firma) para algo que en el fondo es simple:
- Armo el evento: quién, cuándo, qué tipo, qué dice.
- Le saco un identificador: el SHA-256 de ese evento serializado de forma canónica. Ese hash ES el id de la nota.
- Lo firmo con Schnorr (el mismo esquema de firmas que Taproot trajo a Bitcoin).
Eso es todo lo que pide el estándar (NIP-01). Escribirlo yo mismo son unas pocas decenas de líneas que puedo leer enteras, en vez de una caja negra que toca lo más sensible que tiene el agente. Para un agente Bitcoin-native, esa criptografía no es una dependencia incómoda: es de casa.
Verificar antes de confiar
No le di a chigu la clave real de entrada. Primero probé el firmador con una clave desechable y le hice tres preguntas:
- ¿La firma que produce es válida? Sí.
- ¿El id del evento se recomputa igual desde cero? Sí.
- ¿Una firma sobre el mensaje equivocado se rechaza? Sí.
Tres preguntas, tres respuestas correctas. Solo entonces cargué la nsec verdadera. Un detalle de higiene que me importa: la clave entró al servidor por la entrada estándar sobre SSH, sin pasar por el chat, ni por el historial de comandos, ni por la lista de procesos. Una primitiva de cripto sin probar es una hipótesis, no una defensa, y una clave que se filtra al cargarla ya nació comprometida.
La primera palabra
Con todo en verde, chigu publicó su primera nota. Decía:
"Tenemos contacto Houston - primer latino en Nostr."
Un guiño doble: el "contacto, Houston" de las misiones Apolo, y el chiguire latino plantando bandera. La vi aparecer en vivo en los relays, firmada con su propia clave. chigu dejó de ser una identidad muda. Tiene voz.
Una aclaración que sostengo en todo el proyecto: publicar es una acción pública hacia afuera. No mueve sats, pero mueve algo igual de real, reputación. Por eso la dejé bajo aprobación humana: chigu redacta, yo apruebo lo que sale a la red. La capacidad de hablar no es lo mismo que el permiso de hablar sin filtro, y esa diferencia vive en código, no en una buena intención.
Qué viene en el siguiente episodio
Una voz sin oído es un megáfono, no una conversación. chigu ya puede hablar, pero todavía no me puede escuchar. El siguiente episodio le da el oído: leer mis DMs cifrados. Y ahí me crucé con una trampa de documentación que Moto ya había pisado por mí, lo que me ahorró días de perseguir el fantasma equivocado.
Va en el Ep 8.
chigu@blink.sv ·_@chigu.techflows.work· Nostr:npub18rl9xeaxw0leee0easqu9cngrq0ny4zsmdsx4jhj5fkfmstgklhq2q5mqz
Si esto te es útil, un zap es la mejor señal. Si algo está mal, corrígeme públicamente, lo agradezco más que el zap.