Skip to content

Commit

Permalink
libraries: IVerifier: Refactor verifier into interface
Browse files Browse the repository at this point in the history
  • Loading branch information
joeykraut committed Mar 1, 2025
1 parent 4e9b473 commit 5e091c9
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 31 deletions.
4 changes: 2 additions & 2 deletions src/Darkpool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ pragma solidity ^0.8.0;

import { PlonkProof, VerificationKey, NUM_SELECTORS, NUM_WIRE_TYPES } from "./libraries/verifier/Types.sol";
import { BN254 } from "solidity-bn254/BN254.sol";
import { VerifierCore } from "./libraries/verifier/Verifier.sol";
import { VerificationKeys } from "./VerificationKeys.sol";
import { VerifierCore } from "./libraries/verifier/VerifierCore.sol";
import { VerificationKeys } from "./libraries/darkpool/VerificationKeys.sol";
import { console2 } from "forge-std/console2.sol";
import { IHasher } from "./libraries/merkle/IHasher.sol";
import { ValidWalletCreateStatement, StatementSerializer } from "./libraries/darkpool/PublicInputs.sol";
Expand Down
32 changes: 32 additions & 0 deletions src/Verifier.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import { PlonkProof, VerificationKey } from "./libraries/verifier/Types.sol";
import { ValidWalletCreateStatement, StatementSerializer } from "./libraries/darkpool/PublicInputs.sol";
import { VerificationKeys } from "./libraries/darkpool/VerificationKeys.sol";
import { IVerifier } from "./libraries/verifier/IVerifier.sol";
import { VerifierCore } from "./libraries/verifier/VerifierCore.sol";
import { BN254 } from "solidity-bn254/BN254.sol";

using StatementSerializer for ValidWalletCreateStatement;

/// @title PlonK Verifier with the Jellyfish-style arithmetization
/// @notice The methods on this contract are darkpool-specific
contract Verifier is IVerifier {
/// @notice Verify a proof of `VALID WALLET CREATE`
/// @param statement The public inputs to the proof
/// @param proof The proof to verify
/// @return True if the proof is valid, false otherwise
function verifyValidWalletCreate(
ValidWalletCreateStatement memory statement,
PlonkProof memory proof
)
external
view
returns (bool)
{
VerificationKey memory vk = abi.decode(VerificationKeys.VALID_WALLET_CREATE_VKEY, (VerificationKey));
BN254.ScalarField[] memory publicInputs = statement.scalarSerialize();
return VerifierCore.verify(proof, publicInputs, vk);
}
}
File renamed without changes.
19 changes: 19 additions & 0 deletions src/libraries/verifier/IVerifier.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import { PlonkProof } from "./Types.sol";
import { ValidWalletCreateStatement } from "../darkpool/PublicInputs.sol";

