WEB3DEV Español

Cover image for Implementa un contrato inteligente de almacenamiento simple en StarkNet
Juliana Cabeza
Juliana Cabeza

Posted on

Implementa un contrato inteligente de almacenamiento simple en StarkNet

StarkNet y los rollups de conocimiento cero están ganando popularidad últimamente debido a su eficiencia, por lo que es hora de aprender a desarrollar en StarkNet. Este tutorial te mostrará cómo crear un contrato inteligente simple en Cairo para guardar y recuperar una variable y, luego, desplegarlo en la red de prueba de StarkNet utilizando el framework (estructura) ProtoStar.

Puedes encontrar el proyecto con el contrato inteligente y los archivos compilados en la carpeta "protostar-project" del repositorio de GitHub.

Si deseas aprender algunos conceptos fundamentales de StarkNet, te recomiendo leer este artículo sobre la arquitectura y el entorno de StarkNet.

Un Contrato Inteligente de Cairo

Cairo es un lenguaje relativamente nuevo que permite contratos inteligentes en StarkNet; ¡vale la pena aprender más sobre ello! El contrato inteligente que vas a implementar hoy es muy similar a un contrato de almacenamiento simple con el que probablemente estés familiarizado en Solidity.

En este tutorial, escribiremos un contrato inteligente directo, pero te enseñará cómo declarar una variable, escribir una función getter y escribir una función para establecer la variable.

El Contrato Inteligente Principal

Lo primero que necesitamos, es declararlo como un contrato StarkNet e importar el paquete 'HashBuiltin'.

%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
Enter fullscreen mode Exit fullscreen mode

Como puedes notar, estamos importando un paquete, HashBuiltin es una estructura que especifica el hash de la estructura de la memoria interna. Puedes aprender más sobre este paquete en StarkNet y Cairo Docs.

En este punto, podemos continuar declarando la variable.

Declara una Variable

Al igual que en Solidity, necesitamos declarar una variable para poder utilizarla. En este ejemplo, la variable es un 'felt' llamado 'my_value_storage' donde, básicamente, podemos almacenar un número.

@storage_var
func my_value_storage() -> (my_value_storage: felt) {
}

Enter fullscreen mode Exit fullscreen mode

Las variables de almacenamiento, de forma predeterminada, no son visibles en la ABI. Son similares a las variables "private" en Solidity.

Una variable de almacenamiento puede ser leída con 'var_name.read()' o escrita con 'var_name.write()'.

Función Getter

Cuando utilizamos variables, es una buena práctica declarar una función 'getter'. Entonces, ¡también podemos agregarlo!

Un getter es una función "view" que podemos llamar para ver la variable almacenada.

