سالیدیفا

چطور داده هامون رو تو اسلات مورد نظر ذخیره کنیم؟

storage

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

منبع