使用 web3js 1.0.0 庫函式正確定址智能合約儲存地址
不久前,我發現了一篇很棒的 Medium 文章,解釋了智能合約儲存。
本文中的範例幫助我了解瞭如何從命令行/控制台讀取智能合約的儲存值。
但是,隨著web3js 的 1.0.0版進入 Beta 版——並且預設安裝的 web3js 的 NPM 版本是1.0.0 Beta 版,我想我會使用上述文章中的資訊將我的程式碼升級到新的圖書館。
問題是我無法使用新版本的庫複製 web3.sha3 的相同行為;web3Utils.sha3。
為了澄清,這裡有一些例子——從我從穩定的、但在 V1.0.0 之前的 web3.sha3 函式得到的輸出開始,然後從 web3js 庫的新的 Beta 版得到:
為了給你一些背景資訊,測試基於訪問這個人為的智能合約中的映射數據:
pragma solidity ^0.4.0; contract StorageTest { mapping(address => uint256) public storedData; function addDataToMapping(address account, uint256 amount) public { storedData[account] = amount; } }
我確定如何訪問地址的映射數據的方式
0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1
是使用以下 pre-V1.0.0 web3js 呼叫:web3.sha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000", {"encoding":"hex"})
這導致雜湊值
0xbbf27a261d686d37ad5c6299e09a73a2a829c9c10eaf9c5c19e6ff2488e52f20
現在,如果我們簡單地將其移植到 V1.0.0 庫,那麼程式碼如下所示:
web3Utils.sha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000", {"encoding":"hex"})
但是,這會導致輸出以下(不同的)雜湊:
0x02d38ce98b8dae9d7cc32b64bb52580b4989cb56d07114b95037da4af5f500cf
我嘗試刪除
{"encoding":"hex"}
參數(因為文件中沒有提到這一點:web3Utils.sha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000")
但不幸的是,我仍然得到相同的輸出:
0x02d38ce98b8dae9d7cc32b64bb52580b4989cb56d07114b95037da4af5f500cf
文件中提到了一個
web3Utils.soliditySha3
聽起來可以解決問題的函式,所以我改用了這個函式呼叫:web3Utils.soliditySha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000", {"encoding":"hex"})
這次我得到了不同的值,但它不是我要尋找的值:
0x0780d226e6d7ac5576d20e78b8c3a2122ace468d419adefef1e79c49d7f4116f
我也嘗試刪除
{"encoding":"hex"}
參數(因為文件中也沒有提到這一點:web3Utils.soliditySha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000");
但這只會導致與
web3Utils.sha3
函式呼叫相同的、不正確的值:0x02d38ce98b8dae9d7cc32b64bb52580b4989cb56d07114b95037da4af5f500cf
我還嘗試了“任何類型,或具有 {type: ‘uint’, value: ‘123456’} 的對象”參數格式的各種排列:
web3Utils.soliditySha3({type: 'string', value: "00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000"})
但是我仍然無法獲得正確的值。
有誰知道如何使用最新的 web3js 庫函式正確處理映射或結構儲存地址?
刪除鍵中多餘的“x”並以“0x”作為前綴,它返回相同的值
const Web3 = require('web3') const web3 = new Web3(); const index = "0000000000000000000000000000000000000000000000000000000000000000" const key = "00000000000000000000000090F8bf6A479f320ead074411a4B0e7944Ea8c9C1"; const newKey = web3.utils.sha3("0x" + key + index) console.log(newKey)
0xbbf27a261d686d37ad5c6299e09a73a2a829c9c10eaf9c5c19e6ff2488e52f20