Asignador
El ejemplo de asignador demuestra cómo utilizar la función de asignador al escribir un contrato.
El crate soroban-sdk
proporciona un asignador liviano de punteros de aumento que se puede usar para emular la asignación de memoria heap en un contrato inteligente Wasm.
Ejecutar el Ejemplo
Primero, pasa por el proceso de Configuración para configurar tu entorno de desarrollo, luego clona la etiqueta v21.6.0
del repositorio soroban-examples
:
git clone -b v21.6.0 https://github.com/stellar/soroban-examples
O, salta la configuración del entorno de desarrollo y abre este ejemplo en Gitpod.
Para ejecutar las pruebas del ejemplo, navega al directorio alloc
, y usa cargo test
.
cd alloc
cargo test
Deberías ver la salida:
running 1 test
test test::test ... ok
Dependencias
Este ejemplo depende de la función alloc
en soroban-sdk
. Para incluirlo, añade "alloc" a la lista de "features" de soroban-sdk
en el archivo Cargo.toml
:
[dependencies]
soroban-sdk = { version = "20.0.0", features = ["alloc"] }
[dev_dependencies]
soroban-sdk = { version = "20.0.0", features = ["testutils", "alloc"] }
Código
#![no_std]
use soroban_sdk::{contractimpl, Env};
extern crate alloc;
#[contract]
pub struct AllocContract;
#[contractimpl]
impl AllocContract {
/// Allocates a temporary vector holding values (0..count), then computes and returns their sum.
pub fn sum(_env: Env, count: u32) -> u32 {
let mut v1 = alloc::vec![];
(0..count).for_each(|i| v1.push(i));
let mut sum = 0;
for i in v1 {
sum += i;
}
sum
}
}
Ref: https://github.com/stellar/soroban-examples/tree/v21.6.0/alloc
Cómo Funciona
extern crate alloc;
Importa el crate alloc
, que es necesario para admitir la asignación bajo no_std
. Consulta [Dialecto Rust de Contrato] para más información sobre no_std
.
let mut v1 = alloc::vec![];
Crea un arreglo contiguo y de tamaño creciente v1
con contenidos asignados en la memoria heap.
La memoria heap en el contexto de un contrato inteligente se refiere en realidad a la memoria lineal Wasm. The alloc
will use the global allocator provided by the soroban sdk to interact with the linear memory.
Usar un arreglo asignado en la memoria heap suele ser lento y costoso en términos computacionales. Intenta evitarlo y, en su lugar, usa un arreglo de tamaño fijo o soroban_sdk::vec!
siempre que sea posible.
Este es especialmente el caso para un arreglo de gran tamaño. Cada vez que el tamaño del arreglo crece más allá del tamaño actual de la memoria lineal, que es múltiplo del tamaño de la página (64KB), se invoca wasm32::memory_grow
para aumentar la memoria lineal por más páginas según sea necesario, lo cual es muy costoso en computación.
El código restante empuja valores (0..count)
a v1
, luego calcula y devuelve su suma. Este es el ejemplo más simple para ilustrar cómo utilizar el asignador.