Web3
Smartcontracts
Persistência de dados

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