Gravar em qualquer slot

# 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;
    }
}

# Teste no Remix

Last Updated: 23/01/2024 16:25:48