Add a MerkleProof.processProof utility function (#2841)

* Add a MerkleProof.processProof utility function

* Add changelog entry

* fix lint

* return index when processingProof

* fix lint

* fix test

* Apply suggestions from code review

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>

* improve documentation

* Apply suggestions from code review

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>

* remove index - see discussion in the PR

* update changelog

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
This commit is contained in:
Hadrien Croubois
2021-10-14 11:50:35 +02:00
committed by GitHub
parent 5b28259dac
commit d244b81972
3 changed files with 18 additions and 5 deletions

View File

@ -23,11 +23,21 @@ library MerkleProof {
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
bytes32 computedHash = leaf;
return processProof(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
@ -36,8 +46,6 @@ library MerkleProof {
computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
}
}
// Check if the computed hash (root) is equal to the provided root
return computedHash == root;
return computedHash;
}
}