Como gravar dados em qualquer slot

porMatheusem09/06/2022

Nesse artigo iremos aprender a como gravar dados em qualquer slot do storage da blockchain através de um contrato inteligente.

Gravar dados em qualquer slot

O armazenamento do Solidity é como uma array de comprimento 2^256. Cada slot na matriz pode armazenar 32 bytes.

As variáveis de estado definem quais slots serão usados para armazenar dados.

No entanto, usando assembly, você pode gravar em qualquer slot.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Storage {
struct MyStruct {
uint value;
}
// struct armazenado no slot 0
MyStruct public s0 = MyStruct(123);
// struct armazenado no slot 1
MyStruct public s1 = MyStruct(456);
// struct armazenado no slot 2
MyStruct public s2 = MyStruct(789);
function _get(uint i) internal pure returns (MyStruct storage s) {
// obter struct armazenado no slot i
assembly {
s.slot := i
}
}
/*
get(0) returns 123
get(1) returns 456
get(2) returns 789
*/
function get(uint i) external view returns (uint) {
// obter valor dentro do MyStruct armazenado no slot i
return _get(i).value;
}
/*
Podemos salvar dados em qualquer slot, incluindo o slot 999, que normalmente é inacessível.
set(999) = 888
*/
function set(uint i, uint x) external {
// defina o valor de MyStruct para x e armazene-o no slot i
_get(i).value = x;
}
}

Testar no Remix