Foresight Ventures: WASM: el motor de una nueva era

Principiante1/1/2024, 2:25:51 AM
Este artículo examina algunas de las relaciones y casos de uso entre Wasm y blockchain: contratos inteligentes, interacciones entre cadenas, computación fuera de la cadena y privacidad de datos.

TL;DR

WebAssembly (Wasm) es un formato de instrucción binaria portátil y de alto rendimiento que se puede ejecutar en navegadores web. Está diseñado como un objetivo de compilación universal que puede usarse con múltiples lenguajes de programación y ejecutarse en diferentes plataformas.

Blockchain es una tecnología de contabilidad distribuida descentralizada que garantiza la seguridad y confiabilidad de los datos mediante el uso de criptografía y algoritmos de consenso. Blockchain se puede utilizar para registrar transacciones, almacenar datos y ejecutar contratos inteligentes, entre otras aplicaciones.

Existen varias relaciones y escenarios de aplicación entre Wasm y blockchain:

  1. Contratos inteligentes: Wasm puede servir como entorno de ejecución para contratos inteligentes, permitiendo que los contratos se ejecuten en diferentes plataformas blockchain. El alto rendimiento y la portabilidad de Wasm permiten una ejecución más eficiente de contratos inteligentes y usabilidad multiplataforma.
  2. Interoperabilidad entre cadenas: Wasm se puede utilizar para implementar la interoperabilidad entre cadenas. Al compilar la lógica de diferentes cadenas de bloques en código Wasm, se puede ejecutar la misma lógica en diferentes cadenas de bloques, lo que permite la transferencia de datos y la interacción entre cadenas.
  3. Computación fuera de la cadena: Wasm se puede utilizar para realizar cálculos fuera de la cadena de bloques y enviar los resultados del cálculo a la cadena de bloques. Esto permite mejorar la eficiencia y la flexibilidad en la computación mientras se mantiene la seguridad y confiabilidad de los datos.
  4. Privacidad de datos: Wasm se puede utilizar para lograr la protección de la privacidad de los datos en blockchain. Al compilar la lógica de procesamiento de datos confidenciales en código Wasm y ejecutarla en la cadena de bloques, se puede preservar la privacidad de los datos y al mismo tiempo garantizar la verificabilidad de los cálculos.

En resumen, la combinación de Wasm y blockchain proporciona aplicaciones y servicios blockchain más eficientes, seguros y flexibles. La portabilidad y el alto rendimiento de Wasm la convierten en una tecnología importante en el campo de blockchain.

1. ¿Qué es el ensamblaje web?

WebAssembly es un estándar de conjunto de instrucciones eficiente y liviano desarrollado por el World Wide Web Consortium (W3C). Es aclamado como un disruptor para la web y la informática de alto rendimiento, ya que admite la ejecución entre navegadores. Esto significa que podemos compilar diferentes lenguajes de programación, incluidos C/C++, Go, Rust y más, en un formato binario estándar unificado y usarlo como reemplazo de JavaScript, ejecutándolo con una eficiencia de código casi nativa en los navegadores web.

WebAssembly, también conocido como WASM, es una tecnología independiente de la plataforma y segura para la memoria que puede asignarse de manera eficiente a diferentes arquitecturas de CPU. Ofrece varias ventajas clave:

  • Eficiencia: WASM tiene un conjunto completo de características de lenguaje y es un formato binario compacto y de carga rápida. Su objetivo es aprovechar al máximo las capacidades del hardware para lograr un rendimiento en el idioma nativo.
  • Seguridad: WASM se ejecuta en un entorno de ejecución de espacio aislado y seguro para la memoria, e incluso se puede implementar dentro de máquinas virtuales JavaScript existentes. En un entorno web, WASM se adhiere estrictamente a la política del mismo origen y a las políticas de seguridad del navegador. Durante la compilación, WASM limita la interfaz para reducir los riesgos de seguridad. La mayoría de las aplicaciones WASM no pueden acceder a Internet (por ejemplo, no admiten sockets) y están limitadas al acceso a bases de datos locales. Muchos problemas de seguridad surgen del acceso no autorizado a la memoria, que se pueden mitigar durante la compilación con WASM.
  • Compatibilidad: WASM está diseñado para no tener versiones, funciones comprobables y compatibilidad con versiones anteriores en la web. Puede ser invocado mediante JavaScript, ingresar al contexto de JavaScript y acceder a funcionalidades del navegador como una API web. WASM puede ejecutarse no solo en navegadores web sino también en entornos no web como Node.js, Dispositivos Deno y IoT. A diferencia de los enfoques tradicionales que requieren múltiples compilaciones, WASM solo necesita compilarse una vez para una ejecución plug-and-play instantánea.

Además, la Web es la única plataforma verdaderamente universal que permite el acceso a sus aplicaciones en cualquier dispositivo. Esto también le permite mantener una base de código única, simplificar las actualizaciones y garantizar que todos los usuarios puedan acceder a sus aplicaciones. WASM admite operaciones enteras de 64 y 32 bits, que corresponden directamente a las instrucciones de la CPU. Al eliminar las operaciones de punto flotante, se puede lograr fácilmente un comportamiento determinista, lo cual es necesario para los algoritmos de consenso. Con el respaldo del proyecto de infraestructura del compilador LLVM, WASM puede beneficiarse de más de una década de optimizaciones del compilador en LLVM. WASM es desarrollado continuamente por importantes empresas como Google, Apple, Microsoft, Mozilla y Facebook, y cuenta con el respaldo de los servidores de los navegadores desarrollados por estas empresas.

La belleza de WASM radica en su capacidad de ejecutarse en cualquier lugar sin necesidad de descargarlo ni instalarlo, ya que está en formato binario. Con solo un clic, las aplicaciones web se pueden ejecutar inmediatamente cuando sea necesario. Es incluso más seguro que descargar y ejecutar archivos binarios directamente, ya que los navegadores tienen mecanismos de seguridad integrados que evitan que el código ejecutado dañe su sistema. Además, compartir aplicaciones web es sencillo: los enlaces se pueden colocar en cualquier lugar como cadenas en las que se puede hacer clic.

2. ¿Por qué necesitamos Web Assembly?

2.1 Web2

