Cómo migrar contratos inteligentes del Solidity de Ethereum al Rust de Soroban

Author

Julian Martinez

[Publishing date]

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 el SDK Rust 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 desliza por las tareas como un auto deportivo con estilo. Es super 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.
  • Dominando 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 en 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 centrales e implementaciones distintas.

En Tierra de EVM, Solidity es el lenguaje preferido para desarrollar contratos inteligentes. Aquí hay un resumen rápido para mis colegas 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 fluido e intuitivo.
  • Tipado Estático: Solidity comprueba 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 que Solidity se destaque es su papel en el poder de las transacciones descentralizadas y la gestión de cuentas de blockchain. Además, si estás cómodo con JavaScript, C++ y Python, encontrarás la sintaxis de Solidity familiar.

¿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 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 Rust de Soroban es un conjunto de herramientas específicamente para escribir contratos inteligentes en la plataforma Soroban. Construido sobre Rust, permite a los desarrolladores crear aplicaciones de finanzas descentralizadas, creadores de mercado automatizados y activos tokenizados, mientras 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 Rust de Soroban.

Solidity

Versión de 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 pausa rápida 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 Solidity mayores o iguales a 0.7.0 y menores que 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 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 **abi.encodePacked** función.
  • 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 y verás un botón “hello” abajo, ya que nuestro contrato tiene una variable de función hello que devuelve una cadena compuesta por “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 de Rust de Soroban

Abre el patio de juegos para contratos inteligentes construido 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 {
    /// Say Hello to someone or something.
    /// Returns a length-2 vector/array containing 'Hello' and then the value passed as `to`.
    pub fn hello(env: Env, to: Symbol) -> Vec<Symbol> {
        vec![&env, symbol_short!("Hello"), to]
    }
}
```

¿Ya es hora de otro corte comercial? ¡¿En serio?!

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 a la estructura Contract, designándola como el tipo al que se asocian las funciones de contrato. Implica que esta estructura tendrá funciones de contrato implementadas para ella.
  • **pub struct Contract;**define una estructura pública llamada Contract. En los contratos de Soroban, las funciones de contrato están asociadas con esta estructura.
```
#[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 la estructura **Contract**, indicando que este bloque contiene la implementación de funciones de contrato.
  • **impl Contract { ... }**: Este es el bloque de implementación para la estructura Contract, donde se definen las funciones de 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 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 de contrato y presiona el botón `hello()`

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

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

Comparación

Conclusión

Tanto Solidity como Soroban proporcionan 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 de Rust de Soroban ofrece ventajas en concurrencia y seguridad.

Aprende Más

Recursos Adicionales

Para los desarrolladores interesados en la transición de EVM a Soroban, tenemos documentación completa que cubre todo, desde los conceptos básicos del SDK de Rust de Soroban en comparación 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 aprender más sobre el sdk, puedes consultar la documentación oficial de Soroban docs.

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