Saltar al contenido principal

Usar almacenamiento de instancia en un contrato

Bajo el capó, el almacenamiento de instancia es exactamente como el almacenamiento persistente. La única diferencia es que cualquier cosa almacenada en el almacenamiento de instancia tiene un TTL de archivo que está vinculado a la instancia del contrato en sí. Así que, si un contrato está en vivo y disponible, el almacenamiento de instancia está garantizado a estarlo también.

El almacenamiento de instancia es realmente útil para los datos globales del contrato que son compartidos entre todos los usuarios del contrato (administrador del token, por ejemplo). Del contrato de ejemplo del token, las funciones auxiliares para establecer y recuperar la dirección del administrador son básicamente solo envolturas que rodean la entrada de ledger de Admin.

advertencia

Se debe notar que cada pieza de datos almacenada en instance() almacenamiento es recuperada del ledger cada vez que se invoca el contrato. Incluso si la función invocada no interactúa con ningún dato de ledger en absoluto. Esto puede llevar a invocaciones de función más costosas (computacionalmente y financieramente) si los datos almacenados crecen con el tiempo. Elige con juicio qué partes de datos realmente pertenecen al almacenamiento de instancia, y cuáles deben mantenerse en el almacenamiento persistente.

pub fn has_administrator(e: &Env) -> bool {
let key = DataKey::Admin;
e.storage().instance().has(&key)
}

pub fn read_administrator(e: &Env) -> Address {
let key = DataKey::Admin;
e.storage().instance().get(&key).unwrap()
}

pub fn write_administrator(e: &Env, id: &Address) {
let key = DataKey::Admin;
e.storage().instance().set(&key, id);
}