Adressieren Sie die Smart Contract-Speicheradresse mithilfe der web3js 1.0.0-Bibliotheksfunktionen korrekt

Vor kurzem habe ich einen fantastischen Medium-Artikel gefunden , in dem Smart Contract Storage erklärt wird .

Die Beispiele in diesem Artikel haben mir geholfen zu verstehen, wie man die Speicherwerte eines Smart Contracts von der Befehlszeile / Konsole aus liest.

Da jedoch die Version 1.0.0 von web3js in die Beta-Version geht und die standardmäßig installierte NPM-Version von web3js die Beta-Version 1.0.0 ist, dachte ich, dass ich meinen Code mit den Informationen aus dem oben genannten Artikel auf die neue aktualisieren würde Bibliothek.

Das Problem ist, dass ich das gleiche Verhalten von web3.sha3 mit der neuen Version der Bibliothek nicht replizieren kann; web3Utils.sha3 .

Zur Verdeutlichung hier einige Beispiele - beginnend mit der Ausgabe, die ich von der stabilen web3.sha3-Funktion, aber vor V1.0.0, und dann von der neuen Beta-Version der web3js-Bibliothek bekomme:

Um Ihnen etwas Kontext zu geben, basiert der Test auf dem Zugriff auf die Zuordnungsdaten in diesem erfundenen Smart Contract:


pragma solidity ^0.4.0;

contract StorageTest {
    mapping(address => uint256) public storedData;

    function addDataToMapping(address account, uint256 amount) public {
        storedData[account] = amount;
    }
}

Ich bestimme, wie ich auf die Zuordnungsdaten für die Adresse zugreife, indem ich 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1den folgenden web3js-Aufruf vor V1.0.0 verwende:


web3.sha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000", {"encoding":"hex"})

Daraus ergibt sich der Hashwert

0xbbf27a261d686d37ad5c6299e09a73a2a829c9c10eaf9c5c19e6ff2488e52f20

Wenn wir das jetzt einfach auf die V1.0.0-Bibliothek portieren, sieht der Code so aus:


web3Utils.sha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000", {"encoding":"hex"})   

Dies führt jedoch dazu, dass folgender (anderer) Hash ausgegeben wird:

0x02d38ce98b8dae9d7cc32b64bb52580b4989cb56d07114b95037da4af5f500cf

Ich habe versucht, den Parameter zu entfernen {"encoding":"hex"}(weil dies in der Dokumentation nicht erwähnt wird:


web3Utils.sha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000")

Aber leider bekomme ich immer noch die gleiche Ausgabe:

0x02d38ce98b8dae9d7cc32b64bb52580b4989cb56d07114b95037da4af5f500cf

Die Dokumentation erwähnt eine web3Utils.soliditySha3Funktion, die so klang, als könnte sie den Trick machen, also habe ich stattdessen diesen Funktionsaufruf eingeschaltet:


web3Utils.soliditySha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000", {"encoding":"hex"})

Dieses Mal habe ich einen anderen Wert bekommen, aber es ist nicht der, nach dem ich suche:

0x0780d226e6d7ac5576d20e78b8c3a2122ace468d419adefef1e79c49d7f4116f

Ich habe auch versucht, den Parameter zu entfernen {"encoding":"hex"}(weil dies auch nicht in der Dokumentation erwähnt wird:


web3Utils.soliditySha3("00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000");

Dies führt jedoch nur zu demselben, falschen Wert wie die web3Utils.sha3Funktion aufruft:

0x02d38ce98b8dae9d7cc32b64bb52580b4989cb56d07114b95037da4af5f500cf

Ich habe auch verschiedene Permutationen des Parameterformats "Jeder Typ oder ein Objekt mit {Typ: 'uint', Wert: '123456'}" ausprobiert :


web3Utils.soliditySha3({type: 'string', value: "00000000000000000000000x90F8bf6A479f320ead074411a4B0e7944Ea8c9C10000000000000000000000000000000000000000000000000000000000000000"})

Und trotzdem komme ich nicht auf den richtigen Wert.

Weiß jemand, wie man eine Mapping- oder Strukturspeicheradresse mit den neuesten web3js-Bibliotheksfunktionen korrekt adressiert?

Antworten (1)

Wenn Sie das zusätzliche „x“ im Schlüssel entfernen und „0x“ voranstellen, wird derselbe Wert zurückgegeben

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