Web3js
使用 JavaScript 查找映射(地址 => uint)的記憶體位置
我想從具有以下結構的內部映射中讀取數據:
mapping (uint256 => uint256) internal nums; mapping (address => uint256) internal addrToInt;
查找數據的記憶體位置
nums
只需要uint256(keccak(a, b))
, wherea
是數組的起始位置, 是數組b
的索引。在 JavaScript 中,我們可以通過以下方式獲得:w3.utils.hexToNumberString(w3.utils.soliditySha3(1, 2))
我發現
addrToInt
映射不是這種情況。如果我執行以下 Python 程式碼:w3.toInt(w3.soliditySha3(['address', 'uint256'], [addr, idx]))
然後鑰匙通向一個空的儲存單元。JavaScript 也給出了相同的錯誤鍵:
w3.utils.hexToNumberString(w3.utils.soliditySha3({t: "address", v: addr}, {t: "uint256", v: idx}))
但是,此 Python 程式碼返回正確的鍵:
w3.toInt(w3.soliditySha3(['address[]', 'uint256[]'], [[addr], [idx]]))
通過將變數作為數組傳遞給函式,這裡到底發生了什麼?而且我正在閱讀我們無法將數組類型傳遞給 web3js
soliditySha3
實現,那麼有沒有辦法在 JavaScript 中複製上述 Python 程式碼?
改為使用 a
uint256
作為鍵:w3.utils.soliditySha3({t: 'uint256', v: addr}, {t: 'uint256', v:idx})
我相信在計算儲存槽時,所有值都會填充到 32 個字節。將地址視為
uint256
左側用零填充它。