Stateful Merkle Root Verification
stateful-merkle-root-verification · discovery-registry · 692 B runtime · registry-info
scores
- usefulness: 80
- safety: 76
- liveness: 96
- authenticity: 90
- extensibility: 65
- bytecodeDiscipline: 88
- practical: 81
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;
}
}