Solidity Storage Values Analysis
Last modified: 2023-10-02
Data Byte Sizes
Reference: https://tomatosauce.jp/datatype-bytesize/
In Solidity, each data type has the following size:
Type | Bytes |
---|---|
bool | 1 |
bytes1 | 1 |
bytes8 | 8 |
bytes16 | 16 |
bytes32 | 32 |
address | 20 |
contract | 20 |
uint8/int8 | 1 |
uint16/int16 | 2 |
uint32/int32 | 4 |
uint64/int64 | 8 |
uint128/int128 | 16 |
uint256/int256 | 32 |
Access Storage Slot Values
Reference: https://coinsbench.com/12-privacy-ethernaut-explained-8ee480f303f2
Below is the Solidity contract example.
The Solidity’s each slot can store data until 32 bytes. For example below, the ‘Slot 2’ stores multiple variables because each value is just 1 byte, which are 2 bytes in total so less than 32 bytes.
contract Example {
// Slot 0 (1 byte)
bool public isOk = false;
// Slot 1 (32 bytes)
uint public money = 100;
// Slot 2 (1 byte)
uint8 private score = 10;
// Slot 2 (1 byte)
uint8 private quantity = 5;
// Slot 3, 4, 5 (32 bytes for each element of array)
bytes32[3] private data;
}
Using Web3.js, we can get values of the above variables from outside.
// Access slot 0
web3.eth.getStorageAt(contract.address, 0);
// Access slot 1
web3.eth.getStorageAt(contract.address, 1);
// Access slot 2
web3.eth.getStorageAt(contract.address, 2);
// Access slot 3 (data[0])
web3.eth.getStorageAt(contract.address, 3);
// Access slot 4 (data[1])
web3.eth.getStorageAt(contract.address, 4);
// Access stlo 5 (data[2])
web3.eth.getStorageAt(contract.address, 5);
// Proxy storage slot (0x123...)
web3.eth.storageAt(contract.address, "0x123...");
Display Values
There are methods to see the storage slot values in appropriate format.
const slotValue = await web3.eth.getStorageAt(contract.address, 0);
// for string value
web3.utils.toAscii(slotValue);