-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathSP1VerifierGateway.sol
67 lines (55 loc) · 2.26 KB
/
SP1VerifierGateway.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
66
67
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ISP1Verifier, ISP1VerifierWithHash} from "./ISP1Verifier.sol";
import {ISP1VerifierGateway, VerifierRoute} from "./ISP1VerifierGateway.sol";
import {Ownable} from "lib/openzeppelin-contracts/contracts/access/Ownable.sol";
/// @title SP1 Verifier Gateway
/// @author Succinct Labs
/// @notice This contract verifies proofs by routing to the correct verifier based on the verifier
/// selector contained in the first 4 bytes of the proof. It additionally checks that to see that
/// the verifier route is not frozen.
contract SP1VerifierGateway is ISP1VerifierGateway, Ownable {
/// @inheritdoc ISP1VerifierGateway
mapping(bytes4 => VerifierRoute) public routes;
constructor(address initialOwner) Ownable(initialOwner) {}
/// @inheritdoc ISP1Verifier
function verifyProof(
bytes32 programVKey,
bytes calldata publicValues,
bytes calldata proofBytes
) external view {
bytes4 selector = bytes4(proofBytes[:4]);
VerifierRoute memory route = routes[selector];
if (route.verifier == address(0)) {
revert RouteNotFound(selector);
} else if (route.frozen) {
revert RouteIsFrozen(selector);
}
ISP1Verifier(route.verifier).verifyProof(programVKey, publicValues, proofBytes);
}
/// @inheritdoc ISP1VerifierGateway
function addRoute(address verifier) external onlyOwner {
bytes4 selector = bytes4(ISP1VerifierWithHash(verifier).VERIFIER_HASH());
if (selector == bytes4(0)) {
revert SelectorCannotBeZero();
}
VerifierRoute storage route = routes[selector];
if (route.verifier != address(0)) {
revert RouteAlreadyExists(route.verifier);
}
route.verifier = verifier;
emit RouteAdded(selector, verifier);
}
/// @inheritdoc ISP1VerifierGateway
function freezeRoute(bytes4 selector) external onlyOwner {
VerifierRoute storage route = routes[selector];
if (route.verifier == address(0)) {
revert RouteNotFound(selector);
}
if (route.frozen) {
revert RouteIsFrozen(selector);
}
route.frozen = true;
emit RouteFrozen(selector, route.verifier);
}
}