Merkle-Proof für Smart Contract Mapping-Felddaten

Ich versuche, einen Merkle-Proof für Ethereum Smart Contract-Mapping-Felddaten zu erhalten. Ich habe einen Test Smart Contract erstellt und im Testnetzwerk bereitgestellt. Smart Contract Code wie folgender Code:

contract TestSmartContract {

mapping(string => string) mappingField;
address sender;

function TestSmartContract() public {
    sender = msg.sender;
}

function addData(string key,  string value) public {
    mappingField[key] = value;
}}

Ich habe die Smart Contract addData-Methode mit Testdaten aufgerufen.

"a","1"
"b","2"
"c","3"

Nach dem Aufrufen von Smart Contract habe ich versucht, mit der web3-Bibliothek einen Wert zu erhalten, es funktioniert und ich kann den Wert für "a" key als "1" erhalten.

var slot = "0".repeat(64);
            var key = web3.fromAscii('a');
            contractAddress = "0xac3f3d7286d8092be72d0011865a393ea722f609";
            var keccak256 = web3.sha3(key + slot, { encoding: 'hex' });
            web3.eth.getStorageAt(
                contractAddress,  
                keccak256,
                function (err, result) {
                    console.log(web3.toUtf8(result))
                    console.log(result);
                }
            );

Als letzten Schritt habe ich versucht, Merkle Proof für Key "a" zu erstellen. Ich habe versucht, die Bibliothek https://github.com/zmitton/eth-proof zum Abrufen von Merkle Proofs zu verwenden . Aber es gibt den Fehler "storageNode not found". Nachfolgend finden Sie meinen Testcode:

const Web3 = require('web3');
const EP = require('eth-proof')

var chainDataPath = '/Users/ramazan.girgin/chain-tmp/privchain/geth/chaindata/';
try {
    var latestBlockHash = 'f02052990b2ea9daa445c0a4655cb3a395a84c8300cba8258b8faf4357b109c7'
    Web3.providers.HttpProvider.prototype.sendAsync = Web3.providers.HttpProvider.prototype.send;
    var eP = new EP(
        new Web3.providers.HttpProvider("http://127.0.0.1:8545"),
        latestBlockHash,
        chainDataPath
    )
    contractAddress = 'ac3f3d7286d8092be72d0011865a393ea722f609';
    eP.getStorageProof(contractAddress, '0','0x61').then((result) => {
        console.log(result)
    }).catch((e) => {
        console.log(e)
    })
} catch (e) {
    console.log(e)
}

Tatsächlich verwendet ZMitton in dieser Bibliothek https://github.com/ethereumjs/merkle-patricia-tree . Aber ich denke, es gab ein Problem beim Senden des Pfads für die Funktion storageTrie.findPath in der Methode getStorageProof der Bibliothek, oder ich kann falsche Werte für die Methode getStorageProof() haben. Wenn ich andererseits getStorageProof for sender field aufrufe, gibt es einen vollständigen Beweis.

eP.getStorageProof(contractAddress, '1').then((result) => {
            console.log(result)
        }).catch((e) => {
            console.log(e)
        })

Wie kann ich Merkle Proof für das Mapping-Feld in Smart Contract abrufen? Oder wie kann ich den richtigen Pfad für den Funktionsparameter storageTrie.findPath berechnen ?

Vielen Dank im Voraus

Ramazan

Antworten (1)

https://github.com/zmitton/eth-proof ist veraltet, Sie sollten diese neuen RPC-Aufrufe https://github.com/ethereum/EIPs/issues/1186 verwenden