Web3js

使用 JavaScript 查找映射(地址 => uint)的記憶體位置

  • November 20, 2018

我想從具有以下結構的內部映射中讀取數據:

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]]))

通過將變數作為數組傳遞給函式,這裡到底發生了什麼?而且我正在閱讀我們無法將數組類型傳遞給 web3jssoliditySha3實現,那麼有沒有辦法在 JavaScript 中複製上述 Python 程式碼?

改為使用 auint256作為鍵:

w3.utils.soliditySha3({t: 'uint256', v: addr}, {t: 'uint256', v:idx})

我相信在計算儲存槽時,所有值都會填充到 32 個字節。將地址視為uint256左側用零填充它。

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