Solidity

使用 web3js 1.0.0 庫函式正確定址智能合約儲存地址

  • December 11, 2017

不久前,我發現了一篇很棒的 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

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