Estoy tratando de usar merkletreejs en el nodo para crear una prueba de maleficio; usar una funciona bien, pero también la necesito para poder generar una prueba para varias hojas.
Mi código js actual:
const { MerkleTree } = require('merkletreejs'); const keccak256 = require('keccak256'); let tokenIDs = [ "6719509505", "6231137281", "3766014977", "4955017921", "8583738032", ]; const leafNodes = tokenIDs.map(ids => keccak256(ids)); const merkleTree = new MerkleTree(leafNodes, keccak256, {sortLeaves: true, sortPairs: true}); const rootHash = merkleTree.getHexRoot(); // CLAIMING HERE const claimingToken = keccak256("6719509505","6231137281","8583738032"); const hexProof = merkleTree.getHexProof(claimingToken); console.log(merkleTree.verify(hexProof, claimingToken, rootHash));Sin embargo, cuando pruebo esto, me da la misma prueba que si solo estuviera usando la primera ID de token. Básicamente ignorando las otras identificaciones que puse.
Y en solidez me está dando un error de prueba no válido:
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract merkle { bytes32 private merkleRoot; event leaf ( bytes32 leaf2 ); event ids ( uint256[] tokenID ); event merk ( bytes32[] _merkleProof ); function mint(bytes32[] calldata _merkleProof, uint256[] calldata tokenID) public { bytes32 leaf2 = keccak256(abi.encodePacked(tokenID)); emit ids(tokenID); emit leaf(leaf2); emit merk(_merkleProof); // Check for an invalid proof require(MerkleProof.verify(_merkleProof, merkleRoot, leaf2), "Invalid Merkle Proof."); } }¿Alguna idea sobre cómo generar una prueba de merkle usando varias hojas?
EDITAR
Me dijeron que Merkle Tree solo puede verificar una hoja a la vez, así que ahora estoy tratando de descubrir cómo enviar varias pruebas y verificar cada una con solidez.
En js, creé una matriz de muestra con pruebas:
let tokenMerkle = []; tokenMerkle.push({tokenId: "6719509505", merkleProof: proof1}); tokenMerkle.push({tokenId: "6231137281", merkleProof: proof2}); tokenMerkle.push({tokenId: "6231137281", merkleProof: proof3});Lo envío con mi llamada a mi contrato. No estoy seguro de cómo verificar correctamente cada uno mediante el uso de una matriz de matrices:
struct Proof { uint tokenID; bytes32[] _merkleProof; } function mint(Proof[] memory proofs) public { for (uint i; i< proofs.length;i++){ bytes32 leafs = keccak256(abi.encodePacked(proofs[i].tokenID)); require(MerkleProof.verify(proofs[i]._merkleProof, merkleRoot, leafs), "Invalid Merkle Proof."); } }