La Web ha evolucionado desde una plataforma para contenido estático y pequeños lenguajes de escritura a una plataforma potente y popular repleta de aplicaciones y funciones sorprendentes, gracias a la funcionalidad integrada de los navegadores y la interactividad proporcionada por la Web. Sin embargo, las aplicaciones web siguen siendo predominantemente impulsadas por el mismo lenguaje de programación (JavaScript), que inicialmente no fue diseñado para realizar estas tareas.

Inicialmente, JavaScript era un lenguaje de secuencias de comandos simple destinado a brindar interactividad a documentos de hipertexto livianos en aplicaciones web. Su diseño era fácil de aprender y escribir y no priorizaba la velocidad del tiempo de ejecución. A lo largo de los años, mejoras significativas en el rendimiento en el análisis de JavaScript por parte de los navegadores han dado lugar a aumentos notables del rendimiento.

Con la velocidad acelerada de ejecución de JavaScript, la gama de cosas que se pueden hacer dentro de los navegadores se ha ampliado significativamente. Las nuevas API han introducido funciones como gráficos interactivos, transmisión de video, navegación sin conexión y más. Además, un número cada vez mayor de aplicaciones que antes estaban limitadas a entornos de escritorio han ingresado a la Web. Ahora puedes editar documentos y enviar correos electrónicos fácilmente en tu navegador. Sin embargo, en ciertos dominios, el rendimiento de JavaScript sigue siendo un desafío. Piense en las aplicaciones de software que utiliza además de los navegadores: juegos, edición de vídeo, renderizado 3D o producción musical. Estas aplicaciones requieren cálculos extensos y alto rendimiento. JavaScript lucha por cumplir con estos requisitos de alto rendimiento.

Sin embargo, no es práctico reemplazar JavaScript e incluso podría llevar décadas lograr ese objetivo, ya que todo Internet depende de él. Además, existe una gran comunidad que mejora constantemente JavaScript. De hecho, en comparación con otros lenguajes, JavaScript tiene algunas deficiencias en aspectos como nulo y ==. Sin embargo, estos problemas no son lo suficientemente graves como para justificar el reemplazo de toda la tecnología.

Por lo tanto, WebAssembly no reemplazará a JavaScript, pero eso no significa que WASM no se utilizará en el futuro. De hecho, el uso de WASM se generalizará cada vez más. Esto se debe a que WASM puede aportar poderosas capacidades computacionales a la web, como procesamiento de imágenes o juegos. Con WASM, puede crear una versión web de Photoshop que funcione bien, o un juego 3D que se ejecute a 60 fotogramas por segundo o incluso velocidades de fotogramas más altas en el navegador. Los juegos, en particular, presentan un desafío porque requieren la ejecución simultánea de procesamiento de audio y video, así como la coordinación de efectos físicos y de IA. WASM tiene la capacidad de ejecutar juegos de manera eficiente en el navegador, lo que abre la puerta para incorporar muchas otras aplicaciones al navegador.

La figura anterior muestra una comparación del flujo de trabajo entre JavaScript y WebAssembly (wasm). Se puede observar que wasm es mucho más conciso en comparación con JavaScript.

2.2 Web3

Máquina virtual WASM

En 2018, el ecosistema Ethereum comenzó a discutir el uso de una VM WASM como máquina virtual de contrato inteligente, ya que se consideraba que tenía un mejor rendimiento que la EVM. Gavin Wood, el inventor de EVM, expresó la viabilidad de reemplazarlo con WASM, y Vitalik también afirmó que Ethereum 2.0 se actualizará para admitir contratos WASM (eWASM) para satisfacer más necesidades de desarrollo. Hoy en día, el desarrollo de los contratos WASM ya ha tomado forma.

2.3 ¿Cómo se diseña el EVM? ¿Por qué es ineficiente?

Problema de tamaño de la arquitectura

Las computadoras tradicionales tienen conjuntos de instrucciones que aceptan entradas de 32 o 64 bits. EVM, sin embargo, es diferente y único, ya que es una computadora de 256 bits diseñada para manejar más fácilmente el algoritmo hash de Ethereum, que produce salidas explícitas de 256 bits.

Sin embargo, la computadora real que ejecuta programas EVM necesita dividir las palabras de 256 bits en sus arquitecturas nativas para ejecutar contratos inteligentes, lo que hace que todo el sistema sea ineficiente y poco práctico.

Además, si desea implementar un algoritmo complejo como SHA256 utilizando los OPCODES básicos de EVM en Ethereum, ¡le espera un momento difícil! Para abordar el problema del alto costo del gas al ejecutar programas complejos a través del conjunto de instrucciones, Ethereum introdujo el concepto de precompilaciones, que compila el programa en EVM y consume una cantidad fija de gas. Una precompilación notable es el algoritmo hash de Ethereum, ya que implementarlo dentro de la máquina virtual resultaría en tarifas extremadamente costosas cuando se solicitan contratos.

Precompilación hinchada

El problema con la precompilación es que aumenta continuamente la hinchazón y la complejidad de la máquina virtual, sin abordar el problema central: el diseño ineficiente y deficiente del conjunto de instrucciones y especificaciones actuales.

¿Qué pasaría si pudiéramos definir una nueva especificación y conjunto de instrucciones que no requieran la precompilación de estos programas complejos, sino que logren eficientemente los resultados deseados a través de instrucciones básicas? Aquí es donde entra en juego WASM.

2.4 Comparación entre EVM y WASM VM

  • Velocidad: WASM tiene como objetivo proporcionar una velocidad de ejecución más rápida en comparación con EVM. EVM puede tener problemas de eficiencia al compilar y ejecutar contratos inteligentes, mientras que WASM mejora la velocidad de carga y la capacidad de procesamiento al convertir directamente a código compilado.
  • Contratos precompilados: EVM se basa en contratos precompilados para la ejecución eficiente de cálculos criptográficos, pero esto puede introducir riesgos de bifurcaciones duras. WASM elimina la necesidad de contratos precompilados, lo que permite a los desarrolladores crear contratos inteligentes eficientes y rápidos.
  • Costos de transacción: con una máquina virtual WASM más rápida, el rendimiento de las transacciones aumenta significativamente, lo que lleva a una reducción de los costos de transacción y de implementación de contratos. Los contratos WASM abordan los problemas de las altas tarifas de transacción y la congestión en la red Ethereum.
  • Flexibilidad e interoperabilidad: WASM amplía la gama de lenguajes disponibles para el desarrollo de contratos inteligentes, admitiendo el uso de cualquier lenguaje de alto nivel que se compile en WASM, como Rust, C++ y JavaScript. Esto significa que los desarrolladores pueden escribir contratos inteligentes en su lenguaje preferido, ¡incluidos marcos maduros como ink! ¡Para Rust o Ask! para ensamblador.

