Go-Ethereum

web3.eth.getStorageAt 用於映射

  • November 7, 2021

如何獲得合約映射儲存?

考慮到這個簡單的契約

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 從技術上獲取所有值,但現在預設情況下它會散列所有鍵(我相信),所以鍵會很困難。

使用內聯彙編,您將能夠寫入您喜歡的任何儲存地址,這意味著直接從儲存中讀取會容易得多。

引用自:https://ethereum.stackexchange.com/questions/1983