-
Notifications
You must be signed in to change notification settings - Fork 296
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
chore: Greater stability at 1TPS #10981
Conversation
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, but this definitely needs @alexghr to take a look
storage: "8Gi" | ||
archiverPollingInterval: 1000 | ||
archiverViemPollingInterval: 1000 | ||
pollInterval: 1000 | ||
viemPollingInterval: 1000 | ||
dataDir: "/data" | ||
storageSize: "1Gi" |
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.
We have a storage
entry defined a few lines above, should we delete it in favor of this one?
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.
Done
memory: "5Gi" | ||
cpu: "1.5" | ||
ephemeral-storage: "275Gi" | ||
maxOldSpaceSize: "5120" |
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.
Shouldn't maxOldSpaceSize
be slightly below the total memory available?
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 possibly, will modify
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 like node.js recommends 0.5GB or so headroom. https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-mib
import { type ProvingOrchestrator } from '../orchestrator/orchestrator.js'; | ||
import { type BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js'; | ||
|
||
/** Encapsulates the proving orchestrator and the broker facade */ |
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.
Curious: why not just make the orchestrator start/stop the facade?
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.
Well, the orchestrator just receives a ServerCircuitProver
interface. This just contains methods such as:
getBaseParityProof(
inputs: BaseParityInputs,
signal?: AbortSignal,
epochNumber?: number,
): Promise<PublicInputsAndRecursiveProof<ParityPublicInputs, typeof RECURSIVE_PROOF_LENGTH>>;
I felt that it is something of an implementation detail that the facade (an instance of a ServerCircuitProver) has the need to be start
ed and stop
ped with each epoch.
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.
Makes sense. FWIW I had been lazy in these situations and used a Maybe<Service>
type (meaning the dependency may be stoppable) along with a tryStop
in the parent:
aztec-packages/yarn-project/circuit-types/src/interfaces/service.ts
Lines 16 to 25 in 4600f54
/** Tries to call stop on a given object and awaits it. Logs any errors and does not rethrow. */ | |
export async function tryStop(service: Maybe<Service>, logger?: Logger): Promise<void> { | |
try { | |
return typeof service === 'object' && service && 'stop' in service && typeof service.stop === 'function' | |
? await service.stop() | |
: Promise.resolve(); | |
} catch (err) { | |
logger?.error(`Error stopping service ${(service as object).constructor?.name}: ${err}`); | |
} | |
} |
Less clean, but saves from having to add another object just to manage the dependencies lifecycle.
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.
(just in case: I'm not advocating for one approach or the other!)
private jobs: Map<ProvingJobId, ProvingJob> = new Map(); | ||
private runningPromise?: RunningPromise; | ||
private timeOfLastSnapshotSync = Date.now(); | ||
private queue?: SerialQueue = new SerialQueue(); |
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.
Why the ?
, given it's initialized on construction?
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 that was a mistake. Nice catch.
let numCleanups = 1; | ||
let numEnqueue = 1; | ||
let remaining = await this.requestQueue.put(() => this.cleanupStaleJobs()); | ||
while (remaining) { | ||
remaining = await this.requestQueue.put(() => this.cleanupStaleJobs()); | ||
numCleanups++; | ||
} | ||
remaining = await this.requestQueue.put(() => this.reEnqueueExpiredJobs()); | ||
while (remaining) { | ||
remaining = await this.requestQueue.put(() => this.reEnqueueExpiredJobs()); | ||
numEnqueue++; | ||
} |
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.
Not new on this PR, but shouldn't we re-enqueue jobs before cleaning up stale ones? Seems like re-enqueuing is more time-pressing.
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 has now changed. Cleaning up stale jobs no longer touches the DB so should not incur any latency. Neither does re-enqueueing jobs.
The DB cleanup is now performed after both of these operations.
*/ | ||
private epochHeight = 0; | ||
private maxEpochsToKeepResultsFor = 1; | ||
|
||
private requestQueue: SerialQueue = new SerialQueue(); |
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.
Curious: what prompted using a serial queue here?
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.
Stability. Without the queue we effectively have an unbounded number of concurrent write transactions against the database. It's limited by the number of prover agents, but that could be thousands. LMDB only allows one write transaction at a time. It's the JS wrapper that is doing a lot of work behind the scenes to give the illusion of concurrency. But I worry about it's stability under such heavy concurrent access.
It maybe that as we try and scale to larger epochs, writing one job/result at a time is insufficient. However I think a better strategy there would be to still perform writes sequentially but write batches of updates instead of just 1.
// Job was not enqueued. It must be completed already, add to our set of already completed jobs | ||
this.jobsToRetrieve.add(id); |
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 it possible the job was just enqueued twice, so it is not yet complete? IIUC the broker will return false if the job is enqueued but it already has one with the same id, regardless of it being finished or not.
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.
You are correct. This is now refactored to return better information as to whether the job was enqueued or not.
if (output.type === type) { | ||
return output.result as ProvingJobResultsMap[T]; | ||
if (output.type === jobType) { | ||
return { result: output.result as ProvingJobResultsMap[T], success: true, reason: '' }; |
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.
return { result: output.result as ProvingJobResultsMap[T], success: true, reason: '' }; | |
return { result: output.result as ProvingJobResultsMap[T], success: true }; |
Nit: let's not use empty strings instead of null/undefined.
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.
Done
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.
LGTM
|
||
export const getEpochFromProvingJobId = (id: ProvingJobId) => { | ||
const components = id.split(':'); | ||
return +components[0]; |
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.
Not for now, but it might be worth throwing here if this is not a number (only benefits to catch tests that use old-style IDs)
// keep retrying until we time out | ||
} | ||
// Job was not enqueued. It must be completed already, add to our set of already completed jobs | ||
this.jobsToRetrieve.add(id); |
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.
On the new else branch (now that we have status) we technically have the result in the status object and can resolve immediately, but an optimization for another time :)
* master: (287 commits) feat: Sync from noir (#11051) chore(docs): Update tx concepts page (#10947) chore(docs): Edit Aztec.nr Guide section (#10866) chore: test:e2e defaults to no-docker (#10966) chore(avm): improve column stats (#11135) chore: Sanity checking of proving job IDs (#11134) feat: permutation argument optimizations (#10960) feat: single tx block root rollup (#11096) refactor: prover db config (#11126) feat: monitor event loop lag (#11127) chore: Greater stability at 1TPS (#10981) chore: Jest reporters for CI (#11125) fix: Sequencer times out L1 tx at end of L2 slot (#11112) feat: browser chunking (#11102) fix: Added start/stop guards to running promise and serial queue (#11120) fix: Don't retransmit txs upon node restart (#11123) fix: Prover node aborts execution at epoch end (#11111) feat: blob sink in sandbox without extra process (#11032) chore: log number of instructions executed for call in AVM. Misc fix. (#11110) git subrepo push --branch=master noir-projects/aztec-nr ...
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.70.0</summary> ## [0.70.0](aztec-package-v0.69.1...aztec-package-v0.70.0) (2025-01-15) ### Features * Blob sink in sandbox without extra process ([#11032](#11032)) ([4600f54](4600f54)) * Browser chunking ([#11102](#11102)) ([393e843](393e843)) ### Miscellaneous * Greater stability at 1TPS ([#10981](#10981)) ([1c23662](1c23662)) * Prover db config ([#11126](#11126)) ([9d49393](9d49393)), closes [#10267](#10267) * Rpc server cleanup & misc fixes ([#11145](#11145)) ([8a927eb](8a927eb)) </details> <details><summary>barretenberg.js: 0.70.0</summary> ## [0.70.0](barretenberg.js-v0.69.1...barretenberg.js-v0.70.0) (2025-01-15) ### Miscellaneous * **barretenberg.js:** Synchronize aztec-packages versions </details> <details><summary>aztec-packages: 0.70.0</summary> ## [0.70.0](aztec-packages-v0.69.1...aztec-packages-v0.70.0) (2025-01-15) ### ⚠ BREAKING CHANGES * disallow calling unconstrained functions outside of `unsafe` blocks and passing unconstrained functions in place of constrained functions (noir-lang/noir#6938) * Disable mocks in `execute` (noir-lang/noir#6869) * require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901) * Reserve `enum` and `match` keywords (noir-lang/noir#6961) * require trait method calls (`foo.bar()`) to have the trait in scope (imported) (noir-lang/noir#6895) * type-check trait default methods (noir-lang/noir#6645) * update `aes128_encrypt` to return an array (noir-lang/noir#6973) * turn TypeIsMorePrivateThenItem into an error (noir-lang/noir#6953) * turn CannotReexportItemWithLessVisibility into an error (noir-lang/noir#6952) ### Features * `--pedantic-solving` flag (noir-lang/noir#6716) ([3883a0e](3883a0e)) * 7 bit long `note_type_id` ([#10951](#10951)) ([6fc5673](6fc5673)) * **avm2:** Avm redesign init ([#10906](#10906)) ([231f017](231f017)) * Blob sink in sandbox without extra process ([#11032](#11032)) ([4600f54](4600f54)) * Browser chunking ([#11102](#11102)) ([393e843](393e843)) * Build blocks using txs with higher fee first ([#11093](#11093)) ([def7cd7](def7cd7)), closes [#11084](#11084) * **cli:** Add CLI option to filter by contract function name (noir-lang/noir#7018) ([9189120](9189120)) * **comptime:** Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008) ([9189120](9189120)) * Contract class must be registered before deployment ([#10949](#10949)) ([7176a70](7176a70)) * Dashboard in gcp ([#11201](#11201)) ([2790bd7](2790bd7)) * Disable mocks in `execute` (noir-lang/noir#6869) ([9189120](9189120)) * Disallow calling unconstrained functions outside of `unsafe` blocks and passing unconstrained functions in place of constrained functions (noir-lang/noir#6938) ([9189120](9189120)) * Don't report warnings for dependencies (noir-lang/noir#6926) ([3883a0e](3883a0e)) * Don't simplify SSA instructions when creating them from a string (noir-lang/noir#6948) ([3883a0e](3883a0e)) * Expose getL2ToL1Membership on the pxe ([#11215](#11215)) ([ffd3625](ffd3625)) * Impl Default for U128 (noir-lang/noir#6984) ([3883a0e](3883a0e)) * Inject protocol nullifier conditionally ([#11155](#11155)) ([93ade26](93ade26)) * Kickoff tube circuits at the beginning of proving job ([#11139](#11139)) ([85d389f](85d389f)), closes [#10998](#10998) * Lock on Nargo.toml on several nargo commands (noir-lang/noir#6941) ([3883a0e](3883a0e)) * **lsp:** Use trait method docs for trait impl method docs on hover (noir-lang/noir#7003) ([9189120](9189120)) * Monitor event loop lag ([#11127](#11127)) ([422f125](422f125)) * Permutation argument optimizations ([#10960](#10960)) ([de99603](de99603)) * PXE db contract store ([#10867](#10867)) ([b5d51eb](b5d51eb)) * Require trait function calls (`Foo::bar()`) to have the trait in scope (imported) (noir-lang/noir#6882) ([3883a0e](3883a0e)) * Require trait method calls (`foo.bar()`) to have the trait in scope (imported) (noir-lang/noir#6895) ([3883a0e](3883a0e)) * Require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901) ([9189120](9189120)) * Simulator split ([#11144](#11144)) ([9b99126](9b99126)) * Single tx block root rollup ([#11096](#11096)) ([bcc0168](bcc0168)) * SSA globals in monomorphization and SSA gen (noir-lang/noir#6985) ([9189120](9189120)) * **ssa:** Immediately simplify away RefCount instructions in ACIR functions (noir-lang/noir#6893) ([3883a0e](3883a0e)) * **test:** Enable the test fuzzer for Wasm (noir-lang/noir#6835) ([3883a0e](3883a0e)) * Track nodejs runtime metrics ([#11160](#11160)) ([1d24fab](1d24fab)) * Turn CannotReexportItemWithLessVisibility into an error (noir-lang/noir#6952) ([3883a0e](3883a0e)) * Turn TypeIsMorePrivateThenItem into an error (noir-lang/noir#6953) ([3883a0e](3883a0e)) * Type-check trait default methods (noir-lang/noir#6645) ([3883a0e](3883a0e)) * Unchecked math operations in SSA (noir-lang/noir#7011) ([9189120](9189120)) * Update `aes128_encrypt` to return an array (noir-lang/noir#6973) ([3883a0e](3883a0e)) * Use tail public inputs as transaction hash ([#11100](#11100)) ([34be2c3](34be2c3)) * Validator deadline for reexecution ([#11050](#11050)) ([1aa34e7](1aa34e7)), closes [#10959](#10959) ### Bug Fixes * Added start/stop guards to running promise and serial queue ([#11120](#11120)) ([23e642f](23e642f)) * Allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987) ([9189120](9189120)) * **avm:** AVM circuit fixes related calldata, returndata and call_ptr ([#11207](#11207)) ([2f05dc0](2f05dc0)) * **avm:** Mac build ([#11195](#11195)) ([c4f4452](c4f4452)) * **avm:** Mac build (retry) ([#11197](#11197)) ([0a4b763](0a4b763)) * Aztec-spartan config var ([#11137](#11137)) ([acbfad4](acbfad4)) * Blob fees & l1-publisher logging ([#11029](#11029)) ([c2c0bc6](c2c0bc6)) * **bootstrap:** Don't download bad cache if unstaged changes ([#11198](#11198)) ([2bd895b](2bd895b)) * **boxes:** Fix attempt 2 ([#11175](#11175)) ([e87b11a](e87b11a)) * Bump inotify limits on tester ([#11217](#11217)) ([60bdf1d](60bdf1d)) * Do not emit range check for multiplication by bool (noir-lang/noir#6983) ([3883a0e](3883a0e)) * Do not panic on indices which are not valid `u32`s (noir-lang/noir#6976) ([3883a0e](3883a0e)) * Docs rebuild patterns ([#11191](#11191)) ([1999990](1999990)) * Don't fail parsing macro if there are parser warnings (noir-lang/noir#6969) ([3883a0e](3883a0e)) * Don't retransmit txs upon node restart ([#11123](#11123)) ([39535c9](39535c9)) * Duplicate env vars ([#11166](#11166)) ([2507b6f](2507b6f)) * Error on missing function parameters (noir-lang/noir#6967) ([3883a0e](3883a0e)) * Get_next_power_exponent off by 1 ([#11169](#11169)) ([80ec19e](80ec19e)) * Let static_assert fail with the provided message (noir-lang/noir#7005) ([9189120](9189120)) * Max_note_len computation ([#10438](#10438)) ([099c17b](099c17b)) * Non-determinism from under constrained checks (noir-lang/noir#6945) ([3883a0e](3883a0e)) * Prover node aborts execution at epoch end ([#11111](#11111)) ([2a77616](2a77616)), closes [#10802](#10802) * Prover node does not err upon an empty epoch ([#11204](#11204)) ([2c3ab84](2c3ab84)) * Remove arch tag in sandbox images ([#11233](#11233)) ([80a872d](80a872d)) * Remove max lookup table size constant (for now) ([#11095](#11095)) ([7e9e268](7e9e268)) * Reproduce and fix bytecode blowup (noir-lang/noir#6972) ([9189120](9189120)) * Require generic trait impls to be in scope to call them (noir-lang/noir#6913) ([9189120](9189120)) * Restore upload_logs script in use by acir bench ([2d88497](2d88497)) * Return trait impl method as FuncId if there's only one (noir-lang/noir#6989) ([9189120](9189120)) * Revert "chore: use L1 Tx Utils" ([#11167](#11167)) ([f4e5c79](f4e5c79)) * Sequencer times out L1 tx at end of L2 slot ([#11112](#11112)) ([1b88a34](1b88a34)) * Show output of `test_program_is_idempotent` on failure (noir-lang/noir#6942) ([3883a0e](3883a0e)) * Start RC at 1 again (noir-lang/noir#6958) ([3883a0e](3883a0e)) * Underconstrained bug ([#11174](#11174)) ([0b3088b](0b3088b)) * Update fs max user instances for k8s ([#11220](#11220)) ([b42da6d](b42da6d)) * Use absolute path for docker bind in e2e-test ([f2885ec](f2885ec)) * Wrong module to lookup trait when using crate or super (noir-lang/noir#6974) ([3883a0e](3883a0e)) ### Miscellaneous * Add cli option to specify withdrawer address in the add-l1-validator … ([#11199](#11199)) ([107f175](107f175)) * Add memsuspend to parallel in bootstrap ([#11040](#11040)) ([c78cb82](c78cb82)) * Add more Field use info (noir-lang/noir#7019) ([9189120](9189120)) * Add reproduction case for bignum test failure (noir-lang/noir#6464) ([3883a0e](3883a0e)) * Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007) ([9189120](9189120)) * Also print test output to stdout in CI (noir-lang/noir#6930) ([3883a0e](3883a0e)) * **avm:** Fix mac build ([#11147](#11147)) ([1775e53](1775e53)) * **avm:** Improve column stats ([#11135](#11135)) ([535a14c](535a14c)) * **avm:** Re-enable bb-prover tests in CI, change some to check-circuit-only, enable multi-enqueued call tests ([#11180](#11180)) ([3092212](3092212)) * **avm:** Vm2 followup cleanup ([#11186](#11186)) ([6de4013](6de4013)) * Block building benchmark via github-action-benchmark ([#11202](#11202)) ([c107b6b](c107b6b)), closes [#11154](#11154) * Bump `noir-gates-diff` (noir-lang/noir#6943) ([3883a0e](3883a0e)) * Bump `noir-gates-diff` (noir-lang/noir#6944) ([3883a0e](3883a0e)) * Bump `noir-gates-diff` (noir-lang/noir#6949) ([3883a0e](3883a0e)) * Bump arkworks to version `0.5.0` (noir-lang/noir#6871) ([3883a0e](3883a0e)) * **ci:** Easier to use mac ci ([#11194](#11194)) ([9ab4cee](9ab4cee)) * **ci:** Ensure that prover.toml files in protocol circuits are in sync ([#11141](#11141)) ([db769bd](db769bd)) * **ci:** Fail properly in `external-repo-checks` (noir-lang/noir#6988) ([9189120](9189120)) * **ci:** Try fix boxes-test ([#11162](#11162)) ([a66349f](a66349f)) * Clarity fix in docs (noir-lang/noir#7016) ([9189120](9189120)) * Delete a bunch of dead code from `noirc_evaluator` (noir-lang/noir#6939) ([3883a0e](3883a0e)) * Delete docs for versions which aren't used (noir-lang/noir#7020) ([9189120](9189120)) * Disable reorg test ([#11176](#11176)) ([78bec44](78bec44)) * Disallow inserting ACIR-only instructions into brillig functions (noir-lang/noir#7017) ([9189120](9189120)) * **docs:** Backport 1.0.0-beta.0 doc fixes (noir-lang/noir#7014) ([9189120](9189120)) * **docs:** Edit Aztec.nr Guide section ([#10866](#10866)) ([4051ba8](4051ba8)) * **docs:** Remove node pages ([#11161](#11161)) ([e494f6b](e494f6b)) * **docs:** Update tx concepts page ([#10947](#10947)) ([d9d9798](d9d9798)) * Document aztec-nargo in readme ([#11173](#11173)) ([927eabf](927eabf)) * Greater stability at 1TPS ([#10981](#10981)) ([1c23662](1c23662)) * Jest reporters for CI ([#11125](#11125)) ([90cd9d2](90cd9d2)) * Log number of instructions executed for call in AVM. Misc fix. ([#11110](#11110)) ([44e01f4](44e01f4)) * Mark `aztec-nr` as expected to compile (noir-lang/noir#7015) ([9189120](9189120)) * Mark casts as able to be deduplicated (noir-lang/noir#6996) ([9189120](9189120)) * Missed test account retrieval simplification in one spot ([#11172](#11172)) ([b72234e](b72234e)) * Move comment as part of [#6945](#6945) (noir-lang/noir#6959) ([3883a0e](3883a0e)) * Move witness computation into class plus some other cleanup ([#11140](#11140)) ([d41e9ab](d41e9ab)) * Nuke unused `getSiblingPath` oracle ([#11090](#11090)) ([36b640a](36b640a)) * Nuking mental model of "packing into a hash" ([#11200](#11200)) ([e1ebcc0](e1ebcc0)) * Only resolved globals monomorphization (noir-lang/noir#7006) ([9189120](9189120)) * Prover db config ([#11126](#11126)) ([9d49393](9d49393)), closes [#10267](#10267) * Redo typo PR by longxiangqiao ([#11109](#11109)) ([b8ef30e](b8ef30e)) * Refactor `get_tx_effects_hash_input_helper` ([#11213](#11213)) ([5becb99](5becb99)) * Refactor Solidity Transcript and improve error handling in sol_honk flow ([#11158](#11158)) ([58fdf87](58fdf87)) * Remove explicit collector address ([#11227](#11227)) ([dfb0db5](dfb0db5)) * Remove resolve_is_unconstrained pass (noir-lang/noir#7004) ([9189120](9189120)) * Removing noir bug workaround ([#10535](#10535)) ([8be882f](8be882f)) * Replace relative paths to noir-protocol-circuits ([d8619fa](d8619fa)) * Replace relative paths to noir-protocol-circuits ([70cad1c](70cad1c)) * Replace relative paths to noir-protocol-circuits ([e962534](e962534)) * Replace relative paths to noir-protocol-circuits ([ba5a589](ba5a589)) * Replace relative paths to noir-protocol-circuits ([b7c3fa2](b7c3fa2)) * Replace relative paths to noir-protocol-circuits ([32840c6](32840c6)) * Require safety doc comment for unsafe instead of `//[@safety](https://github.com/safety)` (noir-lang/noir#6992) ([9189120](9189120)) * Reserve `enum` and `match` keywords (noir-lang/noir#6961) ([9189120](9189120)) * Rpc server cleanup & misc fixes ([#11145](#11145)) ([8a927eb](8a927eb)) * Sanity checking of proving job IDs ([#11134](#11134)) ([61c3e95](61c3e95)) * Save kind smoke test logs as artifact ([#11212](#11212)) ([1389a5b](1389a5b)) * Separate unconstrained functions during monomorphization (noir-lang/noir#6894) ([3883a0e](3883a0e)) * Simplify a couple of enum variants (noir-lang/noir#7025) ([9189120](9189120)) * Simplify boolean in a mul of a mul (noir-lang/noir#6951) ([3883a0e](3883a0e)) * SmallSubgroupIPA tests ([#11106](#11106)) ([f034e2a](f034e2a)) * **spartan:** Making the spartan script install jq ([#11231](#11231)) ([7e628cc](7e628cc)) * Test:e2e defaults to no-docker ([#10966](#10966)) ([15e0d71](15e0d71)) * Turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999) ([9189120](9189120)) * Update aztec-spartan.sh script ([#11228](#11228)) ([52b3a87](52b3a87)) * Use DFG in SSA printer (noir-lang/noir#6986) ([9189120](9189120)) * Use L1 Tx Utils ([#10759](#10759)) ([ccf28f5](ccf28f5)), closes [#10464](#10464) * Use logs for benchmarking (noir-lang/noir#6911) ([3883a0e](3883a0e)) * VariableMerkleTree readability improvements ([#11165](#11165)) ([010d1b0](010d1b0)) * Wait for ethereum in each pod ([#11238](#11238)) ([9c08e00](9c08e00)) ### Documentation * Enable protocol specs for docs in dev mode ([#11219](#11219)) ([10c8afe](10c8afe)) </details> <details><summary>barretenberg: 0.70.0</summary> ## [0.70.0](barretenberg-v0.69.1...barretenberg-v0.70.0) (2025-01-15) ### Features * **avm2:** Avm redesign init ([#10906](#10906)) ([231f017](231f017)) * Permutation argument optimizations ([#10960](#10960)) ([de99603](de99603)) * Use tail public inputs as transaction hash ([#11100](#11100)) ([34be2c3](34be2c3)) ### Bug Fixes * **avm:** AVM circuit fixes related calldata, returndata and call_ptr ([#11207](#11207)) ([2f05dc0](2f05dc0)) * **avm:** Mac build ([#11195](#11195)) ([c4f4452](c4f4452)) * **avm:** Mac build (retry) ([#11197](#11197)) ([0a4b763](0a4b763)) * **bootstrap:** Don't download bad cache if unstaged changes ([#11198](#11198)) ([2bd895b](2bd895b)) * Remove max lookup table size constant (for now) ([#11095](#11095)) ([7e9e268](7e9e268)) ### Miscellaneous * **avm:** Fix mac build ([#11147](#11147)) ([1775e53](1775e53)) * **avm:** Improve column stats ([#11135](#11135)) ([535a14c](535a14c)) * **avm:** Re-enable bb-prover tests in CI, change some to check-circuit-only, enable multi-enqueued call tests ([#11180](#11180)) ([3092212](3092212)) * **avm:** Vm2 followup cleanup ([#11186](#11186)) ([6de4013](6de4013)) * **docs:** Update tx concepts page ([#10947](#10947)) ([d9d9798](d9d9798)) * Move witness computation into class plus some other cleanup ([#11140](#11140)) ([d41e9ab](d41e9ab)) * Redo typo PR by longxiangqiao ([#11109](#11109)) ([b8ef30e](b8ef30e)) * Refactor Solidity Transcript and improve error handling in sol_honk flow ([#11158](#11158)) ([58fdf87](58fdf87)) * SmallSubgroupIPA tests ([#11106](#11106)) ([f034e2a](f034e2a)) </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 contains the following changes: