-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathMerkleStatementVerifier.sol
65 lines (51 loc) · 2.3 KB
/
MerkleStatementVerifier.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
Copyright 2019-2022 StarkWare Industries Ltd.
Licensed under the Apache License, Version 2.0 (the "License").
You may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.starkware.co/open-source-license/
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions
and limitations under the License.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;
import "./MerkleStatementContract.sol";
abstract contract MerkleStatementVerifier is IMerkleVerifier {
MerkleStatementContract merkleStatementContract;
constructor(address merkleStatementContractAddress) public {
merkleStatementContract = MerkleStatementContract(merkleStatementContractAddress);
}
// Computes the hash of the Merkle statement, and verifies that it is registered in the
// Merkle Fact Registry. Receives as input the queuePtr (as address), its length
// the numbers of queries n, and the root. The channelPtr is is ignored.
function verifyMerkle(
uint256, /*channelPtr*/
uint256 queuePtr,
bytes32 root,
uint256 n
) internal view virtual override returns (bytes32) {
bytes32 statement;
require(n <= MAX_N_MERKLE_VERIFIER_QUERIES, "TOO_MANY_MERKLE_QUERIES");
assembly {
let dataToHashPtrStart := mload(0x40) // freePtr.
let dataToHashPtrCur := dataToHashPtrStart
let queEndPtr := add(queuePtr, mul(n, 0x40))
for {
} lt(queuePtr, queEndPtr) {
} {
mstore(dataToHashPtrCur, mload(queuePtr))
dataToHashPtrCur := add(dataToHashPtrCur, 0x20)
queuePtr := add(queuePtr, 0x20)
}
mstore(dataToHashPtrCur, root)
dataToHashPtrCur := add(dataToHashPtrCur, 0x20)
mstore(0x40, dataToHashPtrCur)
statement := keccak256(dataToHashPtrStart, sub(dataToHashPtrCur, dataToHashPtrStart))
}
require(merkleStatementContract.isValid(statement), "INVALIDATED_MERKLE_STATEMENT");
return root;
}
}