Prueba de Merkle para datos de campo de mapeo de contrato inteligente

Estoy tratando de obtener una prueba de merkle para los datos de campo de mapeo de Ethereum Smart Contract. Creé un contrato inteligente de prueba y lo implementé para probar la red. Código de contrato inteligente como el siguiente código:

contract TestSmartContract {

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

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

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

Invoqué el método addData del contrato inteligente con datos de prueba.

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

Después de invocar el contrato inteligente, traté de obtener valor con la biblioteca web3, funciona y puedo obtener valor para la clave "a" como "1".

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);
                }
            );

Como etapa final, traté de crear Merkle Proof para Key "a". Traté de usar la biblioteca https://github.com/zmitton/eth-proof para recuperar Merkle Proofs. Pero da el error "storageNode no encontrado". Puedes encontrar mi código de prueba a continuación:

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

En realidad, ZMitton usa https://github.com/ethereumjs/merkle-patricia-tree en esta biblioteca. Pero creo que hubo un problema al enviar la ruta para la función storageTrie.findPath en el método getStorageProof de la biblioteca o puedo valores incorrectos para el método getStorageProof(). Por otro lado, si llamo a getStorageProof para el campo del remitente, da una prueba completa.

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

¿Cómo puedo recuperar la prueba de merkle para el campo de mapeo en Smart Contract? ¿O cómo puedo calcular la ruta correcta para el parámetro de función storageTrie.findPath ?

gracias de antemano

Ramazán

Respuestas (1)

El https://github.com/zmitton/eth-proof está obsoleto, debe usar estas nuevas llamadas RPC https://github.com/ethereum/EIPs/issues/1186