Các biến storage được Solidity lưu liên tiếp ở trong các khe lưu trữ (slot). Có tổng cộng khe lưu trữ, mỗi khe lưu trữ có kích thước 32 byte và được đánh số từ 0 đến .
Xét ví dụ sau:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract StorageLayout {
uint256 x = 1; // slot 0
uint256 y = 2; // slot 1
uint256 z = 3; // slot 2
}Do mỗi biến x, y và z đều có kích thước là 32 byte nên chúng được lưu trong từng slot riêng biệt.
Trong trường hợp kích thước của các biến là nhỏ và vừa đủ một slot, chúng sẽ được đặt cạnh nhau. Ví dụ:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
// contract address: 0xeBa088B4182EC4261FA4fd2526F58995Dc1Ec117
contract StorageLayout {
uint16 x = 1;
uint16 y = 2;
uint16 z = 3;
}Khi dùng hàm web3.eth.getStorageAt(contractAddress, slotPosition) của thư viện web3.js để truy vấn giá trị được lưu ở slot 0, ta thu được giá trị sau:
slot[0] = 0x0000000000000000000000000000000000000000000000000000000300020001Có thể thấy, ba biến x, y và z được đặt cạnh nhau. Ngoài ra, giá trị lưu ở slot 0 cũng được ABI-encode @abi-specification bằng cách đệm thêm các số 0.
Trong trường hợp các biến không thể lưu vừa trong một slot, chúng sẽ được lưu vào nhiều slot. Ví dụ:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract StorageLayout {
uint16 x = 1;
uint256 y = 2;
uint16 z = 3;
}Giá trị của các biến lưu trong các slot là:
slot[0] = 0x0000000000000000000000000000000000000000000000000000000000000001
slot[1] = 0x0000000000000000000000000000000000000000000000000000000000000002
slot[2] = 0x0000000000000000000000000000000000000000000000000000000000000003