Actualmente, el equipo de EWASM está integrando WebAssembly en Ethereum para garantizar una capa de ejecución más eficiente y simplificada, lo que hace que Ethereum sea adecuado como una plataforma informática totalmente descentralizada. WASM ha sido adoptado como estándar por muchos otros proyectos, incluidos Dfinity y EOS, y ambos lo utilizan para mejorar sus capas de ejecución.

2.5 Lápiz óptico (Arbitrum)

El proyecto Stylus es una iniciativa en la red Arbitrum Ethereum Layer 2 que tiene como objetivo mejorar el rendimiento de la ejecución de contratos inteligentes mediante la introducción de la máquina virtual WebAssembly (WASM). Los contratos se pueden ejecutar más rápido que con Solidity, al tiempo que se reducen los costos de gas. Esto facilita la creación de contratos inteligentes de alto rendimiento en la red Arbitrum y actualmente admite la compilación en C, C++ y Rust.

Compatibilidad con precompilaciones personalizadas: Stylus también admite precompilaciones personalizadas, lo que permite a los desarrolladores implementar sus propias precompilaciones de Rust o C++ en la red Arbitrum. Esto puede ayudar a introducir nuevos algoritmos criptográficos u otras funcionalidades específicas en la cadena sin esperar actualizaciones en la cadena. Por ejemplo, el cálculo de tensores se puede precompilar para reducir los costos de inferencia, lo que puede resultar beneficioso para el aprendizaje automático en cadena.

Interoperabilidad con EVM: Stylus logra la integración con el ecosistema Ethereum existente a través de la interoperabilidad con la Máquina Virtual Ethereum (EVM). Esto significa que los contratos Stylus pueden interactuar con los contratos EVM existentes y compartir el mismo estado global que el EVM.

Reentrada: a diferencia de Cosmos Wasm, Stylus Rust SDK introduce una función de reentrada y permite a los desarrolladores habilitarla manualmente. Esto permite que los contratos tengan más flexibilidad en la interoperabilidad, pero los desarrolladores deben administrar cuidadosamente el estado para garantizar la seguridad.

Basado en el próspero ecosistema de Arbitrum, la integración de Stylus es quizás la integración WASM más significativa. También mejora la competitividad de Arbitrum entre los campos de zkRollup.

2.6 engranaje (lunares)

El protocolo Gear está creando una tecnología que se puede implementar como una paracadena de Polkadot, que sirve como herramienta para albergar contratos inteligentes. Al igual que Polkadot, Gear también utiliza el marco Substrate, que simplifica el proceso de creación de diferentes cadenas de bloques para aplicaciones específicas. Substrate proporciona una funcionalidad lista para usar, lo que permite a las personas concentrarse en crear motores personalizados además del protocolo.

Anteriormente, el costo de lanzar una cadena de bloques era alto, pero Gear permite a los desarrolladores de dApps concentrarse en sus proyectos en lugar de construir y operar una cadena de bloques completa desde cero.

El motor principal del protocolo Gear es el módulo de contrato inteligente. En el caso de Gear, cualquier contrato inteligente es un programa WebAssembly compilado en diferentes lenguajes como Rust, C y C++. Para los desarrolladores ajenos al mundo de las criptomonedas, la barrera de entrada es baja porque pueden crear contratos inteligentes en un entorno familiar. A los desarrolladores les resulta más fácil experimentar con lenguajes de programación de contratos inteligentes.

La arquitectura de contrato inteligente de Gear utiliza el modelo de actor en su interior y proporciona las siguientes funcionalidades:

  • Memoria persistente para programas inmutables
  • Manejo de mensajes asincrónicos
  • Superficie API mínima, intuitiva y suficiente para el contexto blockchain
  • Modelo de proxy de comunicación de actores entre componentes en cadena para una mayor componibilidad y mejor compatibilidad con la ejecución y fragmentación de código paralelo.

Cada programa tiene una cantidad fija de memoria, sobre la cual Gear permite controlar. Un programa solo puede leer y escribir en su propia memoria y no puede acceder al espacio de memoria de otros programas. Cada programa tiene su propio espacio de memoria independiente y la información de los nodos Gear se puede procesar en paralelo.

2.7 CosmWasm(Cosmos)

CosmWasm es una plataforma de contrato inteligente moderna y potente basada en Wasm que se puede integrar fácilmente con Cosmos-SDK. Esto muestra una de las principales ventajas de CosmWasm: los contratos escritos con CosmWasm están estrechamente integrados con IBC (Comunicación Inter-Blockchain) de forma nativa, lo que permite a los desarrolladores y usuarios ingresar a un futuro de múltiples cadenas. Actualmente, solo se admite Rust.

Ventajas de CosmWasm

  1. Seguridad: mejora la seguridad de los contratos inteligentes utilizando el lenguaje de programación Rust.
  2. Compatibilidad entre cadenas: admite el protocolo IBC (Inter-Blockchain Communication) dentro del ecosistema Cosmos.
  3. Rendimiento: Demuestra una mayor eficiencia y menores costos de transacción en ciertos casos en comparación con la máquina virtual Ethereum (EVM) tradicional.
  4. Fácil de usar para desarrolladores: las características de seguridad de tipo y memoria del lenguaje Rust ayudan a reducir ciertos tipos de errores en los contratos inteligentes.

Desafíos y limitaciones

  1. Curva de aprendizaje: Rust puede tener una curva de aprendizaje más pronunciada en comparación con los lenguajes de contratos inteligentes más utilizados como Solidity. Para aumentar el potencial de una adopción generalizada, CosmWasm necesita admitir la compilación en más idiomas.
  2. Ecosistema y herramientas: aunque crecen, las herramientas de desarrollo y el ecosistema de CosmWasm pueden seguir siendo relativamente limitados en comparación con plataformas maduras de contratos inteligentes como Ethereum.
  3. Cuota de mercado y conocimiento: en el espacio de las plataformas de contratos inteligentes, CosmWasm puede tener un menor conocimiento en comparación con plataformas como Ethereum y Binance Smart Chain, lo que afecta su capacidad para atraer desarrolladores y usuarios.
  4. Desafíos de mantenimiento y actualización: si bien CosmWasm proporciona funcionalidad de actualización de contratos, mantener y administrar actualizaciones para contratos inteligentes sigue siendo una tarea compleja que debe manejarse con cuidado para evitar vulnerabilidades de seguridad.
  5. Problemas de compatibilidad: los proyectos acostumbrados a EVM u otros entornos de contratos inteligentes pueden enfrentar desafíos de compatibilidad al migrar a CosmWasm.

