eth_getStorageAt
返回指定地址的特定存储位置的值。
API请求
POST https://<network>.infura.io/v3/YOUR-PROJECT-ID
请求头:
Content-Type: application/json
请求参数:
- ADDRESS:要查询的地址,必需
- STORAGE POSITION:存储位置,必需
- BLOCK PARAMETER :区块编号,或者字符串标签 "latest"、"earliest" 、 "pending"
请求示例:
JSON-RPC over HTTPS POST:
curl https://mainnet.infura.io/v3/YOUR-PROJECT-ID \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getStorageAt","params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"],"id":1}'
JSON-RPC over websockets:
wscat -c wss://mainnet.infura.io/ws/v3/YOUR-PROJECT-ID
>{"jsonrpc":"2.0","method":"eth_getStorageAt","params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"],"id":1}
API响应
返回指定位置的存储的值。
响应结果示例:
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
存储位置的计算
要正确计算存储位置,依赖于要提取的存储。考虑下面部署在0x295a70b2de5e3953354a6a8344e616ed314d7251 地址的合约,使用地址0x391694e7e0b0cce554cb130d723a9d27458f9298:
contract Storage {
uint pos0;
mapping(address => uint) pos1;
function Storage() {
pos0 = 1234;
pos1[msg.sender] = 5678;
}
}
提取pos0很直接:
curl https://mainnet.infura.io/v3/YOUR-PROJECT-ID \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "0x65a8db"], "id": 1}'
响应结果:
{
"jsonrpc":"2.0",
"id":1,
"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"
}
要提取映射表中的元素比较困难。映射表中的某个元素的位置计算如下:
keccak(LeftPad32(key, 0), LeftPad32(map position, 0))
这意味着要提取存储位置pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"]的值,我们需要如下计算:
keccak(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"))
geth控制台中内置的web3库可以用来计算:
> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
undefined
> web3.sha3(key, {"encoding": "hex"})
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"
现在查询该位置的值:
curl https://mainnet.infura.io/v3/YOUR-PROJECT-ID \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "0x65a8db"], "id": 1}'
响应结果如下:
{
"jsonrpc":"2.0",
"id":1,
"result":"0x000000000000000000000000000000000000000000000000000000000000162e"
}