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

Autor

Julian Martinez

Fecha de publicación

Desarrolladores

Contratos Inteligentes

Rust vs. 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 de 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 avanza a través de las tareas como un coche deportivo con estilo. Es super rápido, incluso superando a C++ en cuanto a velocidad y eficiencia para que tus operaciones de blockchain no solo sean rápidas sino que también ahorren en recursos informáticos.
  • Seguridad de Tipo: Imagina el sistema de tipos de Rust como un inspector meticuloso, que está observando cada bit de tu código en el momento de la 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 conduce 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 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 usar aspectos de la tecnología de Ethereum, a menudo tienen protocolos e implementaciones centrales distintas.

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

  • 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 complicados 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 el momento de la 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 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 baterías incluidas y amigable para el desarrollador.

Aunque funciona muy bien con Stellar siendo 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 de Soroban. Construido sobre 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 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 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 "Solidity Compiler" debajo del icono de “File Explorer”.

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

Una vez compilado con éxito haz clic en el icono debajo de “Solidity Compiler” que es “Deploy & Run Transactions”.

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

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 con el verdadero McCoy!

Soroban

Versión del SDK de Rust de Soroban

Abre el entorno de pruebas 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 {
    /// Di Hola a alguien o algo.
    /// Devuelve un vector/array 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 utiliza 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 es adecuada para el despliegue en blockchains.

```
use soroban_sdk::{contract, contractimpl, symbol_short, vec, Env, Symbol, Vec};
```
  • La palabra **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 **soroban_sdk** módulo, 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 que 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 las 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/array 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 de contrato y presiona el botón `hello()`

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

La pestaña "Console" 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.

Saber 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 comparado con Solidity, hasta el despliegue de tus propios contratos inteligentes con Rust. Saber 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 insights y tutoriales en esta serie, ¡y feliz codificación en el mundo de los contratos inteligentes!