eth_getStorageAt
与えられたアドレスのストレージ位置の値を返します。
パラメータ
1. DATA
20バイト
ストレージのアドレス
2. QUANTITY
ストレージ位置の整数値
3. QUANTITY|TAG
ブロック番号の整数値
または、以下のいずれかの文字列
"latest"
"earliest"
"pending"
戻り値
DATA
ストレージ位置の値
サンプル
正しい位置を計算する方法は取得するストレージに依存します。
以下の、アドレス 0x391694e7e0b0cce554cb130d723a9d27458f9298 によって 0x295a70b2de5e3953354a6a8344e616ed314d7251 にデプロイしたコントラクトについて考えます。
code:example.sol
contract Storage {
uint pos0;
mapping(address => uint) pos1;
function Storage() {
pos0 = 1234;
}
}
pos0 の値を取得する方法は簡単です。
code:example.sh
{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"}
マップ内の要素を取得する方法はより困難です。
マップ内の要素の位置は次のように計算することができます。
keccack(LeftPad32(key, 0), LeftPad32(map position, 0))
これは、pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] のストレージを取得することを意味します。
位置をつぎのように計算する必要があります。
keccak(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"))
geth コンソールに付属のweb3ライブラリを使用すると、つぎのように計算することができます。
code:example2.sh
var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
undefined
web3.sha3(key, {"encoding": "hex"})
"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"
これで、ストレージをフェッチすることができます。
code:example3.sh
{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"}
Infura を使用したサンプル
GET
code:infura_example_get.sh
POST
code:infura_example_post.sh
-X POST \
-H "Content-Type: application/json" \
RESPONSE
code:infura_response.sh
{"jsonrpc":"2.0","id":1,"result":"0x0000000000000000000000000000000000000000000000000000000000000000"}
動作サンプル
code:demo.js
.then((response) => {
console.log(response)
$(document.body).append('<textarea cols="100" rows="30">' + JSON.stringify(response, null, '\t') + '</textarea>')
})
参考