Autor
Julian Martinez
Fecha de publicación
Desarrolladores
Contratos Inteligentes
Rust vs. 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é:
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?
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 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:
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?
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
Crearemos dos contratos "Hola Mundo": primero en Solidity, luego usando el SDK de 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 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){
```
```
string memory greeting = string(abi.encodePacked("hello ", to));
```
Dentro de la función "hello", se declara una nueva variable de cadena "greeting".
**abi.encodePacked**
.```
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 "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
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_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};
```
**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
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
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!