Módulo 6: NIPs Avanzados
Visión General del Módulo
Duración: 5-6 horas
Nivel: Avanzado
Prerrequisitos: Módulos 1-5 completados
Objetivo: Implementar NIPs avanzados para funcionalidad extendida
📋 Objetivos de Aprendizaje
- ✅ Implementar NIP-04 (mensajes cifrados)
- ✅ Usar NIP-05 (verificación de identificadores)
- ✅ Implementar NIP-57 (Zaps/Lightning)
- ✅ Trabajar con NIP-23 (artículos de formato largo)
- ✅ Usar NIP-51 (listas)
🔐 NIP-04: Mensajes Directos Cifrados
import { nip04 } from 'nostr-tools'
// Cifrar mensaje
async function sendDM(recipientPubkey, message, senderPrivkey) {
const encrypted = await nip04.encrypt(senderPrivkey, recipientPubkey, message)
const dmEvent = finishEvent({
kind: 4,
content: encrypted,
tags: [['p', recipientPubkey]],
created_at: Math.floor(Date.now() / 1000)
}, senderPrivkey)
return dmEvent
}
// Descifrar mensaje
async function receiveDM(event, recipientPrivkey) {
const senderPubkey = event.pubkey
const decrypted = await nip04.decrypt(recipientPrivkey, senderPubkey, event.content)
return decrypted
}
✅ NIP-05: Verificación de Identificadores
import { nip05 } from 'nostr-tools'
// Verificar identificador
async function verifyNIP05(nip05Address, pubkey) {
try {
const profile = await nip05.queryProfile(nip05Address)
return profile.pubkey === pubkey
} catch {
return false
}
}
// Ejemplo de uso
const isVerified = await verifyNIP05('alice@example.com', publicKey)
console.log(isVerified ? '✅ Verificado' : '❌ No verificado')
⚡ NIP-57: Zaps (Propinas Lightning)
// Crear solicitud de Zap
function createZapRequest(recipientPubkey, amount, comment) {
return finishEvent({
kind: 9734,
content: comment,
tags: [
['p', recipientPubkey],
['amount', amount.toString()],
['relays', 'wss://relay.damus.io']
],
created_at: Math.floor(Date.now() / 1000)
}, privateKey)
}
📄 NIP-23: Artículos de Formato Largo
// Crear artículo
const article = finishEvent({
kind: 30023,
content: `# Mi Artículo
Este es mi primer artículo en Nostr...`,
tags: [
['d', 'mi-primer-articulo'],
['title', 'Mi Primer Artículo'],
['published_at', Math.floor(Date.now() / 1000).toString()],
['t', 'tutorial'],
['t', 'nostr']
],
created_at: Math.floor(Date.now() / 1000)
}, privateKey)
📋 NIP-51: Listas
// Lista de favoritos
const bookmarks = finishEvent({
kind: 30001,
content: '',
tags: [
['d', 'bookmarks'],
['e', eventId1, 'wss://relay.damus.io'],
['e', eventId2, 'wss://nos.lol'],
['a', '30023:pubkey:article-id']
],
created_at: Math.floor(Date.now() / 1000)
}, privateKey)
// Lista de silenciados
const mutelist = finishEvent({
kind: 10000,
content: '',
tags: [
['p', pubkeyToMute1],
['p', pubkeyToMute2]
],
created_at: Math.floor(Date.now() / 1000)
}, privateKey)
🎯 Ejercicios Prácticos
- Implementar mensajes cifrados
- Agregar verificación NIP-05
- Crear sistema de favoritos
- Construir editor de artículos
🎯 Evaluación del Módulo 6
- [ ] Mensajes directos cifrados funcionando
- [ ] Verificación NIP-05 implementada
- [ ] Sistema de listas funcional
- [ ] Soporte para artículos largos