paint-brush
¿Es realmente tan difícil desarrollar blockchain como backend?por@0xtnbts
Nueva Historia

¿Es realmente tan difícil desarrollar blockchain como backend?

por Alex Kit11m2025/01/17
Read on Terminal Reader

Demasiado Largo; Para Leer

Este artículo no trata sobre criptomonedas ni finanzas descentralizadas. En cambio, exploraremos las cadenas de bloques EVM públicas y cómo se pueden usar en su próximo proyecto. Profundizaré en los pros, los contras y los ejemplos prácticos, utilizando la biblioteca 0xweb.
featured image - ¿Es realmente tan difícil desarrollar blockchain como backend?
Alex Kit HackerNoon profile picture

Este artículo no trata sobre criptomonedas ni finanzas descentralizadas. En cambio, exploraremos las cadenas de bloques EVM públicas y cómo se pueden usar en su próximo proyecto, según sus necesidades y objetivos específicos. Analizaré los pros, los contras y los ejemplos prácticos, utilizando la biblioteca 0xweb en la que he estado trabajando.

§ a favor y en contra

• 🚀 Tiempo de configuración cero

Ya está en funcionamiento. Simplemente defina su modelo de datos como un contrato e impleméntelo.

• ✨ Mantenimiento cero

Una vez que se cargan los datos, se puede acceder a ellos mientras la cadena de bloques esté en funcionamiento. Supongo que será mucho más tiempo que con cualquier otra suscripción de alojamiento.

• 💯 100 % de tiempo de actividad de lectura; cerca del 100 % de tiempo de actividad de escritura

La separación de los procesos de lectura y escritura en blockchain garantiza un tiempo de actividad del 100 % para las operaciones de lectura, especialmente cuando se aprovechan múltiples proveedores de RPC para lograr redundancia.

• 🛡️ Seguro

Las cadenas de bloques proporcionan inherentemente un nivel de seguridad más alto que las soluciones de alojamiento convencionales. Las vulnerabilidades de datos solo son posibles si existen vulnerabilidades en la lógica de su modelo de datos.

• 📖 Datos abiertos

A menos que estén cifrados, sus datos permanecen abiertos, accesibles y verificables por cualquier persona, lo que promueve la transparencia.

• 🖧 Sin DNS

Los nombres de dominio no son necesarios para este tipo de backend. En su lugar, se puede utilizar una lista de proveedores de nodos descentralizados, lo que permite que las bibliotecas de clientes seleccionen la opción más eficiente para los usuarios finales.

• 🤝 Confianza

Gracias a las características anteriores, los backends basados en blockchain generan inherentemente confianza en el usuario al garantizar la seguridad de los datos y la disponibilidad las 24 horas del día, los 7 días de la semana, incluso si se detienen el mantenimiento y el desarrollo del proyecto.

• 🧩 Interpolabilidad con modelos de datos de terceros

Puede integrar otros modelos de datos almacenados en la cadena de bloques, u otros proyectos pueden basarse en su modelo de datos.

• ⚙️ Extensibilidad

Los usuarios pueden aprovechar numerosos proyectos de terceros para monitorear o automatizar acciones, ampliando significativamente las posibilidades de su modelo de datos.

• 📜 Historia y viajes en el tiempo

Se puede acceder a los datos desde cualquier momento del pasado.

• 📡 Eventos y transmisiones de eventos

Cargue eventos históricos personalizados o utilice WebSockets para escuchar eventos entrantes en tiempo real, lo que permite respuestas dinámicas de la aplicación.

• 👤 Identidad de usuario incorporada

El concepto de “billetera” permite a los usuarios autenticarse firmando mensajes, lo que proporciona una identificación de usuario fluida y descentralizada.

• 📝 Permitir a los usuarios modificar o ampliar datos

Los usuarios pueden modificar o ampliar los datos de su almacenamiento en función de los permisos que usted defina. Es importante destacar que los costos de estas modificaciones corren por cuenta de los propios usuarios. Al seleccionar una cadena de bloques de bajo costo, estas tarifas pueden resultar insignificantes y, a menudo, ascender a solo unos pocos centavos por transacción.

