-
Notifications
You must be signed in to change notification settings - Fork 310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: UltraHonkZK contract #11553
feat: UltraHonkZK contract #11553
Conversation
@@ -14,52 +14,52 @@ library RecursiveUltraVerificationKey { | |||
mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000010) // vk.num_inputs | |||
mstore(add(_vk, 0x40), 0x2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd) // vk.work_root | |||
mstore(add(_vk, 0x60), 0x3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201) // vk.domain_inverse |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These verifications keys were stale because the unit tests were failing for the UltraPlonk contract, bootstrapping updated them
@@ -7,13 +7,14 @@ contract DifferentialFuzzer is TestBase { | |||
using strings for *; | |||
using Strings for uint256; | |||
|
|||
enum PlonkFlavour { | |||
enum Flavor { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tried to make this generally a bit less confusing and renamed flavoUr to flavor, if we remove the option to create a Standard builder it can be even cleaner in places
@@ -526,14 +521,15 @@ template <typename Curve> class SmallSubgroupIPAVerifier { | |||
challenge_polynomial_lagrange[0] = FF{ 1 }; | |||
|
|||
// Populate the vector with the powers of the challenges |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no functionality added just tried to improve readability and make the code simpler here and below
import "forge-std/console.sol"; | ||
|
||
// ZKTranscript library to generate fiat shamir challenges, the ZK transcript only differest | ||
struct ZKTranscript { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Identical in structure with the non-ZK transcript, but we generate an additional challenge in sumcheck and we need to hash more data in places because the ZK proof includes extra field elements and commitments.
// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) | ||
static const char HONK_ZK_CONTRACT_SOURCE[] = R"( | ||
|
||
pragma solidity ^0.8.27; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is identical with the BaseZKHonkVerifier in terms of logic but I removed the Base class because the contract was over the allowed bytecode size. We are still very close to the limit so it is going to be a problem again if we add new functionality but ultimately the rewrite to assembly will probably solve this issue. I tried to not harm readability too much.
generate_proof<Add2Circuit>(inputs); | ||
} else if (circuit_flavour == "ecdsa") { | ||
generate_proof<EcdsaCircuit>(inputs); | ||
} else if (flavor == "honk_zk") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know this is messy, working on a follow-up PR that cleans this solidity_helper stuff
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good!
@@ -1591,7 +1552,7 @@ abstract contract BaseHonkVerifier is IVerifier { | |||
Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; | |||
for (uint256 i; i < BATCHED_RELATION_PARTIAL_LENGTH; ++i) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm assuming its safe to not explicitly initialize this idx but makes me a bit uneasy
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah it's implicitly initialised with 0 but good point
|
||
(gateChallenges[i],) = splitChallenge(previousChallenge); | ||
} | ||
nextPreviousChallenge = previousChallenge; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I laughed out loud a little bit whe I read the name "next previous challenge"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
According to the jolly internet: The solidity compiler outputs more efficient code when the variable is declared in the return statement. There seem to be very few exceptions to this in practice, so if you see an anonymous return, you should test it with a named return instead to determine which case is most efficient.
// TODO: mod q proof points | ||
// TODO: Preprocess all of the memory locations | ||
// TODO: Adjust proof point serde away from poseidon forced field elements | ||
// TODO: move this back to probably each instance to avoid dynamic init of arrays in the ZKTranscript Lib |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there something more organized we should do with these todos? Can they at least be converted to a single bb issue or something?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i'll open some issues
p.w3 = bytesToG1ProofPoint(proof[0x160:0x1e0]); | ||
|
||
// Lookup / Permutation Helper Commitments | ||
p.lookupReadCounts = bytesToG1ProofPoint(proof[0x1e0:0x260]); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we talked about something like this before but can't remember -- seems like this code would benefit immensely from some reader logic that abstracts away the explicit hex indices. Is that possible or is there some reason why it needs to be explicit
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah we did - my hesitation from doing that is that in the "final" version loading the proof will look like this: https://github.com/AztecProtocol/aztec-packages/blob/mm/zk-sol/barretenberg/sol/src/ultra/BaseUltraVerifier.sol#L532
So i tried to balance how much work I put into readable code to making stuff a bit less bug prone
check = mem.diff == ZERO; | ||
} | ||
|
||
// This implementation is the same as above with different constants |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this comment still meaningful?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no - it's me talking to myself
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there used to be two implementations of batchMul cus Zeromorph had two batchMuls of different sizes
@@ -13,15 +13,15 @@ | |||
#include <sstream> | |||
|
|||
using namespace bb; | |||
using numeric::uint256_t; | |||
using numeric::uint256_t; // is this really |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i was very confused by this using, will investigate in follow up if i can remove it
} | ||
|
||
// Contribution 10 point doubling, x-coordinate check | ||
// (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 | ||
// N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 | ||
{ | ||
Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; | ||
Fr x_pow_4 = (y1_sqr + Fr.wrap(17)) * ep.x_1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
any reason not to keep this as a nice named parameter?
@@ -40,7 +40,7 @@ contract Add2HonkTest is TestBaseHonk { | |||
(bytes32[] memory publicInputs, bytes memory proof) = splitProofHonk(proofData, PUBLIC_INPUT_COUNT); | |||
|
|||
assertTrue(verifier.verify(proof, publicInputs), "The proof is not valid"); | |||
|
|||
console.log("wii"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wiiii
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wiiiiii
|
||
pragma solidity >=0.8.4; | ||
|
||
import {HonkVerifier} from "./ZKVerifier.sol"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This file isnt needed? cant we just name the generated verifier "./Verifier.sol" and it will just work?
REVIEWNOTE: check that this ends up running in the same folder as the generated verifier
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if you run the honk zk and non-zk tests in parallel (which is done in CI), unless you make separate files, you'll have concurrency issues
@@ -42,8 +42,8 @@ std::string pad_left(std::string input, size_t length) | |||
/** | |||
* @brief Main entry point for the proof generator. | |||
* Expected inputs: | |||
* 1. plonk_flavour: ultra | |||
* 2. circuit_flavour: blake, add2, recursive | |||
* 1. plonk_flavor: ultra |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the americans have won, we must never surrender
|
||
import {bytesToG1ProofPoint, bytesToFr, logFr, logG} from "./utils.sol"; | ||
|
||
import "forge-std/console.sol"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wanna remove this import if we can
Honk.G1ProofPoint w3; | ||
Honk.G1ProofPoint w4; | ||
// Commitments to logup witness polynomials | ||
Honk.G1ProofPoint lookupReadCounts; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
does the ordering of this need to be different to the Proof above ( ordering is unimportant from a compiler perspective but does for hashing, i think we should list this in the order of hashing )
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it is roughly in the correct order except the first libra commitment is received before sumcheck and the rest after it, but because the additional subprotocol operates on all at once I thought it's better to group them together
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.74.0</summary> ## [0.74.0](aztec-package-v0.73.0...aztec-package-v0.74.0) (2025-02-04) ### Miscellaneous * Ensure new kv-store is used on the server ([#11662](#11662)) ([aee1420](aee1420)) </details> <details><summary>barretenberg.js: 0.74.0</summary> ## [0.74.0](barretenberg.js-v0.73.0...barretenberg.js-v0.74.0) (2025-02-04) ### Miscellaneous * **barretenberg.js:** Synchronize aztec-packages versions </details> <details><summary>aztec-packages: 0.74.0</summary> ## [0.74.0](aztec-packages-v0.73.0...aztec-packages-v0.74.0) (2025-02-04) ### ⚠ BREAKING CHANGES * time library ([#11542](#11542)) ### Features * `u128.ts` accepting string on input ([#11664](#11664)) ([bb25992](bb25992)) * Add network, better drawer performance ([#11694](#11694)) ([1f61822](1f61822)) * Skip calculation of partial sums when simulating blobs ([#11257](#11257)) ([aca66f7](aca66f7)) * Time library ([#11542](#11542)) ([3b463f9](3b463f9)), closes [#11520](#11520) * UltraHonkZK contract ([#11553](#11553)) ([a68369f](a68369f)) ### Bug Fixes * Add bootstrap.sh to rebuild_patterns ([#11683](#11683)) ([e84a81a](e84a81a)) * **archiver:** Do not attempt to decode blob before filtering ([#11668](#11668)) ([961cbdd](961cbdd)) * Barretenber/stdlib/logic bugs ([#11651](#11651)) ([dddab22](dddab22)) * Barretenberg/stdlib/logic bugs (redo) ([#11691](#11691)) ([6d0bad7](6d0bad7)) * **docs:** Keys docs update ([#11665](#11665)) ([ce3d92c](ce3d92c)) * Revert "barretenberg/stdlib/logic bugs" ([#11689](#11689)) ([b99570d](b99570d)) * Solidity verifier caching ([#11712](#11712)) ([2ba1e71](2ba1e71)) * Use eth-execution label ([#11713](#11713)) ([d3c31d8](d3c31d8)) ### Miscellaneous * Add tests for gov proposer ([#11633](#11633)) ([5c6a48a](5c6a48a)), closes [#11681](#11681) * **bb-prover:** Avm test skip and split ([#11717](#11717)) ([1778867](1778867)) * Benchmark sha256 number of instructions executed in AVM ([#11253](#11253)) ([aaf0d8c](aaf0d8c)) * Delete MerkleTrees implementation in JS ([#11697](#11697)) ([1db7b78](1db7b78)) * Ensure new kv-store is used on the server ([#11662](#11662)) ([aee1420](aee1420)) * Field encoding should use `fromString` instead of `fromHexString` ([#11585](#11585)) ([43fdbb1](43fdbb1)), closes [#10331](#10331) * Improve boxes ([#11656](#11656)) ([46a3e85](46a3e85)) * Increase node pool count and don't use a release channel ([#11687](#11687)) ([65a3f11](65a3f11)) * Mark contracts as pub ([#11241](#11241)) ([b168601](b168601)) * Reduce memory requests on prover node ([#11678](#11678)) ([a720151](a720151)) * Remove profiler cache fallback ([#11680](#11680)) ([a305aef](a305aef)) * Remove some templates in templates ([#11698](#11698)) ([61614b1](61614b1)) * Remove unused functions from public side effect trace ([#11600](#11600)) ([54e9602](54e9602)) * Replace relative paths to noir-protocol-circuits ([739151e](739151e)) * Replace relative paths to noir-protocol-circuits ([bbd526c](bbd526c)) * **sequencer:** Add InvalidArchive to canProposeAtNextEthBlock ignored errors ([#11682](#11682)) ([eea4bd3](eea4bd3)) * **spartan:** Remove hardcoded keys and addresses - derive all from mnemonic ([#11672](#11672)) ([65f0e48](65f0e48)) * Turn off auto-upgrade in node-pools ([#11679](#11679)) ([09f98a9](09f98a9)) * Turn on masking in ultra and mega zk + oink clean-up ([#11693](#11693)) ([08e96fe](08e96fe)) ### Documentation * Update mig notes release version ([#11685](#11685)) ([46a30b5](46a30b5)) </details> <details><summary>barretenberg: 0.74.0</summary> ## [0.74.0](barretenberg-v0.73.0...barretenberg-v0.74.0) (2025-02-04) ### Features * UltraHonkZK contract ([#11553](#11553)) ([a68369f](a68369f)) ### Bug Fixes * Barretenber/stdlib/logic bugs ([#11651](#11651)) ([dddab22](dddab22)) * Barretenberg/stdlib/logic bugs (redo) ([#11691](#11691)) ([6d0bad7](6d0bad7)) * Revert "barretenberg/stdlib/logic bugs" ([#11689](#11689)) ([b99570d](b99570d)) ### Miscellaneous * Ensure new kv-store is used on the server ([#11662](#11662)) ([aee1420](aee1420)) * Remove some templates in templates ([#11698](#11698)) ([61614b1](61614b1)) * Turn on masking in ultra and mega zk + oink clean-up ([#11693](#11693)) ([08e96fe](08e96fe)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.74.0</summary> ## [0.74.0](AztecProtocol/aztec-packages@aztec-package-v0.73.0...aztec-package-v0.74.0) (2025-02-04) ### Miscellaneous * Ensure new kv-store is used on the server ([#11662](AztecProtocol/aztec-packages#11662)) ([aee1420](AztecProtocol/aztec-packages@aee1420)) </details> <details><summary>barretenberg.js: 0.74.0</summary> ## [0.74.0](AztecProtocol/aztec-packages@barretenberg.js-v0.73.0...barretenberg.js-v0.74.0) (2025-02-04) ### Miscellaneous * **barretenberg.js:** Synchronize aztec-packages versions </details> <details><summary>aztec-packages: 0.74.0</summary> ## [0.74.0](AztecProtocol/aztec-packages@aztec-packages-v0.73.0...aztec-packages-v0.74.0) (2025-02-04) ### ⚠ BREAKING CHANGES * time library ([#11542](AztecProtocol/aztec-packages#11542)) ### Features * `u128.ts` accepting string on input ([#11664](AztecProtocol/aztec-packages#11664)) ([bb25992](AztecProtocol/aztec-packages@bb25992)) * Add network, better drawer performance ([#11694](AztecProtocol/aztec-packages#11694)) ([1f61822](AztecProtocol/aztec-packages@1f61822)) * Skip calculation of partial sums when simulating blobs ([#11257](AztecProtocol/aztec-packages#11257)) ([aca66f7](AztecProtocol/aztec-packages@aca66f7)) * Time library ([#11542](AztecProtocol/aztec-packages#11542)) ([3b463f9](AztecProtocol/aztec-packages@3b463f9)), closes [#11520](AztecProtocol/aztec-packages#11520) * UltraHonkZK contract ([#11553](AztecProtocol/aztec-packages#11553)) ([a68369f](AztecProtocol/aztec-packages@a68369f)) ### Bug Fixes * Add bootstrap.sh to rebuild_patterns ([#11683](AztecProtocol/aztec-packages#11683)) ([e84a81a](AztecProtocol/aztec-packages@e84a81a)) * **archiver:** Do not attempt to decode blob before filtering ([#11668](AztecProtocol/aztec-packages#11668)) ([961cbdd](AztecProtocol/aztec-packages@961cbdd)) * Barretenber/stdlib/logic bugs ([#11651](AztecProtocol/aztec-packages#11651)) ([dddab22](AztecProtocol/aztec-packages@dddab22)) * Barretenberg/stdlib/logic bugs (redo) ([#11691](AztecProtocol/aztec-packages#11691)) ([6d0bad7](AztecProtocol/aztec-packages@6d0bad7)) * **docs:** Keys docs update ([#11665](AztecProtocol/aztec-packages#11665)) ([ce3d92c](AztecProtocol/aztec-packages@ce3d92c)) * Revert "barretenberg/stdlib/logic bugs" ([#11689](AztecProtocol/aztec-packages#11689)) ([b99570d](AztecProtocol/aztec-packages@b99570d)) * Solidity verifier caching ([#11712](AztecProtocol/aztec-packages#11712)) ([2ba1e71](AztecProtocol/aztec-packages@2ba1e71)) * Use eth-execution label ([#11713](AztecProtocol/aztec-packages#11713)) ([d3c31d8](AztecProtocol/aztec-packages@d3c31d8)) ### Miscellaneous * Add tests for gov proposer ([#11633](AztecProtocol/aztec-packages#11633)) ([5c6a48a](AztecProtocol/aztec-packages@5c6a48a)), closes [#11681](AztecProtocol/aztec-packages#11681) * **bb-prover:** Avm test skip and split ([#11717](AztecProtocol/aztec-packages#11717)) ([1778867](AztecProtocol/aztec-packages@1778867)) * Benchmark sha256 number of instructions executed in AVM ([#11253](AztecProtocol/aztec-packages#11253)) ([aaf0d8c](AztecProtocol/aztec-packages@aaf0d8c)) * Delete MerkleTrees implementation in JS ([#11697](AztecProtocol/aztec-packages#11697)) ([1db7b78](AztecProtocol/aztec-packages@1db7b78)) * Ensure new kv-store is used on the server ([#11662](AztecProtocol/aztec-packages#11662)) ([aee1420](AztecProtocol/aztec-packages@aee1420)) * Field encoding should use `fromString` instead of `fromHexString` ([#11585](AztecProtocol/aztec-packages#11585)) ([43fdbb1](AztecProtocol/aztec-packages@43fdbb1)), closes [#10331](AztecProtocol/aztec-packages#10331) * Improve boxes ([#11656](AztecProtocol/aztec-packages#11656)) ([46a3e85](AztecProtocol/aztec-packages@46a3e85)) * Increase node pool count and don't use a release channel ([#11687](AztecProtocol/aztec-packages#11687)) ([65a3f11](AztecProtocol/aztec-packages@65a3f11)) * Mark contracts as pub ([#11241](AztecProtocol/aztec-packages#11241)) ([b168601](AztecProtocol/aztec-packages@b168601)) * Reduce memory requests on prover node ([#11678](AztecProtocol/aztec-packages#11678)) ([a720151](AztecProtocol/aztec-packages@a720151)) * Remove profiler cache fallback ([#11680](AztecProtocol/aztec-packages#11680)) ([a305aef](AztecProtocol/aztec-packages@a305aef)) * Remove some templates in templates ([#11698](AztecProtocol/aztec-packages#11698)) ([61614b1](AztecProtocol/aztec-packages@61614b1)) * Remove unused functions from public side effect trace ([#11600](AztecProtocol/aztec-packages#11600)) ([54e9602](AztecProtocol/aztec-packages@54e9602)) * Replace relative paths to noir-protocol-circuits ([739151e](AztecProtocol/aztec-packages@739151e)) * Replace relative paths to noir-protocol-circuits ([bbd526c](AztecProtocol/aztec-packages@bbd526c)) * **sequencer:** Add InvalidArchive to canProposeAtNextEthBlock ignored errors ([#11682](AztecProtocol/aztec-packages#11682)) ([eea4bd3](AztecProtocol/aztec-packages@eea4bd3)) * **spartan:** Remove hardcoded keys and addresses - derive all from mnemonic ([#11672](AztecProtocol/aztec-packages#11672)) ([65f0e48](AztecProtocol/aztec-packages@65f0e48)) * Turn off auto-upgrade in node-pools ([#11679](AztecProtocol/aztec-packages#11679)) ([09f98a9](AztecProtocol/aztec-packages@09f98a9)) * Turn on masking in ultra and mega zk + oink clean-up ([#11693](AztecProtocol/aztec-packages#11693)) ([08e96fe](AztecProtocol/aztec-packages@08e96fe)) ### Documentation * Update mig notes release version ([#11685](AztecProtocol/aztec-packages#11685)) ([46a30b5](AztecProtocol/aztec-packages@46a30b5)) </details> <details><summary>barretenberg: 0.74.0</summary> ## [0.74.0](AztecProtocol/aztec-packages@barretenberg-v0.73.0...barretenberg-v0.74.0) (2025-02-04) ### Features * UltraHonkZK contract ([#11553](AztecProtocol/aztec-packages#11553)) ([a68369f](AztecProtocol/aztec-packages@a68369f)) ### Bug Fixes * Barretenber/stdlib/logic bugs ([#11651](AztecProtocol/aztec-packages#11651)) ([dddab22](AztecProtocol/aztec-packages@dddab22)) * Barretenberg/stdlib/logic bugs (redo) ([#11691](AztecProtocol/aztec-packages#11691)) ([6d0bad7](AztecProtocol/aztec-packages@6d0bad7)) * Revert "barretenberg/stdlib/logic bugs" ([#11689](AztecProtocol/aztec-packages#11689)) ([b99570d](AztecProtocol/aztec-packages@b99570d)) ### Miscellaneous * Ensure new kv-store is used on the server ([#11662](AztecProtocol/aztec-packages#11662)) ([aee1420](AztecProtocol/aztec-packages@aee1420)) * Remove some templates in templates ([#11698](AztecProtocol/aztec-packages#11698)) ([61614b1](AztecProtocol/aztec-packages@61614b1)) * Turn on masking in ultra and mega zk + oink clean-up ([#11693](AztecProtocol/aztec-packages#11693)) ([08e96fe](AztecProtocol/aztec-packages@08e96fe)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
This PR introduces an UltraHonk ZK contract and unit tests together with some refactorings/renamings in the pipeline for generating circuits for Solidity unit tests.
Flows for testing a deployed contract will be added in a follow-up PR.