Go-Ethereum
web3.eth.getStorageAt 用於映射
如何獲得合約映射儲存?
考慮到這個簡單的契約
contract Currency{ mapping(address=>uint) public balances; function deposit(){ balances[tx.origin]++; } }
部署並呼叫存款後,我想獲得合約儲存
eth.getStorageAt("0x681afcc842a1a01f34ffb2c091e576aa78175d55",0)
但總是得到相同的結果:0x0000000000000000000000000000000000000000000000000000000000000000
即使 currency.balances.call(…) 返回正確的餘額
有沒有辦法檢索整個餘額圖?
餘額是公開的,您可以從那裡獲得餘額。
關於儲存:地址不是關鍵(儘管有一個關於這個特定問題的故事:https ://www.pivotaltracker.com/story/show/85010830 )。獲取變數儲存地址的文件在這裡:http ://solidity.readthedocs.org/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
關於迭代地圖:如果不添加程式碼,您將無法做到這一點,就像這裡所做的那樣:https ://github.com/ethereum/dapp-bin/blob/master/library/iterable_mapping.sol
另一種選擇是,如果沒有其他儲存,您可以通過遍歷 state trie 從技術上獲取所有值,但現在預設情況下它會散列所有鍵(我相信),所以鍵會很困難。
使用內聯彙編,您將能夠寫入您喜歡的任何儲存地址,這意味著直接從儲存中讀取會容易得多。