• 🌐 Ecosistema enorme y en continua evolución

  • Numerosos módulos de Solidity que puedes utilizar para mejorar la funcionalidad de tu modelo de datos.
  • Existen muchos servicios gratuitos y de código abierto, así como aquellos que ofrecen planes gratuitos. Es una práctica común dentro de la comunidad blockchain ofrecer planes gratuitos que suelen ser suficientes para las necesidades de producción.

§ contra

• 💾 El almacenamiento es caro 😢

Aunque sigue un modelo de pago por uso, solo pagas por los SLOT que almacenas. Cada SLOT tiene 32 bytes, cuesta 20000 GAS escribir datos nuevos o 5000 GAS actualizarlos. Tomemos como ejemplo Polygon, con un precio de GAS de 30 gwei y un precio de POL de $0,60.


20000 GAS × 30 g Wei = 0,008 POL × $0,60 = $0,00032


Esto es mucho, por lo que el emoji del “disquete” representa las cantidades de almacenamiento de la mejor manera, lo que significa que es más adecuado para conjuntos de datos más pequeños si pagas por tu cuenta. Sin embargo, una ventaja única es que los usuarios pueden asumir los costos de su propio almacenamiento y acciones, una característica que no se encuentra en otras tecnologías. Si bien este enfoque puede obstaculizar la adopción masiva de su aplicación, es ampliamente aceptado dentro de la comunidad blockchain.

• 🧮 El cálculo es limitado 😢

Los modelos de datos de la cadena de bloques admiten funciones para interactuar con los datos, pero sus capacidades computacionales tienen limitaciones. Estas limitaciones dependen de los nodos RPC que se utilicen para las acciones de lectura y de los estrictos límites de GAS impuestos a las acciones de escritura (transacciones). Si bien las operaciones básicas, los bucles y las pilas de llamadas más profundas suelen ser manejables, la cadena de bloques no es adecuada para cargas de trabajo computacionales pesadas.


Dicho esto, dados los tamaños de datos relativamente pequeños que suelen implicarse, los límites existentes suelen ser suficientes para la mayoría de los casos de uso.

§ punto neutro

• 🧬 Estructura de datos, lenguaje Solidity, SDK

Si eres nuevo en el desarrollo de cadenas de bloques, es posible que hayas oído que es complicado y difícil empezar a utilizarlo. Sin embargo, esto no es cierto. El desarrollo de cadenas de bloques utiliza conceptos, semántica y sintaxis familiares, lo que hace que sea más fácil de aprender de lo que parece.

§ Demostración: Repositorio de versiones de la aplicación

https://github.com/0xweb-org/examples-backend


