verify method

bool verify({
  1. required List<MerkleProof> proof,
  2. required Uint8List targetNode,
  3. required Uint8List root,
})

Returns true if the proof path (array of hashes) can connect the target node to the Merkle root. proof is a list of MerkleProof objects that should connect target node to Merkle root. targetNode is the target node buffer. root is the Merkle root Buffer.

final root = tree.getRoot();
final proof = tree.getProof(leaf: leaves[2]);
final verified = tree.verify(proof: proof, targetNode: leaves[2], root: root);

Implementation

bool verify({
  required List<MerkleProof> proof,
  required Uint8List targetNode,
  required Uint8List root,
}) {
  var hash = targetNode;

  if (proof.isEmpty || targetNode.isEmpty || root.isEmpty) {
    return false;
  }

  for (var i = 0; i < proof.length; i++) {
    final node = proof[i];
    final isLeftNode = (node.position == MerkleProofPosition.left);
    final buffers = <Uint8List>[];

    if (isBitcoinTree) {
      buffers.add(MerkleTreeUtils.bufferReverse(hash));

      if (isLeftNode) {
        buffers.insert(0, MerkleTreeUtils.bufferReverse(node.data));
      } else {
        buffers.add(MerkleTreeUtils.bufferReverse(node.data));
      }

      hash = hashAlgo(MerkleTreeUtils.bufferConcat(buffers));
      hash = MerkleTreeUtils.bufferReverse(hashAlgo(hash));
    } else {
      buffers.add(hash);

      if (isLeftNode) {
        buffers.insert(0, node.data);
      } else {
        buffers.add(node.data);
      }

      hash = hashAlgo(MerkleTreeUtils.bufferConcat(buffers));
    }
  }

  return MerkleTreeUtils.bufferCompare(hash, root) == 0;
}