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
El https://github.com/zmitton/eth-proof está obsoleto, debe usar estas nuevas llamadas RPC https://github.com/ethereum/EIPs/issues/1186