This pr aims to introduce a differential fuzzing framework between the smart contract verifiers and their c++ counter parts
Usage
function testFuzzProof() public {
bytes memory proof = new DifferentialFuzzer()
.with_flavour(FuzzConfig.PlonkFlavour.Standard) // plonk flavour
.with_public_inputs([1,2,3,4]) // array of public inputs
.generate_proof();
verifier.verify(proof);
}
The above usage will generate a proof for the selected Plonk Flavour then perform a differential test between the c++ verifier and the solidity verifier.
The idea being that lots of different circuits can be tested with lots of different ranges of public inputs.
Questions
What is a better approach to this?
I've used this pattern as it is familiar to me from HuffDeployer, although it seems like a bit of a hack
Would a better approach be to just fire rpc calls from a c++ / fuzzing library?
Task list
[x] Create a prover cli that can take multiple public inputs generate from forge test into the c++ verifier
[x] Create a solidity test harness that allows easy switching between the current circuit flavour (standard, turbo, ultra)
Description
This pr aims to introduce a differential fuzzing framework between the smart contract verifiers and their c++ counter parts
Usage
The above usage will generate a proof for the selected Plonk Flavour then perform a differential test between the c++ verifier and the solidity verifier. The idea being that lots of different circuits can be tested with lots of different ranges of public inputs.
Questions
What is a better approach to this?
Task list