Persistência de dados
Até agora evitamos criar variáveis no contrato, isso porque a máquina virtual trabalha em um contexto isolado. Tudo que acontece no médoto vai ser excluído após sua execução. Para persistir dados nós utilizamos objetos que fazem a interface do contrato com a blockchain.
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());
Neste exemplo o a única variável que é possível de ser alterada é a value1
pois é uma instancia do StorageValue. Ela também só pode ser alterada pelo WRITE, método com @view
é descartado todas as alterações.
Há três tipos de váriáveis armazenáveis:
- StorageValue: Armazenamento de uma váriável do tipo
any
- StorageMap: Equivalente ao
Map()
do javascript - StorageList: Armazenamento de listas
Exemplo StorageValue:
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());
Exemplo 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());
Exemplo 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());
Também é possível criar tipos compostos por exemplo um 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());