2.8 ZK-WASM

Además de la máquina virtual wasm, también existe una tecnología emergente reciente llamada ZKWASM. El inventor, Delphinus Labs, ha abierto el código de ZK-WASM en GitHub. ZKWASM permite a los desarrolladores verificar la exactitud de los cálculos ejecutados sin volver a ejecutarlos. Al aprovechar ZKWASM, los desarrolladores pueden crear de manera flexible aplicaciones a prueba de conocimiento cero (ZKP) utilizando varios lenguajes de programación. Estas aplicaciones se pueden ejecutar sin problemas en los navegadores web.

ZKWASM se deriva de ZKSNARK, que es una combinación de SNARG y pruebas de conocimiento cero. Expliquemoslo más. Normalmente, para utilizar ZKSNARK, es necesario escribir un programa en un lenguaje de circuitos aritméticos o en un lenguaje compatible con circuitos como Pinocchio, TinyRAM, Buffet/Pequin, Geppetto, xJsnark framework, ZoKrates, etc. Esto supone una barrera para los programas existentes, lo que les dificulta aprovechar el poder de ZKSNARK. Sin embargo, hay otra forma, que no es usar ZKSNARK en el nivel de código fuente sino en el nivel de código de bytes de una máquina virtual, y luego implementar una máquina virtual que admita ZKSNARK. Delphinus Labs ha adoptado este último enfoque incorporando toda la máquina virtual WASM en un circuito ZKSNARK. Como resultado, las aplicaciones WASM existentes pueden ejecutarse directamente en ZKWASM sin ninguna modificación. Por lo tanto, los proveedores de servicios en la nube pueden demostrar a cualquier usuario que los resultados del cálculo se calculan de manera honesta y no revelarán ninguna información privada.

ZKWASM proporciona varios casos de uso, como habilitar la verificación en cadena de las operaciones realizadas en el navegador. Permite interacciones basadas en la web que son verificables en blockchain. Otros casos de uso incluyen servicios de Oracle, computación fuera de cadena, automatización, cerrar la brecha entre Web2 y Web3, generar pruebas para el aprendizaje automático y el procesamiento de datos, e incluso juegos y aplicaciones sociales. Con una adopción cada vez mayor, zkWASM amplía las posibilidades de Web3 e integra a los desarrolladores de Web2 en este panorama transformador.

A través de la implementación ZKWASM de Delphinus Lab, los desarrolladores pueden aprovechar el poder de las pruebas de conocimiento cero para mejorar la seguridad y privacidad de sus aplicaciones, allanando el camino para un ecosistema digital más confiable y descentralizado.

3. Conclusión

El rendimiento de la Web y el futuro de la capa de ejecución de la plataforma de contratos inteligentes son prometedores. Las dApps no solo tendrán un mayor rendimiento, sino que la integración de WASM también hará que sea más fácil para aquellos familiarizados con lenguajes convencionales como Rust y Go desarrollar contratos inteligentes, sin tener que aprender las complejidades de la solidez u otros lenguajes de desarrollo de blockchain. Según Evans Data Corporation, hay casi 27 millones de desarrolladores en todo el mundo y este número está creciendo constantemente, con un aumento esperado a más de 28,7 millones para 2024. Sin embargo, el número de desarrolladores en el campo blockchain sigue siendo inferior a 30.000, lo que representa sólo aproximadamente una milésima parte del número total de desarrolladores. Aunque este número aumenta constantemente, aprender nuevos lenguajes de contratos inteligentes puede seguir siendo una barrera para que los desarrolladores ingresen a la industria blockchain.

Pero cada vez más cadenas de bloques están comenzando a admitir Web Assembly como código de bytes para contratos inteligentes compilados. WASM aporta eficiencia, interoperabilidad y una amplia gama de casos de uso a las cadenas de bloques. También sirve como llave para abrir la puerta a los desarrolladores, reduciendo la barrera de entrada al desarrollo de blockchain. Imagínese, en un futuro cercano, cuando los desarrolladores Web 2.0 quieran probar suerte en el desarrollo de blockchain, podrán usar lenguajes familiares como Python, C++ y JavaScript para crear aplicaciones a gran escala en blockchain, maximizando el valor de las redes descentralizadas. Primero, reducir la barrera para los creadores (desarrolladores), luego reducir la barrera para los usuarios y avanzar hacia la adopción masiva.

4. Índice

https://blog.scottlogic.com/2022/06/20/state-of-wasm-2022.html

https://www.notion.so/18f67cee15c147dfae68b06269a455c0?pvs=21

https://wiki.polkadot.network/docs/learn-wasm

https://docs.arbitrum.io/stylus/stylus-gentle-introduction

https://medium.com/@gear_techs/introduciendo-gear-easy-to-use-polkadot-parachain-9ccd05437a9c

https://medium.com/cosmwasm/cosmwasm-for-ctos-f1ffa19cccb8

https://www.cncf.io/wp-content/uploads/2023/09/The-State-of-WebAssembly-2023.pdf

https://github.com/DelphinusLab/zkWasm

Gracias a Maggie y Xinyou Ji (CMU) por sus consejos y orientación sobre este artículo.

Descargo de responsabilidad: Todos los artículos de Foresight Ventures no pretenden ser consejos de inversión. Las inversiones implican riesgos, así que evalúe su propia tolerancia al riesgo y tome decisiones de inversión con cuidado.

Descargo de responsabilidad:

  1. Este artículo está reimpreso de [Foresight Research]. Todos los derechos de autor pertenecen al autor original [Mike@ Foresight Ventures]. Si hay objeciones a esta reimpresión, comuníquese con el equipo de Gate Learn y ellos lo manejarán de inmediato.
  2. Descargo de responsabilidad: los puntos de vista y opiniones expresados en este artículo son únicamente los del autor y no constituyen ningún consejo de inversión.
  3. Las traducciones del artículo a otros idiomas están a cargo del equipo de Gate Learn. A menos que se mencione, está prohibido copiar, distribuir o plagiar los artículos traducidos.

Foresight Ventures: WASM: el motor de una nueva era

