Author
Julian Martinez
[Publishing date]
Rust v. 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é:
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?
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:
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:
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?
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
Crearemos dos contratos "Hola Mundo": primero en Solidity, luego usando el SDK Rust de Soroban.
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
```
// 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){
```
```
string memory greeting = string(abi.encodePacked("hello ", to));
```
Dentro de la función "hello", se declara una nueva variable de cadena "greeting".
**abi.encodePacked** función.```
return greeting;
```
Finalmente, la función devuelve la cadena "greeting" como resultado de la llamada a la función.
Solidity
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
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_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};
```
**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
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
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!








