Cómo migrar contratos inteligentes de Solidity de Ethereum a Rust de Soroban

Autor

Julian Martinez

Fecha de publicación

Desarrolladores

Contratos Inteligentes

Rust v. Solidity

¿Por qué un desarrollador de blockchain elegiría Rust sobre Solidity?

En este tutorial, exploraremos las complejidades de dos importantes entornos de programación de contratos inteligentes: Solidity de Ethereum y Rust SDK de Soroban y por qué deberías considerar migrar tus contratos inteligentes a Rust.

En el ámbito de blockchain y contratos inteligentes, Rust es una opción destacada para los desarrolladores, y aquí está el porqué:

  • Velocidad y eficiencia: Rust se desplaza por las tareas como un coche deportivo con estilo. Es súper rápido, incluso superando a C++ en términos de velocidad y eficiencia para que tus operaciones en blockchain no solo sean rápidas sino que también ahorren en recursos computacionales.
  • Seguridad de Tipo: Imagina el sistema de tipos de Rust como un inspector meticuloso, que está observando cada bit de tu código en tiempo de compilación. Esto significa menos errores y un entorno más seguro para tus contratos inteligentes.
  • Seguridad de Memoria Sin Sobrecarga: Rust presume de una seguridad de memoria de primera, actuando como un escudo invisible contra vulnerabilidades críticas en el mundo de blockchain. Y lo hace de manera eficiente sin necesitar un recolector de basura, manteniendo tus proyectos ágiles y fortificados.
  • Conquistando la Concurrencia con Facilidad: En blockchain, manejar transacciones simultáneas es como hacer malabares con bolas de fuego. Rust sobresale en gestionar múltiples operaciones sin problemas, previniendo las complicaciones comunes vistas en otros lenguajes. Esto lleva a un procesamiento de transacciones más rápido y seguro, mejorando el rendimiento general de tus contratos inteligentes.

Rust combina velocidad, seguridad y eficiencia de ejecución haciéndolo un lenguaje ideal para el desarrollo de blockchain donde tales cualidades son demandadas. Entonces, ¿cómo se compara Rust con Solidity?


¿Cuál es la diferencia entre EVM y Soroban?

¿Qué es EVM?

La Máquina Virtual de Ethereum (EVM) es un componente central de la red de blockchain de Ethereum. Es un entorno virtual que permite la ejecución de contratos inteligentes y aplicaciones descentralizadas (dApps). Mientras que Ethereum es la red principal que utiliza la EVM, otras plataformas de blockchain han adoptado o creado versiones compatibles de la EVM. Por ejemplo:

  • Avalanche tiene su propia máquina virtual, la Máquina Virtual de Avalanche (AVM), pero también admite la EVM a través de su C-Chain, permitiendo compatibilidad con aplicaciones basadas en Ethereum.
  • Optimism y Polygon son soluciones de Capa 2 construidas sobre la blockchain de Ethereum. Utilizan Rollups Optimistas y la propia tecnología de Polygon, respectivamente, pero son compatibles con la EVM. Esto significa que pueden ejecutar contratos inteligentes y dApps de Ethereum.

Cada red de blockchain puede tener sus propios mecanismos de consenso, arquitectura subyacente e implementaciones de protocolo. Geth (Go Ethereum, una implementación de un nodo de Ethereum en el lenguaje de programación Go) es específicamente un cliente de Ethereum, y aunque otras redes pueden inspirarse o utilizar aspectos de la tecnología de Ethereum, a menudo tienen protocolos e implementaciones centrales distintos.

En el mundo de EVM, Solidity es el lenguaje preferido para desarrollar contratos inteligentes. Aquí hay un resumen rápido para mis compañeros constructores:

  • Enfoque Orientado a Objetos: Al igual que otros lenguajes OOP, Solidity organiza el código alrededor de datos y objetos, no solo funciones y lógica.
  • Lenguaje de Alto Nivel: Abstrae de los detalles técnicos del hardware de la computadora, haciendo el desarrollo más suave e intuitivo.
  • Tipado Estático: Solidity verifica tu código en busca de errores y desajustes de tipo en tiempo de compilación, ahorrándote muchos dolores de cabeza más tarde.

Lo que hace destacar a Solidity es su papel en el poder de las transacciones descentralizadas y la gestión de cuentas de blockchain. Además, si te sientes cómodo con JavaScript, C++ y Python, encontrarás familiar la sintaxis de Solidity.

¿Cuál es la diferencia entre EVM y Soroban?

¿Qué es Soroban?

Soroban es una plataforma de contratos inteligentes diseñada para ser sensata, construida para escalar, con todo incluido y amigable para los desarrolladores.

