欢迎订阅专栏: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 尝试一下