arrow-left

All pages
gitbookPowered by GitBook
1 of 1

Loading...

counter

Ejemplo de un contador

Para crear el contrato ejecutamos lo siguiente:

Dentro de la carpeta counter, en el archivo lib.rs borramos todo el código y ponemos el siguiente código:

Básicamente es un contrato con un contador y 3 funciones:

hashtag
Análisis del código:

Importaciones del SDK de Soroban

  • 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)

hashtag
🛠 Explicación de las funciones

Todas las funciones trabajan con env: Env, que proporciona acceso al almacenamiento y otras funcionalidades del entorno Soroban.

hashtag
1️⃣ add_to_counter(env: Env, increment: u32)

✅ Suma un número arbitrario al contador.

📌 Paso a paso:

  1. 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.

  2. Suma el increment recibido como parámetro.

  3. Guarda el nuevo valor en el almacenamiento.


hashtag
2️⃣ 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.


hashtag
3️⃣ get_counter(env: Env) -> u32

✅ Devuelve el valor actual del contador.

📌 Paso a paso:

  1. Recupera el valor de COUNTER del almacenamiento.

  2. Si la clave no existe, devuelve 0.

  3. Retorna el valor del contador.


hashtag
📌 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:

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.

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

Invocación de la función inc_counter

Invocación de la función get_counter

stellar contract init  counter --name counter
#![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
    }
}
add_to_counter: Adiciona un numero al contador.
inc_counter: Incrementa en 1 el contador.
get_counter: Obtiene el contador actual.

log: Muy parecido al log de javascript, se imprime por consola mensajes y contenido de variables

Extiende el Time-To-Live (TTL) de la clave en el almacenamiento (de 50 a 100 bloques).

use soroban_sdk::{contract, contractimpl, Env, Symbol,symbol_short };
Stellar contract build
stellar contract deploy *
  --wasm target/wasm32-unknown-unknown/release/counter.wasm *
  --source developer *
  --network testnet *
  --alias counter
  
  
stellar contract invoke *
  --id CARAAZHSZ5RYZDEPQ6GVNQKMQFQMAJRGP4I5KXSSW2NOGKA5EWAOTX7W *
  --source developer *
  --network testnet *
  -- *
    add_to_counter *
  --increment 200
stellar contract invoke *
  --id CARAAZHSZ5RYZDEPQ6GVNQKMQFQMAJRGP4I5KXSSW2NOGKA5EWAOTX7W *
  --source developer *
  --network testnet *
  -- *
    inc_counter
stellar contract invoke *
  --id CARAAZHSZ5RYZDEPQ6GVNQKMQFQMAJRGP4I5KXSSW2NOGKA5EWAOTX7W *
  --source developer *
  --network testnet *
  -- *
    get_counter