Principiante1/1/2024, 2:25:51 AM
Este artículo examina algunas de las relaciones y casos de uso entre Wasm y blockchain: contratos inteligentes, interacciones entre cadenas, computación fuera de la cadena y privacidad de datos.

TL;DR

WebAssembly (Wasm) es un formato de instrucción binaria portátil y de alto rendimiento que se puede ejecutar en navegadores web. Está diseñado como un objetivo de compilación universal que puede usarse con múltiples lenguajes de programación y ejecutarse en diferentes plataformas.

Blockchain es una tecnología de contabilidad distribuida descentralizada que garantiza la seguridad y confiabilidad de los datos mediante el uso de criptografía y algoritmos de consenso. Blockchain se puede utilizar para registrar transacciones, almacenar datos y ejecutar contratos inteligentes, entre otras aplicaciones.

Existen varias relaciones y escenarios de aplicación entre Wasm y blockchain:

  1. Contratos inteligentes: Wasm puede servir como entorno de ejecución para contratos inteligentes, permitiendo que los contratos se ejecuten en diferentes plataformas blockchain. El alto rendimiento y la portabilidad de Wasm permiten una ejecución más eficiente de contratos inteligentes y usabilidad multiplataforma.
  2. Interoperabilidad entre cadenas: Wasm se puede utilizar para implementar la interoperabilidad entre cadenas. Al compilar la lógica de diferentes cadenas de bloques en código Wasm, se puede ejecutar la misma lógica en diferentes cadenas de bloques, lo que permite la transferencia de datos y la interacción entre cadenas.
  3. Computación fuera de la cadena: Wasm se puede utilizar para realizar cálculos fuera de la cadena de bloques y enviar los resultados del cálculo a la cadena de bloques. Esto permite mejorar la eficiencia y la flexibilidad en la computación mientras se mantiene la seguridad y confiabilidad de los datos.
  4. Privacidad de datos: Wasm se puede utilizar para lograr la protección de la privacidad de los datos en blockchain. Al compilar la lógica de procesamiento de datos confidenciales en código Wasm y ejecutarla en la cadena de bloques, se puede preservar la privacidad de los datos y al mismo tiempo garantizar la verificabilidad de los cálculos.

En resumen, la combinación de Wasm y blockchain proporciona aplicaciones y servicios blockchain más eficientes, seguros y flexibles. La portabilidad y el alto rendimiento de Wasm la convierten en una tecnología importante en el campo de blockchain.

1. ¿Qué es el ensamblaje web?

WebAssembly es un estándar de conjunto de instrucciones eficiente y liviano desarrollado por el World Wide Web Consortium (W3C). Es aclamado como un disruptor para la web y la informática de alto rendimiento, ya que admite la ejecución entre navegadores. Esto significa que podemos compilar diferentes lenguajes de programación, incluidos C/C++, Go, Rust y más, en un formato binario estándar unificado y usarlo como reemplazo de JavaScript, ejecutándolo con una eficiencia de código casi nativa en los navegadores web.

WebAssembly, también conocido como WASM, es una tecnología independiente de la plataforma y segura para la memoria que puede asignarse de manera eficiente a diferentes arquitecturas de CPU. Ofrece varias ventajas clave:

  • Eficiencia: WASM tiene un conjunto completo de características de lenguaje y es un formato binario compacto y de carga rápida. Su objetivo es aprovechar al máximo las capacidades del hardware para lograr un rendimiento en el idioma nativo.
  • Seguridad: WASM se ejecuta en un entorno de ejecución de espacio aislado y seguro para la memoria, e incluso se puede implementar dentro de máquinas virtuales JavaScript existentes. En un entorno web, WASM se adhiere estrictamente a la política del mismo origen y a las políticas de seguridad del navegador. Durante la compilación, WASM limita la interfaz para reducir los riesgos de seguridad. La mayoría de las aplicaciones WASM no pueden acceder a Internet (por ejemplo, no admiten sockets) y están limitadas al acceso a bases de datos locales. Muchos problemas de seguridad surgen del acceso no autorizado a la memoria, que se pueden mitigar durante la compilación con WASM.
  • Compatibilidad: WASM está diseñado para no tener versiones, funciones comprobables y compatibilidad con versiones anteriores en la web. Puede ser invocado mediante JavaScript, ingresar al contexto de JavaScript y acceder a funcionalidades del navegador como una API web. WASM puede ejecutarse no solo en navegadores web sino también en entornos no web como Node.js, Dispositivos Deno y IoT. A diferencia de los enfoques tradicionales que requieren múltiples compilaciones, WASM solo necesita compilarse una vez para una ejecución plug-and-play instantánea.

Además, la Web es la única plataforma verdaderamente universal que permite el acceso a sus aplicaciones en cualquier dispositivo. Esto también le permite mantener una base de código única, simplificar las actualizaciones y garantizar que todos los usuarios puedan acceder a sus aplicaciones. WASM admite operaciones enteras de 64 y 32 bits, que corresponden directamente a las instrucciones de la CPU. Al eliminar las operaciones de punto flotante, se puede lograr fácilmente un comportamiento determinista, lo cual es necesario para los algoritmos de consenso. Con el respaldo del proyecto de infraestructura del compilador LLVM, WASM puede beneficiarse de más de una década de optimizaciones del compilador en LLVM. WASM es desarrollado continuamente por importantes empresas como Google, Apple, Microsoft, Mozilla y Facebook, y cuenta con el respaldo de los servidores de los navegadores desarrollados por estas empresas.

La belleza de WASM radica en su capacidad de ejecutarse en cualquier lugar sin necesidad de descargarlo ni instalarlo, ya que está en formato binario. Con solo un clic, las aplicaciones web se pueden ejecutar inmediatamente cuando sea necesario. Es incluso más seguro que descargar y ejecutar archivos binarios directamente, ya que los navegadores tienen mecanismos de seguridad integrados que evitan que el código ejecutado dañe su sistema. Además, compartir aplicaciones web es sencillo: los enlaces se pueden colocar en cualquier lugar como cadenas en las que se puede hacer clic.

2. ¿Por qué necesitamos Web Assembly?

2.1 Web2

La Web ha evolucionado desde una plataforma para contenido estático y pequeños lenguajes de escritura a una plataforma potente y popular repleta de aplicaciones y funciones sorprendentes, gracias a la funcionalidad integrada de los navegadores y la interactividad proporcionada por la Web. Sin embargo, las aplicaciones web siguen siendo predominantemente impulsadas por el mismo lenguaje de programación (JavaScript), que inicialmente no fue diseñado para realizar estas tareas.

