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());