eth_getStorageAt
Returns the value from a storage position at a given address.

REQUEST

1
POST https://<network>.infura.io/v3/YOUR-PROJECT-ID
Copied!

HEADERS

1
Content-Type: application/json
Copied!

REQUEST PARAMS

  • ADDRESS [required] - a string representing the address (20 bytes) of the storage
  • STORAGE POSITION [required] - a hex code of the position in the storage
  • BLOCK PARAMETER [required] - hexadecimal block number, or the string "latest", "earliest" or "pending".

EXAMPLE

1
## JSON-RPC over HTTPS POST
2
## Replace YOUR-PROJECT-ID with a Project ID from your Infura Dashboard
3
## You can also replace mainnet with a different supported network
4
curl https://mainnet.infura.io/v3/YOUR-PROJECT-ID \
5
-X POST \
6
-H "Content-Type: application/json" \
7
-d '{"jsonrpc":"2.0","method":"eth_getStorageAt","params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"],"id":1}'
8
9
## JSON-RPC over WSS
10
## Replace YOUR-PROJECT-ID with a Project ID from your Infura Dashboard
11
## You can also replace mainnet with a different supported network
12
wscat -c wss://mainnet.infura.io/ws/v3/YOUR-PROJECT-ID
13
>{"jsonrpc":"2.0","method":"eth_getStorageAt","params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"],"id":1}
Copied!

RESPONSE

RESULT FIELDS

  • STORAGE VALUE - a hex code of the integer indicating the value of the storage position at the provided address

BODY

1
{
2
"jsonrpc": "2.0",
3
"id": 1,
4
"result": "0x0000000000000000000000000000000000000000000000000000000000000000"
5
}
Copied!
Calculating the correct position depends on the storage to retrieve. Consider the following contract deployed at 0x295a70b2de5e3953354a6a8344e616ed314d7251 by address 0x391694e7e0b0cce554cb130d723a9d27458f9298,
1
contract Storage {
2
uint pos0;
3
mapping(address => uint) pos1;
4
5
function Storage() {
6
pos0 = 1234;
7
pos1[msg.sender] = 5678;
8
}
9
}
Copied!
Retrieving the value of pos0 is straight forward:
1
curl https://mainnet.infura.io/v3/YOUR-PROJECT-ID \
2
-X POST \
3
-H "Content-Type: application/json" \
4
-d '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "0x65a8db"], "id": 1}'
Copied!
1
{
2
"jsonrpc": "2.0",
3
"id": 1,
4
"result": "0x00000000000000000000000000000000000000000000000000000000000004d2"
5
}
Copied!
Retrieving an element of the map is harder. The position of an element in the map is calculated with:
1
keccak(LeftPad32(key, 0), LeftPad32(map position, 0))
Copied!
This means to retrieve the storage on pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] we need to calculate the position with:
1
keccak(
2
decodeHex(
3
'000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298' +
4
'0000000000000000000000000000000000000000000000000000000000000001'
5
)
6
);
Copied!
The geth console which comes with the web3 library can be used to make the calculation:
1
> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
2
undefined
3
> web3.sha3(key, {"encoding": "hex"})
4
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"
Copied!
Now to fetch the storage:
1
curl https://mainnet.infura.io/v3/YOUR-PROJECT-ID \
2
-X POST \
3
-H "Content-Type: application/json" \
4
-d '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"], "id": 1}'
Copied!
1
{
2
"jsonrpc": "2.0",
3
"id": 1,
4
"result": "0x000000000000000000000000000000000000000000000000000000000000162e"
5
}
Copied!
Copy link