getProof method
Returns the proof for a target leaf.
leaf
is the target leaf for this proof.
index
is the target leaf index in leaves array. Use only if there are leaves containing duplicate data in order to distinguish it.
final proof = tree.getProof(leaf: leaves[2]);
final leaves = ['a', 'b', 'a'].map((x) => Uint8List.fromList(x.codeUnits)).map((x) => sha3(x)).toList();
final tree = MerkleTree(leaves: leaves, hashAlgo: sha3);
final proof = tree.getProof(leaf: leaves[2], index: 2);
Implementation
List<MerkleProof> getProof({
required Uint8List leaf,
int index = -1,
}) {
final proof = <MerkleProof>[];
List<Uint8List> leaves = layers[0];
if (index == -1) {
for (var i = 0; i < leaves.length; i++) {
if (MerkleTreeUtils.bufferCompare(leaf, leaves[i]) == 0) {
index = i;
}
}
}
if (index <= -1) {
return [];
}
if (isBitcoinTree && index == (leaves.length - 1)) {
// Proof Generation for Bitcoin Trees
for (var i = 0; i < _layers.length - 1; i++) {
final layer = _layers[i];
final isRightNode = index % 2 == 1;
final pairIndex = (isRightNode ? index - 1 : index);
if (pairIndex < layer.length) {
proof.add(MerkleProof(
position: isRightNode
? MerkleProofPosition.left
: MerkleProofPosition.right,
data: layer[pairIndex]));
}
// set index to parent index
index = (index / 2).floor();
}
return proof;
} else {
// Proof Generation for Non-Bitcoin Trees
for (var i = 0; i < _layers.length; i++) {
final layer = _layers[i];
final isRightNode = index % 2 == 1;
final pairIndex = (isRightNode ? index - 1 : index + 1);
if (pairIndex < layer.length) {
proof.add(MerkleProof(
position: isRightNode
? MerkleProofPosition.left
: MerkleProofPosition.right,
data: layer[pairIndex]));
}
// set index to parent index
index = (index / 2).floor();
}
return proof;
}
}