Web3
Smartcontracts
Persistencia de Datos

Persistencia de Datos

Hasta ahora hemos evitado crear variables en el contrato, porque la máquina virtual trabaja en un contexto aislado. Todo lo que suceda en el método será borrado después de su ejecución. Para conservar los datos, utilizamos objetos que interconectan el contrato con la cadena de bloques.

import BywiseUtils, { StorageValue } from 'bywise-utils.js';
 
class HelloWorldContract {
 
    value1 = new StorageValue('some text');
    value2 = "some text";
 
    setValue1(newValue) {
        this.value1.set(newValue);
    }
 
    getValue1() { // @view
        return this.value1.get();
    }
 
    setValue1InReadMethod(newValue) { // @view
        this.value1.set(newValue);
    }
 
    setValue2(newValue) {
        this.value2 = newValue;
    }
 
    getValue2() { // @view
        return this.value2;
    }
 
    setValue2InReadMethod(newValue) { // @view
        this.value2 = newValue;
    }
}
 
BywiseUtils.exportContract(new HelloWorldContract());

En este ejemplo, la única variable que se puede cambiar es value1 porque es una instancia de StorageValue. También solo se puede cambiar mediante WRITE, el método con @view descarta todos los cambios.

Hay tres tipos de variables almacenables:

  • StorageValue: Almacenamiento de una variable de tipo any
  • StorageMap: Equivalente a javascript Map()
  • StorageList: lista de almacenamiento

Ejemplo de valor de almacenamiento:

import BywiseUtils, { StorageValue } from 'bywise-utils.js';
 
class StorageContract {
 
    value = new StorageValue('');
 
    setValue(newValue) {
        this.value.set(newValue);
    }
 
    getValue() { // @view
        return this.value.get();
    }
}
 
BywiseUtils.exportContract(new StorageContract());

Ejemplo StorageMap:

import BywiseUtils, { StorageMap } from 'bywise-utils.js';
 
class StorageContract {
 
    value = new StorageMap('some default value');
 
    setValue(key, newValue) {
        this.value.set(key, newValue);
    }
 
    hasValue(key) { // @view
        return this.value.has(key) ? 'Yes' : 'No';
    }
 
    getValue(key) { // @view
        return this.value.get(key);
    }
 
    delValue(key) {
        this.value.del(key);
    }
}
 
BywiseUtils.exportContract(new StorageContract());

Ejemplo StorageList:

import BywiseUtils, { StorageList } from 'bywise-utils.js';
 
class StorageContract {
 
    value = new StorageList();
 
    pushValue( newValue) {
        this.value.push(newValue);
    }
 
    popValue() {
        return this.value.pop();
    }
 
    setValue(index, newValue) {
        this.value.set(index, newValue);
    }
 
    size() { // @view
        return this.value.size();
    }
 
    getValue(index) { // @view
        return this.value.get(index);
    }
}
 
BywiseUtils.exportContract(new StorageContract());

También es posible crear tipos compuestos, por ejemplo, un mapa de listas:

import BywiseUtils, { StorageMap, StorageList } from 'bywise-utils.js';
 
class StorageContract {
 
    map = new StorageMap();
 
    pushValueByKey(key, newValue) {
        if (!this.map.has(key)) {
            this.map.set(key, new StorageList());
        }
        this.map.getStorageList(key).push(newValue);
    }
 
    getSizeByKey(key) { // @view
        if (!this.map.has(key)) {
            return '0'
        }
        return this.map.getStorageList(key).size();
    }
}
 
BywiseUtils.exportContract(new StorageContract());