getProof method

List<MerkleProof> getProof({
  1. required Uint8List leaf,
  2. int index = -1,
})

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;
  }
}