interface IVerifier {
/// @notice Verify a proof of `VALID WALLET CREATE`
/// @param proof The proof to verify
/// @param statement The public inputs to the proof
/// @return True if the proof is valid, false otherwise
function verifyValidWalletCreate(
ValidWalletCreateStatement memory statement,
PlonkProof memory proof
)
external
view
returns (bool);
}
File renamed without changes.
45 changes: 16 additions & 29 deletions test/Verifier.t.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import {TestUtils} from "./utils/TestUtils.sol";
import {VerifierTestUtils} from "./utils/VerifierTestUtils.sol";
import {VerifierCore} from "../src/libraries/verifier/Verifier.sol";
import { TestUtils } from "./utils/TestUtils.sol";
import { VerifierTestUtils } from "./utils/VerifierTestUtils.sol";
import { VerifierCore } from "../src/libraries/verifier/VerifierCore.sol";
import {
PlonkProof,
NUM_WIRE_TYPES,
Expand All @@ -13,26 +13,25 @@ import {
emptyOpeningElements,
ProofLinkingArgument
} from "../src/libraries/verifier/Types.sol";
import {ProofLinkingCore} from "../src/libraries/verifier/ProofLinking.sol";
import {BN254} from "solidity-bn254/BN254.sol";
import {console2} from "forge-std/console2.sol";
import { ProofLinkingCore } from "../src/libraries/verifier/ProofLinking.sol";
import { BN254 } from "solidity-bn254/BN254.sol";
import { console2 } from "forge-std/console2.sol";

contract VerifierTest is VerifierTestUtils {
TestUtils public testUtils;

bytes constant INVALID_G1_POINT = "Bn254: invalid G1 point";
bytes constant INVALID_SCALAR = "Bn254: invalid scalar field";

function setUp() public {}
function setUp() public { }

// --- Invalid Test Cases --- //

/// @notice Test that the verifier properly validates all proof components in step 1 of Plonk verification
function testMalformedProof() public {
// Create a valid scalar and EC point to use as a base
BN254.G1Point memory validPoint = BN254.P1();
BN254.G1Point memory invalidPoint =
BN254.G1Point({x: BN254.BaseField.wrap(42), y: BN254.BaseField.wrap(0)});
BN254.G1Point memory invalidPoint = BN254.G1Point({ x: BN254.BaseField.wrap(42), y: BN254.BaseField.wrap(0) });
BN254.ScalarField validScalar = BN254.ScalarField.wrap(1);
BN254.ScalarField invalidScalar = BN254.ScalarField.wrap(BN254.R_MOD);

Expand Down Expand Up @@ -324,11 +323,8 @@ contract VerifierTest is VerifierTestUtils {
compileRustBinary("test/rust-reference-impls/verifier/Cargo.toml");

// Generate batch test data
(
PlonkProof[] memory proofs,
BN254.ScalarField[][] memory publicInputs,
VerificationKey[] memory vks
) = generateBatchProofData();
(PlonkProof[] memory proofs, BN254.ScalarField[][] memory publicInputs, VerificationKey[] memory vks) =
generateBatchProofData();

// Randomly select a proof to modify
uint256 proofToModify = randomUint(proofs.length);
Expand Down Expand Up @@ -431,9 +427,7 @@ contract VerifierTest is VerifierTestUtils {
BN254.ScalarField[][] memory publicInputs,
VerificationKey[] memory vks,
ProofLinkingArgument memory linkArg
) = getSumProductProofsAndLinkingArgument(
sharedInputs, sumPrivateInput, productPrivateInput
);
) = getSumProductProofsAndLinkingArgument(sharedInputs, sumPrivateInput, productPrivateInput);

uint256 modType = randomUint(4);
BN254.G1Point memory dummyG1Point = randomG1Point();
Expand All @@ -454,8 +448,7 @@ contract VerifierTest is VerifierTestUtils {
// Assert that verification fails
ProofLinkingArgument[] memory linkArgs = new ProofLinkingArgument[](1);
linkArgs[0] = linkArg;
OpeningElements memory linkOpeningElements =
ProofLinkingCore.createOpeningElements(linkArgs);
OpeningElements memory linkOpeningElements = ProofLinkingCore.createOpeningElements(linkArgs);
bool res = VerifierCore.batchVerify(proofs, publicInputs, vks, linkOpeningElements);
require(!res, "Proof verification should have failed");
}
Expand Down Expand Up @@ -541,11 +534,8 @@ contract VerifierTest is VerifierTestUtils {
compileRustBinary("test/rust-reference-impls/verifier/Cargo.toml");

// Generate batch test data
(
PlonkProof[] memory proofs,
BN254.ScalarField[][] memory publicInputs,
VerificationKey[] memory vks
) = generateBatchProofData();
(PlonkProof[] memory proofs, BN254.ScalarField[][] memory publicInputs, VerificationKey[] memory vks) =
generateBatchProofData();

// Verify the batch
OpeningElements memory extraOpeningElements = emptyOpeningElements();
Expand Down Expand Up @@ -574,15 +564,12 @@ contract VerifierTest is VerifierTestUtils {
BN254.ScalarField[][] memory publicInputs,
VerificationKey[] memory vks,
ProofLinkingArgument memory linkArg
) = getSumProductProofsAndLinkingArgument(
sharedInputs, sumPrivateInput, productPrivateInput
);
) = getSumProductProofsAndLinkingArgument(sharedInputs, sumPrivateInput, productPrivateInput);

// Create extra opening elements for the proof linking relation
ProofLinkingArgument[] memory linkArgs = new ProofLinkingArgument[](1);
linkArgs[0] = linkArg;
OpeningElements memory linkingOpeningElements =
ProofLinkingCore.createOpeningElements(linkArgs);
OpeningElements memory linkingOpeningElements = ProofLinkingCore.createOpeningElements(linkArgs);

// Verify the proofs with the extra opening elements
bool res = VerifierCore.batchVerify(proofs, publicInputs, vks, linkingOpeningElements);
Expand Down
26 changes: 26 additions & 0 deletions test/test-contracts/TestVerifier.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import { PlonkProof } from "../../src/libraries/verifier/Types.sol";
import { IVerifier } from "../../src/libraries/verifier/IVerifier.sol";
import { ValidWalletCreateStatement } from "../../src/libraries/darkpool/PublicInputs.sol";

/// @title Test Verifier Implementation
/// @notice This is a test implementation of the `IVerifier` interface that always returns true
contract TestVerifier is IVerifier {
/// @notice Verify a proof of `VALID WALLET CREATE`
/// @param statement The public inputs to the proof
/// @param proof The proof to verify
/// @return True always, regardless of the proof
function verifyValidWalletCreate(
ValidWalletCreateStatement memory statement,
PlonkProof memory proof
)
external
view
returns (bool)
{
// Always return true for testing purposes
return true;
}
}

0 comments on commit 5e091c9

Please sign in to comment.