← Volver a todos los proyectos

Proyecto para cliente10 min de lectura

AllYouNeedIsNft: startup de marketplace de NFT

AllYouNeedIsNft: startup de marketplace de NFT

Tecnologías

ReactNextJSSolidity.NET CoreGraphQLHot ChocolateNethereumMetaMaskDockerIPFSWebSocketsMicroservicesDDDNFTCryptoProjectFrontendStartup

Servicios

  • →Cofundación y liderazgo técnico
  • →Arquitectura y desarrollo de frontend (Next.js)
  • →Integración de contratos inteligentes de Ethereum (Solidity + ethers.js)
  • →UX de autenticación por wallet (MetaMask, WalletConnect)
  • →Planificación de producto, hoja de ruta y contratación de ingenieros

Entregables

  • ✓Marketplace de NFT en funcionamiento, listado, compra y venta de tokens en mainnet de Ethereum
  • ✓Páginas de perfil de creador y colección con rutas optimizadas para SEO
  • ✓Flujo de onboarding de wallet diseñado para usuarios sin experiencia previa en cripto
  • ✓MVP lanzado en 3 meses desde cero líneas de código

Desafío

Cofundé AllYouNeedIsNft en un momento en que los marketplaces de NFT estaban en auge pero el espacio estaba dominado por OpenSea. La ventana para entrar era estrecha: lanzar rápido un marketplace funcional, diferenciarse por UX, y establecer relaciones con creadores antes de que el mercado se enfriara. El desafío técnico era real. La integración con blockchain, la seguridad de los contratos inteligentes, la autenticación por wallet y un frontend de nivel consumidor tenían que construirse desde cero por un equipo pequeño sin una base de código existente.

Descubrimiento

Las conversaciones tempranas con artistas y coleccionistas revelaron una queja constante sobre las plataformas existentes: flujos de wallet confusos, mala experiencia móvil y ninguna consideración para creadores emergentes. La oportunidad era un marketplace que se sintiera tan simple como una tienda ecommerce mientras ocultaba la complejidad de blockchain por debajo.

Opciones consideradas

  1. Bifurcar los contratos de código abierto de OpenSea, evaluado. Se usaron como referencia pero no se bifurcaron directamente; la lógica de negocio requería mecánicas propias de regalías y subastas.
  2. Usar un marketplace como servicio (por ejemplo, Rarible Protocol), rechazado. Demasiado lock-in; la estructura de comisiones no era viable para el segmento de creadores objetivo.
  3. Contratos personalizados en Solidity + frontend en Next.js: elegida. Control total sobre la lógica de los contratos, la optimización de gas y la UX.

Decisión

Next.js para el frontend (SSR para SEO en las páginas de colecciones), Solidity para los contratos de marketplace y regalías en Ethereum, ethers.js para la interacción con la wallet. MetaMask y WalletConnect cubrían las dos superficies de wallet dominantes. Las decisiones de arquitectura se tomaron con la velocidad del MVP como restricción principal. La extensibilidad en segundo lugar.

‹›
aA🔒www.allyouneedisnft.com/
⇧▢+
Home

allyouneedisnft.com, scrollable snapshot of the live marketplace

Implementación

Lideré toda la arquitectura del frontend: el enrutamiento, el flujo de conexión de wallet, la capa de interacción con contratos y las páginas de colección/token. El flujo de autenticación por wallet fue un desafío de UX particular, tenía que funcionar para usuarios que nunca habían tocado criptomonedas. Diseñé un modal de onboarding paso a paso que guiaba a los nuevos usuarios a través de la instalación de MetaMask y la conexión sin salir de la página.

Detrás del marketplace había un motor de indexación propio que hablaba con la blockchain directamente a través de la librería Nethereum. Extraía los datos de los tokens en cadena, leía el JSON de metadatos para ERC-1155, ERC-721 y varios formatos más, y guardaba los atributos de las colecciones en una base de datos local. Las imágenes se descargaban de IPFS y se reescalaban a los tamaños que el sitio muestra realmente, de modo que las páginas de colección nunca cargaban los originales a resolución completa.

La caché funcionaba por lazy load: una colección se indexaba la primera vez que alguien la abría, bajo demanda, en lugar de rastrear toda la cadena por adelantado. El progreso de la actualización se enviaba al navegador por WebSockets y se mostraba como una barra de progreso en vivo, así que en la primera visita a una colección grande se veía cómo se iba llenando en vez de una página vacía.

Impulsé las decisiones de producto semana a semana: prioricé los flujos de compra y listado para el MVP, y postergué las subastas y ofertas a la v2. Incorporé a dos ingenieros, definí la estrategia de ramificación y realicé demos semanales con los cofundadores para mantener la hoja de ruta honesta.

Resultado

El MVP se lanzó en 3 meses desde cero. Las primeras colecciones de creadores salieron en vivo en el pico del interés del mercado de NFT. La plataforma manejó transacciones reales en mainnet sin exploits de contratos. Sirvió como una fuerte prueba de concepto de la capacidad del equipo para ejecutar en un espacio de rápido movimiento y técnicamente complejo.

