1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- pragma solidity ^0.4.18;
- /*
- * @title MerkleProof
- * @dev Merkle proof verification
- * @note Based on https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol
- */
- library MerkleProof {
- /*
- * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves
- * and each pair of pre-images is sorted.
- * @param _proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree
- * @param _root Merkle root
- * @param _leaf Leaf of Merkle tree
- */
- function verifyProof(bytes _proof, bytes32 _root, bytes32 _leaf) public pure returns (bool) {
- // Check if proof length is a multiple of 32
- if (_proof.length % 32 != 0) {
- return false;
- }
- bytes32 proofElement;
- bytes32 computedHash = _leaf;
- for (uint256 i = 32; i <= _proof.length; i += 32) {
- assembly {
- // Load the current element of the proof
- proofElement := mload(add(_proof, i))
- }
- if (computedHash < proofElement) {
- // Hash(current computed hash + current element of the proof)
- computedHash = keccak256(computedHash, proofElement);
- } else {
- // Hash(current element of the proof + current computed hash)
- computedHash = keccak256(proofElement, computedHash);
- }
- }
- // Check if the computed hash (root) is equal to the provided root
- return computedHash == _root;
- }
- }
|