EVM Storage Layout
Storage is a persistent storage space that can be read, written, and modified. It is also a place where each contract stores data persistently. Storage is a huge map, with a total of 2^256 slots, and one slot has 32 bytes.
Storage Layout
Bytes and String
1 | contract StorageBytes { |
The bytes is allocated a storage slot.
For bytes private valBytes; this is storage[0]
the length less than 32
the length greater than 31
Arrays
1 | contract StorageArrays { |
- Values for (uint256[] private arrayUint256;) are stored at locations:
storage[keccak256(storage slot number)+key] = value
- The number of elements in the dynamic array is stored at storage[storage slot number]
Mappings
1 | contract StorageMappings { |
- Values for (mapping(uint256 => uint256) private map;) are stored at locations:
storage[keccak256(key . storage slot number)] = value
Nothing is stored at storage[storage slot number]
Mapping of Mapping, Array of Arrays, Arrays of Mappings, Mappings of Arrays. The rules for working out storage locations are applied recursively for more complex structures
1 | contract C { |
data[4][9].b
is at
keccak256(uint256(9) . keccak256(uint256(4) . uint256(1))) + 1