Inicialmente, JavaScript era un lenguaje de secuencias de comandos simple destinado a brindar interactividad a documentos de hipertexto livianos en aplicaciones web. Su diseño era fácil de aprender y escribir y no priorizaba la velocidad del tiempo de ejecución. A lo largo de los años, mejoras significativas en el rendimiento en el análisis de JavaScript por parte de los navegadores han dado lugar a aumentos notables del rendimiento.

Con la velocidad acelerada de ejecución de JavaScript, la gama de cosas que se pueden hacer dentro de los navegadores se ha ampliado significativamente. Las nuevas API han introducido funciones como gráficos interactivos, transmisión de video, navegación sin conexión y más. Además, un número cada vez mayor de aplicaciones que antes estaban limitadas a entornos de escritorio han ingresado a la Web. Ahora puedes editar documentos y enviar correos electrónicos fácilmente en tu navegador. Sin embargo, en ciertos dominios, el rendimiento de JavaScript sigue siendo un desafío. Piense en las aplicaciones de software que utiliza además de los navegadores: juegos, edición de vídeo, renderizado 3D o producción musical. Estas aplicaciones requieren cálculos extensos y alto rendimiento. JavaScript lucha por cumplir con estos requisitos de alto rendimiento.

Sin embargo, no es práctico reemplazar JavaScript e incluso podría llevar décadas lograr ese objetivo, ya que todo Internet depende de él. Además, existe una gran comunidad que mejora constantemente JavaScript. De hecho, en comparación con otros lenguajes, JavaScript tiene algunas deficiencias en aspectos como nulo y ==. Sin embargo, estos problemas no son lo suficientemente graves como para justificar el reemplazo de toda la tecnología.

Por lo tanto, WebAssembly no reemplazará a JavaScript, pero eso no significa que WASM no se utilizará en el futuro. De hecho, el uso de WASM se generalizará cada vez más. Esto se debe a que WASM puede aportar poderosas capacidades computacionales a la web, como procesamiento de imágenes o juegos. Con WASM, puede crear una versión web de Photoshop que funcione bien, o un juego 3D que se ejecute a 60 fotogramas por segundo o incluso velocidades de fotogramas más altas en el navegador. Los juegos, en particular, presentan un desafío porque requieren la ejecución simultánea de procesamiento de audio y video, así como la coordinación de efectos físicos y de IA. WASM tiene la capacidad de ejecutar juegos de manera eficiente en el navegador, lo que abre la puerta para incorporar muchas otras aplicaciones al navegador.

La figura anterior muestra una comparación del flujo de trabajo entre JavaScript y WebAssembly (wasm). Se puede observar que wasm es mucho más conciso en comparación con JavaScript.

2.2 Web3

Máquina virtual WASM

En 2018, el ecosistema Ethereum comenzó a discutir el uso de una VM WASM como máquina virtual de contrato inteligente, ya que se consideraba que tenía un mejor rendimiento que la EVM. Gavin Wood, el inventor de EVM, expresó la viabilidad de reemplazarlo con WASM, y Vitalik también afirmó que Ethereum 2.0 se actualizará para admitir contratos WASM (eWASM) para satisfacer más necesidades de desarrollo. Hoy en día, el desarrollo de los contratos WASM ya ha tomado forma.

2.3 ¿Cómo se diseña el EVM? ¿Por qué es ineficiente?

Problema de tamaño de la arquitectura

Las computadoras tradicionales tienen conjuntos de instrucciones que aceptan entradas de 32 o 64 bits. EVM, sin embargo, es diferente y único, ya que es una computadora de 256 bits diseñada para manejar más fácilmente el algoritmo hash de Ethereum, que produce salidas explícitas de 256 bits.

Sin embargo, la computadora real que ejecuta programas EVM necesita dividir las palabras de 256 bits en sus arquitecturas nativas para ejecutar contratos inteligentes, lo que hace que todo el sistema sea ineficiente y poco práctico.

Además, si desea implementar un algoritmo complejo como SHA256 utilizando los OPCODES básicos de EVM en Ethereum, ¡le espera un momento difícil! Para abordar el problema del alto costo del gas al ejecutar programas complejos a través del conjunto de instrucciones, Ethereum introdujo el concepto de precompilaciones, que compila el programa en EVM y consume una cantidad fija de gas. Una precompilación notable es el algoritmo hash de Ethereum, ya que implementarlo dentro de la máquina virtual resultaría en tarifas extremadamente costosas cuando se solicitan contratos.

Precompilación hinchada

El problema con la precompilación es que aumenta continuamente la hinchazón y la complejidad de la máquina virtual, sin abordar el problema central: el diseño ineficiente y deficiente del conjunto de instrucciones y especificaciones actuales.

¿Qué pasaría si pudiéramos definir una nueva especificación y conjunto de instrucciones que no requieran la precompilación de estos programas complejos, sino que logren eficientemente los resultados deseados a través de instrucciones básicas? Aquí es donde entra en juego WASM.

2.4 Comparación entre EVM y WASM VM

  • Velocidad: WASM tiene como objetivo proporcionar una velocidad de ejecución más rápida en comparación con EVM. EVM puede tener problemas de eficiencia al compilar y ejecutar contratos inteligentes, mientras que WASM mejora la velocidad de carga y la capacidad de procesamiento al convertir directamente a código compilado.
  • Contratos precompilados: EVM se basa en contratos precompilados para la ejecución eficiente de cálculos criptográficos, pero esto puede introducir riesgos de bifurcaciones duras. WASM elimina la necesidad de contratos precompilados, lo que permite a los desarrolladores crear contratos inteligentes eficientes y rápidos.
  • Costos de transacción: con una máquina virtual WASM más rápida, el rendimiento de las transacciones aumenta significativamente, lo que lleva a una reducción de los costos de transacción y de implementación de contratos. Los contratos WASM abordan los problemas de las altas tarifas de transacción y la congestión en la red Ethereum.
  • Flexibilidad e interoperabilidad: WASM amplía la gama de lenguajes disponibles para el desarrollo de contratos inteligentes, admitiendo el uso de cualquier lenguaje de alto nivel que se compile en WASM, como Rust, C++ y JavaScript. Esto significa que los desarrolladores pueden escribir contratos inteligentes en su lenguaje preferido, ¡incluidos marcos maduros como ink! ¡Para Rust o Ask! para ensamblador.