El motor de indexación en acción

Generación de miniaturas

Generación de miniaturas para las imágenes de la colección. La colección se descarga en segundo plano como un proceso microservicio aparte, de modo que el sitio principal no se bloquea mientras tanto, y los archivos se van dejando en disco según llegan, en vez de mantenerse en memoria o volver a pedirse en cada petición.

Caché bajo demanda

Para que el sitio cargara muy rápido, construí una caché propia. Descargaba el JSON de la colección desde la blockchain, bajaba las imágenes y creaba copias redimensionadas. La caché se regeneraba una vez al día bajo demanda: si alguien abría una colección con la caché caducada, empezaba la actualización, y la caché nueva llegaba a todos los que abrían esa colección después.

Rider con DbEntityOnDemandCache abierto: el método que lee entidades en caché por patrón de clave, bajo el depurador
La caché bajo demanda en el código

En el frontend la actualización de la caché se veía como una barra de progreso alimentada por una conexión WebSocket. La actualización de la colección se lanzaba como un proceso en segundo plano independiente para no frenar el resto del sitio, y escribía su estado en el socket a medida que avanzaba. El frontend movía la barra de progreso con cada actualización.

Página de colección con el aviso Collection cache is out of date and refetching now y una barra de progreso llenándose
La barra de progreso de la actualización de la caché

Cuando terminaba la indexación, la página mostraba un botón de recarga y todos los elementos de la colección se recargaban ya con sus imágenes. En el backend el progreso se veía así: el servicio registraba cada token actualizado y el porcentaje completado, y enviaba cada paso a los oyentes del socket.

Colección de 25 elementos actualizando su caché: la barra de progreso a medias y las tarjetas esperando sus imágenes
Log del backend: el servicio de tokens actualiza los tokens uno a uno con el porcentaje completado y envía cada paso a los oyentes del socket

La actualización en la página y en el log del backend

Nethereum y Domain-Driven Design

Para hablar con la blockchain, el backend usaba Nethereum, una librería de Ethereum para .NET. La captura muestra cómo se crea un nuevo elemento NFT a partir de sus metadatos, con un envoltorio basado en un tipo genérico para que el mismo código sirva a distintos tipos de token. Todo el proyecto siguió Domain-Driven Design y se dividió en capas: el dominio con las entidades y los procesos de negocio, la infraestructura para la base de datos y la blockchain, y la capa de aplicación encima.

Depurador de Rider en el servicio genérico Web3TokenService: un token NFT creado a partir de metadatos de IPFS con TNftToken.Create
Creación de un elemento NFT con el servicio de tokens genérico

GraphQL con Hot Chocolate

El backend se construyó sobre GraphQL, una tecnología puntera en aquel momento, con la librería Hot Chocolate. Encima funcionaban varios trucos de SQL: carga diferida de campos concretos y la regeneración de la caché al pedir un campo determinado dentro de un objeto de proyección.

Consola de depuración de Rider: el pipeline de Hot Chocolate GraphQL atiende una petición y la consulta SQL que generó para los contratos inteligentes
Una petición GraphQL y el SQL que hay detrás

Colecciones, día a día

Algunas etapas intermedias de la página de colecciones. Cada día se añadían colecciones nuevas al sitio, y cada captura muestra el catálogo un poco más avanzado.

Página de colecciones en Fantom: Underside, Littleshit, Elon we got the project, Vanilla Sunrise y Mood shop
Una etapa posterior de la página de colecciones con la nueva colección What a Wonderful Arts resaltada

Dos etapas de la página de colecciones

Backend en .NET Core

Así era el backend de AllYouNeedIsNFT. Todo funcionaba sobre .NET Core, así que la mayor parte del desarrollo se hacía en JetBrains Rider. La solución vivía en un monorepo junto a paquetes compartidos, y cada servicio se construía como una imagen de Docker.

JetBrains Rider con la solución AYNN.Application: apps y paquetes compartidos en un monorepo, y el build del servicio en Docker en el terminal

La solución del backend en Rider

Inicio de sesión con firma de wallet

Para confirmar que un usuario es realmente dueño de la dirección de wallet que declara, creamos un mecanismo de autenticación propio. El sitio le pide firmar un mensaje arbitrario con un token de seguridad de un solo uso, y luego el backend verifica la firma. Una firma válida demuestra que la persona tiene el derecho de firma de esa dirección concreta, así que no queda duda de quién es.

Las capturas de abajo muestran la verificación de la firma bajo el depurador: el servicio recupera la dirección a partir del mensaje firmado y el handler la compara con la dirección que declaró el usuario.

Inicio de sesión en AYNN con una solicitud de firma de MetaMask: un mensaje con los términos de uso y un nonce de un solo uso
Depurador de Rider detenido en Web3Service.EcRecover: la dirección recuperada del mensaje de inicio de sesión firmado
Depurador de Rider en el handler de confirmación de Web3: la dirección recuperada coincide con la declarada

La solicitud de inicio de sesión y la verificación de la firma en el depurador

Panel de administración

