verify method
bool
verify({
- required List<
MerkleProof> proof, - required Uint8List targetNode,
- 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;
}