Para este artículo, vamos a crear un contrato de administrador de versiones de aplicaciones. Imagine que tiene una aplicación de escritorio que requiere un backend para comprobar si hay nuevas versiones y recuperar el enlace de descarga cada vez que se publica una nueva versión. A continuación, se muestra el contrato final, que muestra la mayoría de los conceptos clave:


 import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; struct Package { uint version; uint timestamp; string url; bytes32 sha256; } contract AppVersionManager is Ownable { // Events that are emitted on data updates event NewApplicationInfo(); event NewPackage(uint version, uint timestamp); // Custom error, when title for the application is empty error TitleIsEmpty(); // Some application information string public title; // @TODO: add further application related properties if required // Latest package Package public package; // Track all versions and their packages mapping (uint => Package) public packages; // List of all previous versions uint[] public versions; constructor () Ownable(msg.sender) { } function updateInfo(string calldata newTitle) external onlyOwner { if (bytes(newTitle).length == 0) { revert TitleIsEmpty(); } title = newTitle; emit NewApplicationInfo(); } function updatePackage(Package calldata newPackage) external onlyOwner { require(newPackage.version > package.version, "Newer package already published"); packages[package.version] = package; package = newPackage; versions.push(package.version); emit NewPackage(package.version, block.timestamp); } function findPackageAtTimestamp (uint timestamp) external view returns (Package memory) { if (package.timestamp <= timestamp) { return package; } // the countdown loop to find the latest package for the timestamp int i = int(versions.length); while (--i > -1) { Package memory pkg = packages[versions[uint(i)]]; if (pkg.timestamp <= timestamp) { return pkg; } } revert("No package found"); } function getPackage (uint version) external view returns (Package memory) { if (version == package.version) { return package; } return packages[version]; } }


Cualquier desarrollador puede leer y comprender este código con un mínimo esfuerzo. Si estás familiarizado con TypeScript, la mayoría de los conceptos aquí ya tendrán sentido. Para que quede aún más claro, he creado un ejemplo equivalente en TypeScript: AppVersionManager.ts 🔗 .


En términos simples, un contrato en Solidity puede considerarse como una instancia de clase con estado . Los conceptos de propiedades, métodos, tipos y herencia ya son bien conocidos en la programación orientada a objetos. El concepto principal que se explicará aquí es el modificador onlyOwner (similar a un decorador en TypeScript).


Cada cuenta de blockchain es esencialmente un par de claves públicas y privadas. El ID de la cuenta, conocido como la dirección , se deriva de la clave pública. Cuando se ejecuta una transacción, la dirección del remitente se pasa como msg.sender . Con esto, podemos almacenar su dirección en el constructor (durante la implementación del contrato). Más tarde, el modificador onlyOwner garantiza que solo usted, como propietario del contrato, pueda ejecutar las funciones updateInfo y updatePackage . Si alguien más intenta estas acciones, la transacción se revertirá. El modificador onlyOwner lo proporciona el contrato Ownable , que es parte de la biblioteca OpenZeppelin ampliamente utilizada. Esta biblioteca incluye muchos otros contratos útiles para agilizar el desarrollo de blockchain.


Otro tema importante que se debe tratar es el concepto de Proxies , que dividen el almacenamiento y la implementación en dos contratos separados. Las implementaciones de contratos en Solidity son inmutables, lo que significa que no se pueden agregar nuevas funciones o propiedades después de la implementación. Para solucionar esto, se puede implementar un contrato “Proxy”. El Proxy maneja el almacenamiento y contiene solo una función fallback , que delega las llamadas al contrato de implementación mientras mantiene el contexto de almacenamiento del Proxy.


Este concepto puede parecer complejo, pero es similar a this funciona en JavaScript. A continuación, se ofrece una analogía rápida para aclararlo:


 const foo = new Proxy({ bar: 'Lorem' }, { get (obj, prop) { return fooImplementation[prop].bind(obj) }, }); const fooImplementation = { logValue () { console.log('Bar value:', this.bar) } } foo.logValue();


El contrato proxy contiene una referencia al contrato de implementación. Si desea agregar nuevas funciones, simplemente implemente un nuevo contrato de implementación y actualice el proxy para que haga referencia a este nuevo contrato, reenviando las llamadas de función a la instancia actualizada. Es un proceso sencillo, pero hay un caso extremo que se debe considerar: los constructores.


Al implementar un contrato de implementación, su constructor opera dentro del almacenamiento del propio contrato de implementación. Esto significa que los establecedores como title = "Hello World" no modificarán el almacenamiento del proxy. Para solucionar esto, utilizamos el concepto de función inicializadora :

  1. Implemente el contrato de implementación con una función initialize .
  2. Implemente el contrato proxy, pasando la dirección del contrato de implementación en su constructor. Esta configuración permite que se llame al método initialize en el contexto del contrato proxy.


Como resultado, actualizar la propiedad title , por ejemplo, la actualizará correctamente en el almacenamiento del proxy.


Aquí hay una versión de implementación mejorada de nuestro AppVersionManager: AppVersionManagerUpgradeable.sol .


El contrato proxy en sí es bastante universal e independiente de la implementación. Hay varios estándares conocidos para proxies disponibles en la biblioteca OpenZeppelin.


Con el conocimiento de estos conceptos y los ejemplos anteriores, está listo para desarrollar contratos inteligentes para sus casos de negocio.

§ Despliegue

  1. Seleccione la cadena de bloques

Primero, debemos seleccionar la cadena de bloques en la que queremos implementar nuestro contrato. Para este ejemplo, elegí Polygon. Ofrece bajos costos de transacción, existe desde hace mucho tiempo y siempre ha tenido un buen desempeño. Su infraestructura estable y eficiente, combinada con un valor total bloqueado (TVL) de $0.9 mil millones, lo convierte en una opción confiable. Implementar sus contratos en cadenas de bloques públicas significa coexistir con instituciones financieras. La métrica TVL refleja la confianza que estas instituciones depositan en la confiabilidad de la cadena de bloques.


Además, si las condiciones cambian, siempre puedes volver a implementar el contrato en otra cadena de bloques en el futuro.


  1. Desplegar


El proyecto de demostración también sirve como repositorio de pruebas de CI, por lo que todos los comandos se pueden encontrar aquí: https://github.com/0xweb-org/examples-backend/blob/master/deploy-cli.sh


 # Install 0xweb library from NPM into the prject folder npm i 0xweb # Install required dependencies to compile/deploy *.sol files npx 0xweb init --hardhat --openzeppelin # Create or import the account. Private key will be encrypted with pin AND machine key. npx 0xweb accounts new --name foo --pin test --login # Save the private key securly and ensure the account has some POL tokens # Deploy. The foo account is selected as default. npx 0xweb deploy ./contracts/AppVersionManager.sol --chain polygon --pin test # Set title npx 0xweb c write AppVersionManager updateInfo --newTitle MySuperApp --pin test # Set latest package information npx 0xweb c write AppVersionManager updatePackage --arg0 'load(./data/package.json)' --pin test


Con solo unos pocos comandos, ha implementado el contrato y actualizado los datos. Eso es todo en lo que respecta al backend: ahora está en funcionamiento "para siempre" sin necesidad de realizar ninguna acción adicional de su parte. Los costos de esta implementación, a un precio de GAS de 70 gwei y un precio de POL de $0,51, serían:



GAS

POLONIA

$

Desplegar

850352

0,059

0,03

Guardar título

47517

0,0033

0,001

Guardar datos del paquete

169549

0,0118

0,006

Total



0,037


Gastas solo 4 centavos para configurar un servicio descentralizado , seguro y de largo plazo que no requiere mantenimiento .

§ Consulta

Para consultar los datos de su contrato, necesitará proveedores de nodos RPC. Hay docenas de proveedores gratuitos disponibles en https://chainlist.org . Puede elegir varios proveedores y una buena biblioteca Web3 puede utilizar una estrategia de round-robin en tiempo de ejecución para seleccionar el más eficiente para sus usuarios finales. Con 0xweb, las clases TypeScript o JavaScript generadas no solo seleccionan los mejores puntos finales, sino que también abstraen toda la comunicación de la cadena de bloques. Los clientes contienen métodos de alto nivel para obtener datos, lo que hace que el proceso sea fluido y eficiente.

 # The deploy command also generates the class, but manual install is also possible npx 0xweb i 0x<address> --name AppVersionManager --chain polygon


 import { AppVersionManager } from './0xc/polygon/AppVersionManager/AppVersionManager' const manager = new AppVersionManager(); console.log(`Title`, await manager.title()); console.log(`Package`, await manager.package());


Para otros lenguajes de programación, existen numerosas bibliotecas disponibles para simplificar la consulta de la cadena de bloques. Después de la implementación, tendrá la dirección del contrato y la ABI (interfaz).


Alternativamente, puede iniciar un servidor de middleware para consultar datos del contrato utilizando 0xweb.

 npx 0xweb server start --port 3000 curl http://localhost:3000/api/c/read/AppVersionManager/package?chain=polygon


Una ventaja es que no es necesario incluir ninguna biblioteca en la aplicación (solicitudes HTTP sin procesar). Sin embargo, este enfoque depende de un servidor adicional que deberá administrar. A menudo es mejor consultar la cadena de bloques directamente mediante clases generadas por 0xweb u otras bibliotecas de cadenas de bloques disponibles.

§ Resumen 🏁

Este artículo mostró cómo las cadenas de bloques pueden ser simples y poderosas, ofreciendo ventajas únicas en comparación con las soluciones de alojamiento tradicionales.


En el próximo artículo, planeo explorar redes de almacenamiento BLOB descentralizadas como Greenfield y Arweave, destacando sus características y beneficios.


Si tiene alguna sugerencia o idea sobre características adicionales para incluir en la biblioteca 0xweb, no dude en compartirlas en los comentarios o comunicarse directamente con [email protected] .