El sitio también tuvo un panel de administración. En él un autor gestionaba sus propias colecciones y ajustes, y un administrador global podía gestionar las colecciones y los ajustes de otros usuarios.

Panel de administración: secciones de contratos, colecciones, sitios de mint, lienzos y documentación, y una tabla de usuarios con direcciones, roles y edición
El panel de administración

Un breve recorrido por la interfaz de administración de la plataforma.

Corrección de errores en móvil

Corrección de errores en la versión móvil. El marketplace tenía mucha funcionalidad, así que también había bastantes errores: direcciones de wallet largas que se salían de sus campos y controles que se solapaban en pantallas estrechas. Cada flujo se probaba desde un teléfono en la red de pruebas Sepolia, hasta la creación de un listado con Seaport.

Página de un token en móvil en la red de pruebas Sepolia: una dirección de propietario larga que se sale de la tarjeta, un error detectado en las pruebas móviles
Marketplace en móvil tras crear un listado con Seaport, con el aviso de una nueva orden

Pruebas móviles en la red Sepolia

El formulario de listado

Un recorrido por cómo usar el formulario de listado en allyouneedisnft.com.

El formulario de transferencia

Un recorrido por el formulario para transferir los derechos sobre un elemento de una colección en nuestra plataforma.

Drops de NFT

Una revisión de cómo se crea un drop de NFT, otra función del sitio. Usaba un contrato específico, y durante el evento cualquiera podía conseguir gratis un elemento aleatorio de la colección.

El evento en sí se parece a una sesión AMA. Primero hay una etapa de calentamiento, se crea un canal de Discord y se asignan los anfitriones. Durante el evento se hacen distintos concursos, los invitados charlan, un anfitrión lo conduce todo y, de paso, se hacen sorteos y ventas de la colección.

Servicio de unicidad de NFT

Un desarrollador externo hizo un servicio que comprueba la unicidad y la originalidad de las imágenes NFT, unique.allyouneedisnft.com. La captura muestra su página principal.

Portada de unique.allyouneedisnft.com en una tableta: Show the world your authenticity, un servicio de verificación de unicidad de NFT con un botón de comprobación
La portada del servicio de unicidad

A veces tenía que grabar videos presentando funciones y proyectos nuevos para nuestra audiencia de habla inglesa. En el video está uno de ellos: la presentación del servicio que verifica la unicidad de imágenes NFT contra una base de datos reunida de distintos sitios, OpenSea y otros.

En el trabajo sobre unicidad, del servicio se encargó ese desarrollador externo, y con él se acordó la siguiente especificación. Después yo supervisé la ejecución e integré la solución en el sitio principal.

AllYouNeedIsNFT, especificación del módulo de unicidad de imágenes (en ruso)Descargar PDF
Cargando…

NFTwitting: enseñar NFT a artistas

Para enseñar a la gente a trabajar con NFT, lanzamos un proyecto aparte, NFTwitting. Tuvo un bot de Telegram y su propia campaña publicitaria. En el bot se podía recoger un regalo, suscribirse a las novedades y entrar en el club, y nosotros obteníamos los datos del usuario para calentarlo y llevarlo después a la venta. La campaña se dirigía a artistas, para mostrarles cómo trabajar con NFT y ganar dinero con ellos.

Anuncio en VK del club NFT cerrado nftwitting.com: eres artista digital y quieres entrar en los NFT, con una ilustración ciberpunk de neón
El bot de Telegram de NFTwitting saluda a un usuario, ofrece un regalo e invita al grupo NFTwittingClub, nombre de usuario oculto

La campaña publicitaria para artistas y el bot al que llevaba

Dentro de AllYouNeedIsNFT también fuimos haciendo crecer un club NFT que enseñaba a los artistas a trabajar con NFT, a tratar con clientes y a vender sus obras en las plataformas NFT más conocidas. El video es un anuncio de lo que enseñamos en nuestro grupo.

Videos educativos para clientes

Trabajando con clientes, muchas veces tenía que responder sus preguntas. Cuando una pregunta se repetía mucho, le dedicaba tiempo: escribía un guion, grababa el video y la voz. El objetivo era educativo: sumar más gente al mundo NFT y acercarla a las cripto.

Este video es un ejemplo: un recorrido por cómo crear una billetera en el conocido exchange Binance y cómo operar con USDT.

Otro video de mi serie educativa ayuda a quienes nunca trabajaron con cripto a entender qué es USDT TRC-20 y cómo usarlo. Quien lo mira configura la extensión de navegador TronLink, crea una billetera y hace su primera transferencia.

Llamadas de los fundadores

Llamadas de los fundadores: reuniones de estado y encuentros periódicos donde cada uno contaba con qué se había topado, cuál era el siguiente plan, hacia dónde íbamos y qué habíamos conseguido ya.

Llamada de los fundadores en Telegram con cinco participantes, todos menos yo difuminados
Una llamada de los fundadores

Proyectos

Artículos

Disponible para colaboración por contrato

Estoy disponible para colaborar por contrato. Si tiene una idea de proyecto interesante, reserve una llamada por Calendly.

Agenda una llamada de 30 min