3分钟Solidity: 9.7 写入任意槽位

18 阅读1分钟

欢迎订阅专栏3分钟Solidity--智能合约--Web3区块链技术必学

如需获取本内容的最新版本,请参见 Cyfrin.io 上的“写入任意槽位(代码示例)”

Solidity 存储就像一个长度为 2^256 的数组。数组中的每个槽位可以存储 32 字节。

状态变量的声明顺序和类型决定了它将使用哪些槽位。

不过,使用汇编语言时,你可以向任何槽位写入数据。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

library StorageSlot {
    // 将地址包装在一个结构体中,以便可以将其作为存储指针传递
    struct AddressSlot {
        address value;
    }

    function getAddressSlot(bytes32 slot)
        internal
        pure
        returns (AddressSlot storage pointer)
    {
        assembly {
            // 获取存储在插槽中的AddressSlot指针
            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;
    }
}

Remix Lite 尝试一下