Actualmente, el equipo de EWASM está integrando WebAssembly en Ethereum para garantizar una capa de ejecución más eficiente y simplificada, lo que hace que Ethereum sea adecuado como una plataforma informática totalmente descentralizada. WASM ha sido adoptado como estándar por muchos otros proyectos, incluidos Dfinity y EOS, y ambos lo utilizan para mejorar sus capas de ejecución.

2.5 Lápiz óptico (Arbitrum)

El proyecto Stylus es una iniciativa en la red Arbitrum Ethereum Layer 2 que tiene como objetivo mejorar el rendimiento de la ejecución de contratos inteligentes mediante la introducción de la máquina virtual WebAssembly (WASM). Los contratos se pueden ejecutar más rápido que con Solidity, al tiempo que se reducen los costos de gas. Esto facilita la creación de contratos inteligentes de alto rendimiento en la red Arbitrum y actualmente admite la compilación en C, C++ y Rust.

Compatibilidad con precompilaciones personalizadas: Stylus también admite precompilaciones personalizadas, lo que permite a los desarrolladores implementar sus propias precompilaciones de Rust o C++ en la red Arbitrum. Esto puede ayudar a introducir nuevos algoritmos criptográficos u otras funcionalidades específicas en la cadena sin esperar actualizaciones en la cadena. Por ejemplo, el cálculo de tensores se puede precompilar para reducir los costos de inferencia, lo que puede resultar beneficioso para el aprendizaje automático en cadena.

Interoperabilidad con EVM: Stylus logra la integración con el ecosistema Ethereum existente a través de la interoperabilidad con la Máquina Virtual Ethereum (EVM). Esto significa que los contratos Stylus pueden interactuar con los contratos EVM existentes y compartir el mismo estado global que el EVM.

Reentrada: a diferencia de Cosmos Wasm, Stylus Rust SDK introduce una función de reentrada y permite a los desarrolladores habilitarla manualmente. Esto permite que los contratos tengan más flexibilidad en la interoperabilidad, pero los desarrolladores deben administrar cuidadosamente el estado para garantizar la seguridad.

Basado en el próspero ecosistema de Arbitrum, la integración de Stylus es quizás la integración WASM más significativa. También mejora la competitividad de Arbitrum entre los campos de zkRollup.

2.6 engranaje (lunares)

El protocolo Gear está creando una tecnología que se puede implementar como una paracadena de Polkadot, que sirve como herramienta para albergar contratos inteligentes. Al igual que Polkadot, Gear también utiliza el marco Substrate, que simplifica el proceso de creación de diferentes cadenas de bloques para aplicaciones específicas. Substrate proporciona una funcionalidad lista para usar, lo que permite a las personas concentrarse en crear motores personalizados además del protocolo.

Anteriormente, el costo de lanzar una cadena de bloques era alto, pero Gear permite a los desarrolladores de dApps concentrarse en sus proyectos en lugar de construir y operar una cadena de bloques completa desde cero.

El motor principal del protocolo Gear es el módulo de contrato inteligente. En el caso de Gear, cualquier contrato inteligente es un programa WebAssembly compilado en diferentes lenguajes como Rust, C y C++. Para los desarrolladores ajenos al mundo de las criptomonedas, la barrera de entrada es baja porque pueden crear contratos inteligentes en un entorno familiar. A los desarrolladores les resulta más fácil experimentar con lenguajes de programación de contratos inteligentes.

La arquitectura de contrato inteligente de Gear utiliza el modelo de actor en su interior y proporciona las siguientes funcionalidades:

  • Memoria persistente para programas inmutables
  • Manejo de mensajes asincrónicos
  • Superficie API mínima, intuitiva y suficiente para el contexto blockchain
  • Modelo de proxy de comunicación de actores entre componentes en cadena para una mayor componibilidad y mejor compatibilidad con la ejecución y fragmentación de código paralelo.

Cada programa tiene una cantidad fija de memoria, sobre la cual Gear permite controlar. Un programa solo puede leer y escribir en su propia memoria y no puede acceder al espacio de memoria de otros programas. Cada programa tiene su propio espacio de memoria independiente y la información de los nodos Gear se puede procesar en paralelo.

2.7 CosmWasm(Cosmos)

CosmWasm es una plataforma de contrato inteligente moderna y potente basada en Wasm que se puede integrar fácilmente con Cosmos-SDK. Esto muestra una de las principales ventajas de CosmWasm: los contratos escritos con CosmWasm están estrechamente integrados con IBC (Comunicación Inter-Blockchain) de forma nativa, lo que permite a los desarrolladores y usuarios ingresar a un futuro de múltiples cadenas. Actualmente, solo se admite Rust.

Ventajas de CosmWasm

  1. Seguridad: mejora la seguridad de los contratos inteligentes utilizando el lenguaje de programación Rust.
  2. Compatibilidad entre cadenas: admite el protocolo IBC (Inter-Blockchain Communication) dentro del ecosistema Cosmos.
  3. Rendimiento: Demuestra una mayor eficiencia y menores costos de transacción en ciertos casos en comparación con la máquina virtual Ethereum (EVM) tradicional.
  4. Fácil de usar para desarrolladores: las características de seguridad de tipo y memoria del lenguaje Rust ayudan a reducir ciertos tipos de errores en los contratos inteligentes.

Desafíos y limitaciones

  1. Curva de aprendizaje: Rust puede tener una curva de aprendizaje más pronunciada en comparación con los lenguajes de contratos inteligentes más utilizados como Solidity. Para aumentar el potencial de una adopción generalizada, CosmWasm necesita admitir la compilación en más idiomas.
  2. Ecosistema y herramientas: aunque crecen, las herramientas de desarrollo y el ecosistema de CosmWasm pueden seguir siendo relativamente limitados en comparación con plataformas maduras de contratos inteligentes como Ethereum.
  3. Cuota de mercado y conocimiento: en el espacio de las plataformas de contratos inteligentes, CosmWasm puede tener un menor conocimiento en comparación con plataformas como Ethereum y Binance Smart Chain, lo que afecta su capacidad para atraer desarrolladores y usuarios.
  4. Desafíos de mantenimiento y actualización: si bien CosmWasm proporciona funcionalidad de actualización de contratos, mantener y administrar actualizaciones para contratos inteligentes sigue siendo una tarea compleja que debe manejarse con cuidado para evitar vulnerabilidades de seguridad.
  5. Problemas de compatibilidad: los proyectos acostumbrados a EVM u otros entornos de contratos inteligentes pueden enfrentar desafíos de compatibilidad al migrar a CosmWasm.

