فضای ذخیره سازی تو سالیدیتی شبیه یه آرایه به طول 2^256 ه که هر اسلات اون میتونه 32 بایت دیتا رو تو خودش جا بده. ترتیب پر شدن اسلات ها به طور پیش فرض به ترتیب تعریف شدن متغیر ها و نوعشان تعیین می شه. اما با استفاده از کد اسمبلی میتونیم تو هر اسلاتی که خواستیم دیتا ذخیره کنیم.
این یه نمونه کد برای این کاره:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
library StorageSlot {
// Wrap address in a struct so that it can be passed around as a storage pointer
struct AddressSlot {
address value;
}
function getAddressSlot(
bytes32 slot
) internal pure returns (AddressSlot storage pointer) {
assembly {
// Get the pointer to AddressSlot stored at 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;
}
}