counter
Ejemplo de un contador
Para crear el contrato ejecutamos lo siguiente:
stellar contract init counter --name counter
Dentro de la carpeta counter, en el archivo lib.rs borramos todo el código y ponemos el siguiente código:
#![no_std]
use soroban_sdk::{contract, contractimpl, Env, Symbol, symbol_short, log};
const COUNTER: Symbol = symbol_short!("COUNTER");
#[contract]
pub struct CounterContract;
#[contractimpl]
impl CounterContract {
pub fn add_to_counter(env: Env, increment: u32) {
let mut count: u32 = env.storage().instance().get(&COUNTER).unwrap_or(0);
log!(&env, "current count: {}", count);
count += increment;
env.storage().instance().set(&COUNTER, &count);
env.storage().instance().extend_ttl(50, 100);
}
pub fn inc_counter(env: Env) {
let mut count: u32 = env.storage().instance().get(&COUNTER).unwrap_or(0);
count += 1;
env.storage().instance().set(&COUNTER, &count);
env.storage().instance().extend_ttl(50, 100);
}
pub fn get_counter(env: Env) -> u32 {
let count: u32 = env.storage().instance().get(&COUNTER).unwrap_or(0);
count
}
}
Básicamente es un contrato con un contador y 3 funciones:
add_to_counter: Adiciona un numero al contador.
inc_counter: Incrementa en 1 el contador.
get_counter: Obtiene el contador actual.
Análisis del código:
Importaciones del SDK de Soroban
use soroban_sdk::{contract, contractimpl, Env, Symbol,symbol_short };
Symbol y symbol_short: Se usan para trabajar con identificadores cortos y optimizados en el entorno de Soroban.
Symbol Es un string de 32 caracteres, viene ocupa 64 bit (a-z A-Z 0-9)
symbol_short! Es un string de 9 caracteres (a-z A-Z 0- 9)
log: Muy parecido al log de javascript, se imprime por consola mensajes y contenido de variables
🛠 Explicación de las funciones
Todas las funciones trabajan con env: Env
, que proporciona acceso al almacenamiento y otras funcionalidades del entorno Soroban.
1️⃣ add_to_counter(env: Env, increment: u32)
add_to_counter(env: Env, increment: u32)
✅ Suma un número arbitrario al contador.
📌 Paso a paso:
Recupera el valor actual de
COUNTER
desde el almacenamiento, usando.unwrap_or(0)
, lo que garantiza que si la clave no existe, se toma como 0.Suma el
increment
recibido como parámetro.Guarda el nuevo valor en el almacenamiento.
Extiende el Time-To-Live (TTL) de la clave en el almacenamiento (de 50 a 100 bloques).
2️⃣ inc_counter(env: Env)
inc_counter(env: Env)
✅ Incrementa el contador en 1.
📌 Paso a paso:
Esta función es similar a add_to_counter
, pero en lugar de recibir un parámetro, simplemente suma 1
al contador.
3️⃣ get_counter(env: Env) -> u32
get_counter(env: Env) -> u32
✅ Devuelve el valor actual del contador.
📌 Paso a paso:
Recupera el valor de
COUNTER
del almacenamiento.Si la clave no existe, devuelve
0
.Retorna el valor del contador.
📌 Resumen
Este contrato mantiene un contador en la blockchain de Soroban con:
add_to_counter()
: Incrementa el contador en un valor específico.inc_counter()
: Incrementa el contador en 1.get_counter()
: Obtiene el valor actual del contador.
Compilación del contrato:
Stellar contract build
Despliegue del contratro
Para Mac y Linux el salto de línea es con el carácter " \" y en Windows con el carácter " ´ "
Reemplaze el simbolo * por el respectivo carácter de salto de linea a su sistema operativo.
stellar contract deploy *
--wasm target/wasm32-unknown-unknown/release/counter.wasm *
--source developer *
--network testnet *
--alias counter

Pruebas del contratro
Para linux y Mac el salto de línea de la instrucción es con el carácter " \ " para Windows con el carácter " ` "
Invocación de la función add_to_counter
stellar contract invoke *
--id CARAAZHSZ5RYZDEPQ6GVNQKMQFQMAJRGP4I5KXSSW2NOGKA5EWAOTX7W *
--source developer *
--network testnet *
-- *
add_to_counter *
--increment 200

Invocación de la función inc_counter
stellar contract invoke *
--id CARAAZHSZ5RYZDEPQ6GVNQKMQFQMAJRGP4I5KXSSW2NOGKA5EWAOTX7W *
--source developer *
--network testnet *
-- *
inc_counter

Invocación de la función get_counter
stellar contract invoke *
--id CARAAZHSZ5RYZDEPQ6GVNQKMQFQMAJRGP4I5KXSSW2NOGKA5EWAOTX7W *
--source developer *
--network testnet *
-- *
get_counter

Last updated
Was this helpful?