Definiendo la pila web3
¿Quieres construir sobre web3? Nader Dabit identifica los bloques de construcción de la pila tecnológica de web3 en una guía introductoria
Nader Dabit, 22 de diciembre de 2021. Traducción de Lorena Fabris
En el siguiente segmento de Building on en web3, el ingeniero de relaciones con los desarrolladores de Edge & Node, Nader Dabit, amplía sobre la pila de web3 y cómo los desarrolladores pueden conceptualizar las diversas facetas de construir en web3.
Hice la transición a web3 en abril de 2021 después de ser un desarrollador tradicional de full-stack (pila completa) durante unos 10 años. Al sumergirme en todas estas nuevas tecnologías e ideas, lo primero que quise saber fue “¿qué es la pila web3?”.
Cuando construyo una aplicación web o móvil tradicional, a menudo dependo de un puñado de bloques de construcción para hacer el trabajo.
- Servidores de API / App (REST o GraphQL)
2. Capa de autenticación (gestionada o manual)
3. Base de datos
4. Frameworks del cliente, plataformas y bibliotecas
5. Almacenamiento de archivos
Usando estos componentes centrales, puedo construir la mayoría de los tipos de aplicaciones que me gustaría, o al menos llegar a la mayor parte del camino. Entonces ¿Cómo aparece esto en web3?
Resulta que la respuesta a esto no es tan sencilla porque:
- El paradigma es completamente diferente en muchos aspectos
2. Las herramientas, las tecnologías y el ecosistema de web3 son menos maduros que los de web2
También fue más difícil para mí entender cómo poner en marcha y construir aplicaciones web3 porque estaba abordando los problemas de la misma manera que en el mundo de web2.
Después de trabajar, investigar, experimentar y construir cosas durante los últimos 8 meses me gustaría compartir lo que he aprendido.
¿Qué es la web3?
Antes de definir la pila de web3, vamos a intentar definir web3. Hay innumerables definiciones dependiendo de a quién le preguntes, pero yo encuentro esta definición acertada:
Web3 es la pila de protocolos que permiten aplicaciones totalmente descentralizadas.
Con esta pila tecnológica descentralizada, podemos empezar a construir aplicaciones descentralizadas que tienen sus propias implicancias y características.
Algunas de las características que permite web3 son
- Infraestructura web descentralizada
- Propiedad (de los datos y de la plataforma)
- Pagos digitales nativos
- Identidad auto-soberana
- Infraestructura distribuida, sin confianza y robusta
- Back ends abiertos, públicos y componibles
Empecemos a sumergirnos en la pila de web3, dividida en este conjunto de categorías:
- Blockchain
- Entorno de desarrollo de blockchain
- Almacenamiento de archivos
- Bases de datos P2P
- API (indexación y consulta)
- Identidad
- Cliente (frameworks y bibliotecas)
- Otros protocolos
Blockchain
Existen innumerables blockchains sobre las que puedes construir. No hay una sola que sea “la mejor”, sino que hay que considerar las distintas compensaciones entre ellas.
Una cosa que suele ser importante para mí cuando aprendo algo nuevo es la idea de aplicar el principio de Pareto a lo que estoy aprendiendo, es decir, cuál es la forma más eficiente de obtener el máximo de esa cantidad de tiempo y esfuerzo. Siguiendo esta idea puedo obtener la mayor tracción e impulso mientras aprendo algo nuevo en el menor tiempo posible.
En el mundo de Blockchain, aprender Solidity y la EVM (o máquina virtual de Ethereum) podría ser la mejor apuesta a la hora de iniciarse como desarrollador de blockchain. Usando este conjunto de habilidades (y pila tecnológica), puedes construir no sólo para Ethereum, sino también para otras L2 de Ethereum, sidechains, e incluso otras blockchains como Avalanche, Fantom y Celo.
Dicho esto, Rust está empezando a ser cada vez más popular en el mundo de las blockchains, con Solana, NEAR, Polkadot, y otros que tienen soporte de Rust de primera clase. Probablemente no puedes equivocarte aprendiendo ninguno de los dos, pero para el principiante yo diría que Solidity seguirá siendo la mejor opción si alguien me preguntara hoy.
Más allá de ese consejo, aquí hay una muestra incompleta de blockchains que tienen una sólida combinación de tecnología, utilidad, comunidad, momentum y viabilidad futura:
- Ethereum — plataforma original de contratos inteligentes
- ZK rollups: ZKSync, Starknet, Hermez — L2 de Ethereum de alto rendimiento, pero no son compatibles de forma nativa con EVM
- Optimistic Rollups: Arbitrum & Optimism — L2 de Ethereum, compatible con EVM (aprende más sobre las diferencias entre optimistic y ZK rollups aquí)
- Polygon — Ethereum sidechain
- Solana — alto rendimiento, transacciones baratas, tiempos de bloque rápidos, pero más difícil de aprender que EVM (Rust)
- NEAR — Blockchain de L1, puede escribir contratos inteligentes en Rust o Assemblyscript
- Cosmos — un ecosistema de blockchains interoperativas
- Polkadot — plataforma informática basada en blockchain que permite que las blockchains construidas sobre ella ejecuten transacciones entre sí, creando una internet interconectada de blockchains
- Fantom — Layer (capa) 1 compatible con EVM
- Avalanche — Capa 1 compatible con EVM
- Celo — Capa 1 compatible con EVM, diseñada para facilitar a cualquier persona con un smartphone el envío, la recepción y el almacenamiento de criptomonedas
- Tezos — Capa 1 no compatible con EVM, muchos proyectos NFT la están utilizando
Entornos de desarrollo de Blockchain
Para el desarrollo de EVM, hay un par de buenos entornos de desarrollo disponibles:
- Hardhat es una opción más reciente, pero que está ganando más y más popularidad. Sus documentos son geniales, las herramientas y la experiencia de los desarrolladores están pulidas, y es lo que personalmente he estado usando para construir dapps.
- Truffle es un conjunto de herramientas para construir y desarrollar aplicaciones en la EVM. Está maduro, probado en batalla y bien documentado. Ha existido durante un tiempo y muchos desarrolladores lo utilizan.
- Foundry es un nuevo entorno de desarrollo Solidity de Paradigm que promete mucho. Lo más destacado es la capacidad de escribir pruebas en Solidity, el soporte para fuzzing, y la velocidad (está escrito en Rust). Escribí una introducción por separado aquí.
Para el desarrollo de Solana, Anchor se está convirtiendo rápidamente en el punto de entrada para los nuevos desarrolladores. Proporciona una CLI para el andamiaje, la construcción y las pruebas de los programas de Solana, así como las bibliotecas de clientes que puedes utilizar para la construcción de front ends. También incluye un DSL que abstrae muchas de las complejidades con las que los desarrolladores suelen encontrarse cuando se inician en el desarrollo de Solana y Rust.
Almacenamiento de archivos
¿Dónde almacenamos las imágenes, vídeos y otros archivos en web3? Almacenar cualquier cosa tan grande en la cadena (on-chain) suele ser prohibitivo, así que probablemente no queramos almacenarlos allí.
En su lugar, podemos utilizar uno de los muchos protocolos de almacenamiento de archivos:
- IPFS — protocolo de sistema de archivos peer-to-peer
* ventajas: es confiable, está bien documentado y cuenta con un amplio ecosistema
* contras: si los datos no están anclados pueden perderse
- Arweave: permite almacenar datos de forma permanente, pagando una única cuota de transacción. Soy un fan de Arweave y escribí una entrada en el blog sobre ella aquí.
- Filecoin — de Protocol Labs, el mismo equipo que construye IPFS, es un protocolo diseñado para proporcionar un sistema de almacenamiento de datos persistente. Hay un puñado de formas para que los desarrolladores construyan sobre Filecoin, incluyendo web3.storage que es bastante agradable.
- Skynet — Todavía no lo he usado en producción, pero lo he probado y parece funcionar bien. La API aquí se ve muy bien. Tengo preguntas como cuánto tiempo persisten los datos, y la interoperabilidad de Skynet con otros protocolos.
Bases de datos P2P
Además del almacenamiento de archivos y del almacenamiento en la cadena, también puedes necesitar almacenar datos fuera de la cadena (off-chain). Puedes utilizar este tipo de soluciones de forma similar a como lo harías con una base de datos en una pila tecnológica tradicional, pero en su lugar se replican a través de n número de nodos en una red descentralizada, y por lo tanto son más fiables (al menos en teoría).
Algunas opciones son:
- Ceramic Network — una plataforma descentralizada de código abierto para crear, alojar y compartir datos. Ceramic también tiene un buen protocolo de identidad del que hablaré más adelante. Probablemente mi solución favorita de almacenamiento fuera de la cadena en este momento. Aquí hay una bonita demostración.
- Textile ThreadDB — una base de datos multipartita construida sobre IPFS y Libp2p. Si entiendo correctamente, puede estar pasando por un gran cambio de API en este momento. La he probado y es prometedora, pero los documentos y el DX necesitan algunas mejoras.
- GunDB — una base de datos descentralizada, peer-to-peer. Gun ha existido durante bastante tiempo y se han construido algunas aplicaciones bastante interesantes con ella.
En términos de madurez, mi opinión es que el ecosistema de soluciones de almacenamiento fuera de la cadena no está todavía donde debe estar para construir algunos de los casos de uso más avanzados que algunos desarrolladores podrían querer. Algunos de los desafíos son los datos en tiempo real, la detección y resolución de conflictos, la autorización de escritura, la documentación y la experiencia general del desarrollador.
La integración de las soluciones de datos offchain con los protocolos de blockchain es uno de los últimos grandes obstáculos que tenemos que superar antes de tener una pila de protocolos totalmente descentralizada capaz de soportar cualquier tipo de aplicación.
API (Indexación y Consulta)
Hay muchas diferencias en la forma en que interactuamos y construimos sobre las blockchains en comparación con las bases de datos de la pila tecnológica tradicional. Con las blockchains, los datos no se almacenan en un formato que pueda ser consumido de manera eficiente o fácil directamente desde otras aplicaciones o front ends.
Las blockchains están optimizadas para las operaciones de escritura. A menudo escuchas que la innovación se centra en las transacciones por segundo, el tiempo de los bloques y el costo de las transacciones. Los datos de la blockchain se escriben en bloques a lo largo del tiempo, lo que hace imposible cualquier cosa que no sean las operaciones básicas de lectura.
En la mayoría de las aplicaciones, se necesitan características como datos relacionales, clasificación, filtrado, búsqueda de texto completo, paginación y muchos otros tipos de capacidades de consulta. Para ello, los datos deben estar indexados y organizados para una recuperación eficaz.
Tradicionalmente, ese es el trabajo que hacen las bases de datos en la pila tecnológica centralizada, pero esa capa de indexación faltaba en la pila web3.
The Graph es un protocolo para indexar y consultar los datos de la blockchain que facilita mucho este proceso y ofrece una solución descentralizada para hacerlo. Cualquiera puede construir y publicar APIs GraphQL abiertas, llamadas subgrafos, facilitando la consulta de los datos de la blockchain.
Para saber más sobre The Graph, consulta la documentación aquí o mi tutorial aquí.
Identidad
La identidad es un paradigma completamente diferente en web3. En web2, la autenticación se basa casi siempre en la información personal del usuario. Esta información se suele recoger a través de un formulario o de un proveedor OAuth que pide al usuario que la entregue a cambio de acceder a la aplicación.
En web3, la identidad gira completamente en torno a la idea de las wallets o billeteras y la criptografía de clave pública.
Aunque el nombre de “wallet” cumple su propósito, he encontrado que la gente nueva en web3 encuentra la terminología confusa en lo que respecta a la autenticación y la identidad. Espero que en el futuro podamos encontrar alguna otra forma de transmitir lo que es una wallet, ya que combina aspectos financieros pero también de identidad y reputación.
Como desarrollador, tendrás que entender cómo acceder e interactuar con la wallet y la dirección del usuario de varias maneras.
En un nivel muy básico (y un requisito muy común), es posible que quieras solicitar el acceso a la wallet del usuario. Para hacer esto, normalmente podrás acceder a la wallet del usuario en el contexto de ventana (navegador web) o usando algo como WalletConnect o Solana’s Wallet Adapter.
Por ejemplo, si tienen una wallet de Ethereum disponible, podrás acceder a window.ethereum. Lo mismo para Solana (window.solana), Arweave (window.arweaveWallet), y un puñado de otros. WalletConnect es bueno para la web móvil y React Native ya que permite a los usuarios autorizar usando sus wallets móviles directamente desde el dispositivo.
Si quieres manejar la autenticación tú mismo, puedes permitir que el usuario firme una transacción y luego decodificarla en algún lugar para autenticar al usuario, pero esto generalmente requiere un servidor. Aquí hay un ejemplo de cómo podría verse usando una wallet EVM, y aquí hay un ejemplo de cómo hacer esto con Solana / Phantom.
¿Qué pasa con la gestión de los perfiles de los usuarios de forma descentralizada? Ceramic Network ofrece el protocolo y el conjunto de herramientas más robustos para gestionar la identidad descentralizada. Recientemente publicaron un post en su blog en la que se describen algunas de sus actualizaciones más recientes y se dan algunas directrices sobre cómo funcionan todas las herramientas juntas. Yo empezaría por ahí y luego exploraría sus documentos para entender cómo empezar a construir, y consideraría revisar mi proyecto de ejemplo aquí.
Si quieres obtener los registros de texto del ENS de un usuario, la biblioteca ensjs ofrece una buena API para obtener los datos del usuario:
const ens = new ENS({ provider, ensAddress: getEnsAddress('1') })
const content = await ens.name('sha.eth').getText('avatar')
SpruceID también es algo que parece prometedor pero aún no lo he probado.
Cliente
En lo que respecta a los frameworks de JavaScript, realmente puedes construir con cualquier cosa que quieras, ya que los SDKs de blockchain del lado del cliente son en su mayoría framework-agnostic. Dicho esto, un número abrumador de proyectos y ejemplos están construidos en React. También hay un puñado de bibliotecas como Solana Wallet Adapter que ofrecen utilidades adicionales para React, por lo que diría que aprender o estar familiarizado con React es probablemente una decisión inteligente.
Para los SDK del lado del cliente en Ethereum hay web3.js y ethers.js. Para mí, Ethers es más accesible y tiene mejor documentación, aunque web3.js ha existido por más tiempo.
En Solana, probablemente trabajarás con @solana/web3.js y/o Anchor. He encontrado que las bibliotecas de cliente de Anchor son mi opción para construir programas de Solana ya que estoy usando el marco de Anchor de todos modos, y he encontrado que es mucho más fácil de entender que @solana/web3.js
.
Otros protocolos
Radicle es un protocolo de colaboración de código descentralizado construido sobre Git. Podría considerarse como una versión descentralizada de GitHub.
Livepeer es una red descentralizada de transmisión de vídeo. Es madura y ampliamente utilizada con más de 70.000 GPUs en vivo en la red.
Chainlink es un oráculo que permite el acceso a los datos del mundo real y a la computación fuera de la cadena, manteniendo las garantías de seguridad y fiabilidad inherentes a la tecnología blockchain.
Para Terminar
Este post será un documento vivo que mantendré al día a medida que aprenda, experimente y recoja los comentarios de los desarrolladores que construyen en web3.
Si tienes algún comentario o idea sobre algo que se me haya pasado por alto, por favor, comparte tus ideas conmigo. Es emocionante ver toda la actividad que se está produciendo en torno a web3, ya que los desarrolladores se están involucrando. Si bien la infraestructura aún está evolucionando, la visión de construir protocolos y aplicaciones verdaderamente descentralizados que permitan a la gente coordinarse sin tener que dar el poder y el control a las grandes empresas es importante y estamos cerca de hacer de esta visión una realidad.