@view
func get_my_stored_value{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (
    my_stored_value: felt
) {
    let (my_stored_value) = my_value_storage.read();
    return (my_stored_value,);
}


Enter fullscreen mode Exit fullscreen mode

Por ejemplo, esta función puede ser llamada desde el explorador de StarkNet y mostrar el valor almacenado.

Función para Definir la Variable

Ahora que tenemos la variable declarada, ¿cómo la modificamos?
Podríamos configurarla automáticamente, cuando el contrato se despliegue usando un 'constructor' pero, para este tutorial, quiero crear una función para ella.

Esta es una función 'external' que puede ser llamada por otro contrato inteligente (o cartera), lo que nos permite modificar esa variable.

@external
func set_my_stored_value{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(
my_value: felt,
) {
    my_value_storage.write(my_value);
    return ();
}
Enter fullscreen mode Exit fullscreen mode

Como mencionamos, en la función para establecer un valor almacenado, usamos my_value_storage.write(my_value), donde my_value es el argumento pasado a la función.

Contrato Inteligente Completo

Ahora que tenemos todas las partes separadas, podemos juntarlas. Aquí encontrarás el contrato inteligente completo, con algunos comentarios:

%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
// Almacenar una variable
// De forma predeterminada, las variables de almacenamiento no son visibles a través de la ABI. Son similares a las variables "privadas" de Solidity
// Esta variable es un felt y se llama my_value_storage
// En un contrato inteligente, se puede leer con my_value_storage.read() o escribir con my_value_storage.write()
@storage_var
func my_value_storage() -> (my_value_storage: felt) {
}
// Declarando getters
// Las variables públicas deben ser declaradas explícitamente con un getter
// Función para devolver el valor de la variable
@view
func get_my_stored_value{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (
    my_stored_value: felt
) {
    let (my_stored_value) = my_value_storage.read();
    return (my_stored_value,);
}
// Establezca el valor de la variable
@external
func set_my_stored_value{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(
my_value: felt,
) {
    my_value_storage.write(my_value);
    return ();
}

Enter fullscreen mode Exit fullscreen mode

Un Proyecto Protostar

Para este ejemplo, usaremos Protostar, uno de los frameworks de Starknet.

Lo primero, instala Protostar.

Toma en cuenta que Protostar solo es compatible con Linux y macOS.

Inicializar un Proyecto Protostar

Después de instalar Protostar, crearemos un proyecto usando el siguiente comando:

protostar init store-variable
Enter fullscreen mode Exit fullscreen mode

Donde store-variable es el nombre del proyecto.

El resultado de ejecutar protostar init es un archivo de configuración llamado protostar.toml, archivos de ejemplo y los siguientes 3 directorios:

  • src: Un directorio para tu código.
  • lib: Un directorio estándar para dependencias externas.
  • tests: Un directorio que almacena pruebas.

El archivo protostar.toml es el archivo de configuración donde especificamos la ruta para nuestros contratos. En este caso, ya tendrás un ejemplo de archivo cairo.main.

En este caso, generaremos un contrato llamado "main" a partir de nuestra carpeta "src".

["protostar.contracts"]
main = [
    "src/main.cairo",
]
Enter fullscreen mode Exit fullscreen mode

Simplemente elimina el código de ejemplo y pega el código de nuestro contrato inteligente.

Compila el contrato inteligente de Cairo

Hemos inicializado un proyecto Protostar y hay un contrato inteligente de Cairo en la carpeta src; estamos listos para compilar.

En el directorio principal del proyecto, ejecuta el siguiente comando para compilar.

protostar build
Enter fullscreen mode Exit fullscreen mode

Recibirás un mensaje de éxito si el contrato se compila correctamente.

16:23:13 [INFO] Built the project successfully                                                                                                             
16:23:14 [INFO] Execution time: 2.96 s
Enter fullscreen mode Exit fullscreen mode

Después de compilar el contrato, notarás que hay un directorio "build" en el proyecto, donde podrás encontrar la ABI del contrato y el contrato compilado como "main.json".

Despliega el Contrato Inteligente en la Red de Pruebas de StarkNet

Después que el contrato inteligente haya sido compilado, finalmente podemos usar Protostar para desplegarlo en la red de pruebas de StarkNet.

Utiliza el siguiente comando para desplegar el contrato compilado.

protostar deploy ./build/main.json --network testnet

Enter fullscreen mode Exit fullscreen mode

El resultado mostrará el hash de la transacción y la dirección del contrato, además proporcionará un enlace al contrato inteligente en el explorador Voyager.

[INFO] Deploy transaction was sent.
Contract address: 0x06a5ea9e42c921bd58e24b8da9d1fc91a488df0700b173f1c6bb0e453f68afec
Transaction hash: 0x1cbba90ba0d1fbfba09b1f7a0f987134dd9a02a845ca89244b3272374d37ede
https://goerli.voyager.online/contract/0x06a5ea9e42c921bd58e24b8da9d1fc91a488df0700b173f1c6bb0e453f68afec

Enter fullscreen mode Exit fullscreen mode

Interactuar con el Contrato Desplegado

Ahora que el contrato inteligente ha sido desplegado en la red de pruebas de StarkNet, puedes utilizar el explorador Voyager para interactuar con él.

Si aún necesitas desplegar tu propio contrato, puedes utilizar el contrato inteligente que hemos desplegado.

Utiliza la pestaña "Read Contract" para llamar a la función "view" y ver el valor almacenado.

Image description

A continuación, puedes utilizar la pestaña "Write Contract" para llamar a la función "external" y modificar el valor.

Image description

Al escribir en un contrato, lo cual cambia el estado de la red, deberás autorizar la transacción. Recuerda conectar tu cartera al explorador Voyager y tener algo de ETH de prueba.

Puedes obtener algo de ETH Goerli en la L2 del grifo de StarkNet.

Conclusión

¡Felicitaciones por completar este tutorial! Hoy has aprendido a escribir y desplegar un contrato inteligente simple en Cairo.

No dudes en revisar nuestra serie "StarkNet Odyssey" para obtener más información sobre Cairo y otras herramientas de desarrollo disponibles.

¿Has explorado lo que puedes lograr con Chainstack? Comienza hoy mismo de forma gratuita.

Artículo escrito por Davide Zambiasi. Traducido por Juliana Cabeza.

Discussion (0)