Gravar em qualquer slot
WEB3DEV Team
# Gravar em qualquer slot
O armazenamento de solidity é como um array de comprimento 2256. Cada slot no array 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.20;
library StorageSlot {
// Envolver o endereço numa estrutura para que possa ser passado como um ponteiro de armazenamento
struct AddressSlot {
address value;
}
function getAddressSlot(
bytes32 slot
) internal pure returns (AddressSlot storage pointer) {
assembly {
// Obtém o ponteiro para AddressSlot armazenado na slot
pointer.slot := slot
}
}
}
contract TestSlot {
bytes32 public constant TEST_SLOT = keccak256("TEST_SLOT");
function write(address _addr) external {
StorageSlot.AddressSlot storage data = StorageSlot.getAddressSlot(TEST_SLOT);
data.value = _addr;
}
function get() external view returns (address) {
StorageSlot.AddressSlot storage data = StorageSlot.getAddressSlot(TEST_SLOT);
return data.value;
}
}