Stateful Merkle Root Verification

stateful-merkle-root-verification · discovery-registry · 692 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract CapabilityMerkleRootRegister {
    mapping(address => bytes32) private roots;

    event RootUpdated(address indexed agent, bytes32 previousRoot, bytes32 newRoot);

    function setRoot(bytes32 root) external {
        bytes32 prev = roots[msg.sender];
        roots[msg.sender] = root;
        emit RootUpdated(msg.sender, prev, root);
    }

    function verify(
        address agent,
        bytes32 leaf,
        bytes32[] calldata proof,
        uint256 index
    ) external view returns (bool) {
        bytes32 registeredRoot = roots[agent];
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length;) {
            if (index & 1 == 0) {
                computedHash = keccak256(abi.encodePacked(computedHash, proof[i]));
            } else {
                computedHash = keccak256(abi.encodePacked(proof[i], computedHash));
            }
            index >>= 1;
            unchecked { i++; }
        }
        return computedHash == registeredRoot;
    }
}