Aunque funciona muy bien con Stellar, dado que comparte los valores de escala y sensatez de la blockchain, no depende ni requiere de Stellar en absoluto y puede ser utilizada por cualquier procesador de transacciones, incluyendo otras blockchains, L2s y registros autorizados.

Actualmente, Soroban está disponible como parte de la versión estable v20 del protocolo de Stellar en Testnet. El paquete para el módulo consiste en - entorno de contratos inteligentes, un SDK de Rust, un CLI, un servidor RPC y módulos adicionales diseñados para contratos inteligentes en Stellar. Los usuarios tienen la opción de escribir y probar contratos en sus máquinas locales o desplegarlos en Testnet para una simulación más realista.

Introducido en 2022, el SDK de Rust de Soroban es un conjunto de herramientas específicamente para escribir contratos inteligentes en la plataforma Soroban. Desarrollado en Rust, permite a los desarrolladores crear aplicaciones de finanzas descentralizadas, creadores de mercado automatizados y activos tokenizados, mientras también aprovecha algunas de las funcionalidades centrales de Stellar.

Hola Mundo

Cómo Construir un Contrato Inteligente Hola Mundo

Crearemos dos contratos "Hola Mundo": primero en Solidity, luego usando el SDK de Rust de Soroban.

Solidity

Versión Solidity

Abre el remix-ide en tu navegador navegando a: remix.ethereum.org/

Haz clic en el icono de “crear nuevo archivo” en la pestaña "Explorador de Archivos".

Escribe el nombre del archivo “HelloWorld.sol” e introduce el siguiente código en el ide:

```

// SPDX-License-Identifier: MIT

// compiler version must be greater than or equal to 0.8.20 and less than 0.9.0

pragma solidity >=0.7.0 <0.9.0;




contract HelloWorld {

function hello(string memory to) public pure returns(string memory){

string memory greeting = string(abi.encodePacked("hello ", to));

return greeting;

}

}

```

Revisión

Hagamos una breve pausa para desglosar el código

```
// SPDX-License-Identifier: MIT
```

Este comentario indica la licencia bajo la cual se libera el código (Licencia MIT).

```
pragma solidity >=0.7.0 <0.9.0;
```

Esta línea especifica que este código es compatible con versiones del compilador de Solidity mayores o iguales a 0.7.0 y menores a 0.9.0. Establece límites de versión del compilador para asegurar la compatibilidad del código y el comportamiento esperado.


```
contract HelloWorld {
```

Aquí, declaramos un contrato de Solidity llamado "HelloWorld."

```
function hello(string memory to) public pure returns(string memory){
```
  • Toma un argumento, una cadena llamada "to", que representa el nombre de la persona a la que quieres saludar.
  • La función está marcada como "public", lo que significa que se puede llamar externamente.
  • La palabra clave "pure" indica que esta función no modifica el estado del contrato.

```
string memory greeting = string(abi.encodePacked("hello ", to));
```

Dentro de la función "hello", se declara una nueva variable de cadena "greeting".

  • Se construye concatenando "hello" con el nombre proporcionado usando la función **abi.encodePacked**.
  • El resultado se almacena en la variable "greeting".
```
return greeting;
```

Finalmente, la función devuelve la cadena "greeting" como resultado de la llamada a la función.

Solidity

Ahora volvamos a nuestra programación regular (🥁)

Una vez que el código está en Remix, haz clic en el icono de "Compilador de Solidity" debajo del icono de “Explorador de Archivos”.

Luego, haz clic en “Compilar HelloWorld.sol” o simplemente presiona `cmd+s`

Una vez compilado exitosamente haz clic en el icono debajo de “Compilador de Solidity” que es “Desplegar y Ejecutar Transacciones”.

Sin cambiar ninguno de los valores mostrados arriba simplemente haz clic en el botón “Desplegar” para desplegar tu contrato inteligente. Una vez desplegado encontrarás tu contrato inteligente justo debajo en el encabezado “Contratos Desplegados”.

Haz clic en “>” antes de tu contrato verás un botón “hello” abajo ya que nuestro contrato tiene una variable de función hello que devuelve una cadena compuesta de “hello” + el valor que pasaste para el argumento `to`.

Define un valor para to y luego haz clic en el botón “hello” para devolver el saludo.

¡Bien hecho! Ahora vamos al meollo del asunto.

Soroban

Versión del SDK Rust de Soroban

Abre el playground de contratos inteligentes creado para Soroban, okashi, en tu navegador navegando a: okashi.dev/

Inicia un nuevo proyecto y nómbralo HelloWorld.

