فضای ذخیره سازی در سالیدیتی مثل یک آرایه به طول 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;
}
}