2.8 ZK-WASM

Además de la máquina virtual wasm, también existe una tecnología emergente reciente llamada ZKWASM. El inventor, Delphinus Labs, ha abierto el código de ZK-WASM en GitHub. ZKWASM permite a los desarrolladores verificar la exactitud de los cálculos ejecutados sin volver a ejecutarlos. Al aprovechar ZKWASM, los desarrolladores pueden crear de manera flexible aplicaciones a prueba de conocimiento cero (ZKP) utilizando varios lenguajes de programación. Estas aplicaciones se pueden ejecutar sin problemas en los navegadores web.

ZKWASM se deriva de ZKSNARK, que es una combinación de SNARG y pruebas de conocimiento cero. Expliquemoslo más. Normalmente, para utilizar ZKSNARK, es necesario escribir un programa en un lenguaje de circuitos aritméticos o en un lenguaje compatible con circuitos como Pinocchio, TinyRAM, Buffet/Pequin, Geppetto, xJsnark framework, ZoKrates, etc. Esto supone una barrera para los programas existentes, lo que les dificulta aprovechar el poder de ZKSNARK. Sin embargo, hay otra forma, que no es usar ZKSNARK en el nivel de código fuente sino en el nivel de código de bytes de una máquina virtual, y luego implementar una máquina virtual que admita ZKSNARK. Delphinus Labs ha adoptado este último enfoque incorporando toda la máquina virtual WASM en un circuito ZKSNARK. Como resultado, las aplicaciones WASM existentes pueden ejecutarse directamente en ZKWASM sin ninguna modificación. Por lo tanto, los proveedores de servicios en la nube pueden demostrar a cualquier usuario que los resultados del cálculo se calculan de manera honesta y no revelarán ninguna información privada.

ZKWASM proporciona varios casos de uso, como habilitar la verificación en cadena de las operaciones realizadas en el navegador. Permite interacciones basadas en la web que son verificables en blockchain. Otros casos de uso incluyen servicios de Oracle, computación fuera de cadena, automatización, cerrar la brecha entre Web2 y Web3, generar pruebas para el aprendizaje automático y el procesamiento de datos, e incluso juegos y aplicaciones sociales. Con una adopción cada vez mayor, zkWASM amplía las posibilidades de Web3 e integra a los desarrolladores de Web2 en este panorama transformador.

A través de la implementación ZKWASM de Delphinus Lab, los desarrolladores pueden aprovechar el poder de las pruebas de conocimiento cero para mejorar la seguridad y privacidad de sus aplicaciones, allanando el camino para un ecosistema digital más confiable y descentralizado.

3. Conclusión

El rendimiento de la Web y el futuro de la capa de ejecución de la plataforma de contratos inteligentes son prometedores. Las dApps no solo tendrán un mayor rendimiento, sino que la integración de WASM también hará que sea más fácil para aquellos familiarizados con lenguajes convencionales como Rust y Go desarrollar contratos inteligentes, sin tener que aprender las complejidades de la solidez u otros lenguajes de desarrollo de blockchain. Según Evans Data Corporation, hay casi 27 millones de desarrolladores en todo el mundo y este número está creciendo constantemente, con un aumento esperado a más de 28,7 millones para 2024. Sin embargo, el número de desarrolladores en el campo blockchain sigue siendo inferior a 30.000, lo que representa sólo aproximadamente una milésima parte del número total de desarrolladores. Aunque este número aumenta constantemente, aprender nuevos lenguajes de contratos inteligentes puede seguir siendo una barrera para que los desarrolladores ingresen a la industria blockchain.

Pero cada vez más cadenas de bloques están comenzando a admitir Web Assembly como código de bytes para contratos inteligentes compilados. WASM aporta eficiencia, interoperabilidad y una amplia gama de casos de uso a las cadenas de bloques. También sirve como llave para abrir la puerta a los desarrolladores, reduciendo la barrera de entrada al desarrollo de blockchain. Imagínese, en un futuro cercano, cuando los desarrolladores Web 2.0 quieran probar suerte en el desarrollo de blockchain, podrán usar lenguajes familiares como Python, C++ y JavaScript para crear aplicaciones a gran escala en blockchain, maximizando el valor de las redes descentralizadas. Primero, reducir la barrera para los creadores (desarrolladores), luego reducir la barrera para los usuarios y avanzar hacia la adopción masiva.

4. Índice

https://blog.scottlogic.com/2022/06/20/state-of-wasm-2022.html

https://www.notion.so/18f67cee15c147dfae68b06269a455c0?pvs=21

https://wiki.polkadot.network/docs/learn-wasm

https://docs.arbitrum.io/stylus/stylus-gentle-introduction

https://medium.com/@gear_techs/introduciendo-gear-easy-to-use-polkadot-parachain-9ccd05437a9c

https://medium.com/cosmwasm/cosmwasm-for-ctos-f1ffa19cccb8

https://www.cncf.io/wp-content/uploads/2023/09/The-State-of-WebAssembly-2023.pdf

https://github.com/DelphinusLab/zkWasm

Gracias a Maggie y Xinyou Ji (CMU) por sus consejos y orientación sobre este artículo.

Descargo de responsabilidad: Todos los artículos de Foresight Ventures no pretenden ser consejos de inversión. Las inversiones implican riesgos, así que evalúe su propia tolerancia al riesgo y tome decisiones de inversión con cuidado.

Descargo de responsabilidad:

  1. Este artículo está reimpreso de [Foresight Research]. Todos los derechos de autor pertenecen al autor original [Mike@ Foresight Ventures]. Si hay objeciones a esta reimpresión, comuníquese con el equipo de Gate Learn y ellos lo manejarán de inmediato.
  2. Descargo de responsabilidad: los puntos de vista y opiniones expresados en este artículo son únicamente los del autor y no constituyen ningún consejo de inversión.
  3. Las traducciones del artículo a otros idiomas están a cargo del equipo de Gate Learn. A menos que se mencione, está prohibido copiar, distribuir o plagiar los artículos traducidos.
Начните торговать сейчас
Зарегистрируйтесь сейчас и получите ваучер на
$100
!