Introduce el siguiente código en el IDE:

```
#![no_std]
use soroban_sdk::{contract, contractimpl, symbol_short, vec, Env, Symbol, Vec};

#[contract]
pub struct Contract;

#[contractimpl]
impl Contract {
    /// Saluda a alguien o algo.
    /// Devuelve un vector/arreglo de longitud 2 que contiene 'Hello' y luego el valor pasado como `to`.
    pub fn hello(env: Env, to: Symbol) -> Vec<Symbol> {
        vec![&env, symbol_short!("Hello"), to]
    }
}
```

¿Ya es hora de otro corte comercial?!

No te preocupes, este te ayudará a pulir tu Rust (🥁)

```
#![no_std]
```

Esta directiva se usa al principio del código Rust para especificar que la biblioteca estándar (std) no debe incluirse en la construcción. En los contratos de Soroban, la biblioteca estándar se excluye porque es grande y no adecuada para el despliegue en blockchains.

```
use soroban_sdk::{contract, contractimpl, symbol_short, vec, Env, Symbol, Vec};
```
  • La **palabra clave use** se utiliza para importar dependencias externas o módulos al código Rust actual.
  • **soroban_sdk**: Este es el crate/módulo que proporciona las funcionalidades y tipos necesarios para los contratos de Soroban.
  • **{contract, contractimpl, symbol_short, vec, Env, Symbol, Vec}**: Estos son los elementos específicos que se importan del **módulo soroban_sdk** incluyendo atributos, macros **(contract, contractimpl, symbol_short!)**, y tipos de datos **(Env, Symbol, Vec)**.

```
#[contract]
pub struct Contract;
```
  • **#[contract]** es un atributo aplicado al struct Contract, designándolo como el tipo al cual se asocian las funciones del contrato. Implica que este struct tendrá funciones de contrato implementadas para él.
  • **pub struct Contract;** define un struct público llamado Contract. En los contratos de Soroban, las funciones del contrato se asocian con este struct.
```
#[contractimpl]
impl Contract {
    pub fn hello(env: Env, to: Symbol) -> Vec<Symbol> {
        vec![&env, symbol_short!("Hello"), to]
    }
}
```
  • **#[contractimpl]** es un atributo que se aplica al bloque **impl** para el struct **Contract**, indicando que este bloque contiene la implementación de funciones del contrato.
  • **impl Contract { ... }**: Este es el bloque de implementación para el struct Contract, donde se definen las funciones del contrato.
  • **pub fn hello(env: Env, to: Symbol) -> Vec<Symbol> { ... }**: Esta línea define una función pública llamada **hello**. Toma dos argumentos, **env** de tipo **Env** y "to" de tipo **Symbol**(en este caso, una cadena de hasta 8 caracteres). También especifica el tipo de retorno como **Vec<Symbol>**
  • **{ vec![&env, symbol_short!("Hello"), to] }**: Este bloque de código es donde se construye y devuelve un vector/arreglo de longitud 2 que contiene "Hello" y luego el valor pasado como "to".

Eso es todo el descanso que tenemos por hoy. ¡No te pongas gruñón conmigo! (🥁)

Ahora que el código está en el editor, compílalo haciendo clic en el botón de compilar o presionando "cmd+k"

Abre la pestaña del contrato y presiona el botón `hello()`

Pasa un valor para `to` y haz clic en el botón “llamar”

La pestaña "Consola" debería abrirse y deberías ver tu mensaje.

Comparación

Conclusión

Tanto Solidity como Soroban ofrecen la funcionalidad para declarar funciones públicas. Sin embargo, sus enfoques para el manejo de datos y la gestión del estado difieren, influenciados por sus lenguajes centrales – JavaScript para Solidity y Rust para Soroban. Solidity es ideal para aquellos familiarizados con JavaScript, mientras que la base en Rust de Soroban ofrece ventajas en concurrencia y seguridad.

Saber más

Recursos adicionales

Para los desarrolladores interesados en la transición de EVM a Soroban, tenemos una documentación completa que cubre todo desde los conceptos básicos del SDK Rust de Soroban comparado con Solidity, hasta el despliegue de tus propios contratos inteligentes con Rust. Aprende más sobre la migración desde EVM aquí.

Si estás buscando más herramientas y quieres saber más sobre el sdk, puedes consultar la documentación oficial de Soroban.

Mantente atento para más perspectivas y tutoriales en esta serie, ¡y feliz codificación en el mundo de los contratos inteligentes!

Conectar

¿Quieres aprender más?

Para saber más sobre Soroban, por favor rellena el formulario.

Loading form...