@aztec/prover-client 0.0.1-commit.c2eed6949 → 0.0.1-commit.c52d6e7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dest/config.d.ts +1 -1
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +4 -0
  4. package/dest/light/lightweight_checkpoint_builder.d.ts +1 -1
  5. package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -1
  6. package/dest/light/lightweight_checkpoint_builder.js +15 -5
  7. package/dest/mocks/fixtures.d.ts +1 -1
  8. package/dest/mocks/fixtures.d.ts.map +1 -1
  9. package/dest/mocks/fixtures.js +3 -3
  10. package/dest/mocks/test_context.d.ts +11 -11
  11. package/dest/mocks/test_context.d.ts.map +1 -1
  12. package/dest/mocks/test_context.js +22 -26
  13. package/dest/orchestrator/block-building-helpers.d.ts +1 -1
  14. package/dest/orchestrator/checkpoint-proving-state.d.ts +20 -36
  15. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -1
  16. package/dest/orchestrator/checkpoint-proving-state.js +22 -120
  17. package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts +161 -0
  18. package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts.map +1 -0
  19. package/dest/orchestrator/{orchestrator.js → checkpoint-sub-tree-orchestrator.js} +267 -451
  20. package/dest/orchestrator/chonk-cache.d.ts +39 -0
  21. package/dest/orchestrator/chonk-cache.d.ts.map +1 -0
  22. package/dest/orchestrator/chonk-cache.js +80 -0
  23. package/dest/orchestrator/index.d.ts +4 -2
  24. package/dest/orchestrator/index.d.ts.map +1 -1
  25. package/dest/orchestrator/index.js +3 -1
  26. package/dest/orchestrator/proving-scheduler.d.ts +81 -0
  27. package/dest/orchestrator/proving-scheduler.d.ts.map +1 -0
  28. package/dest/orchestrator/proving-scheduler.js +120 -0
  29. package/dest/orchestrator/top-tree-orchestrator.d.ts +88 -0
  30. package/dest/orchestrator/top-tree-orchestrator.d.ts.map +1 -0
  31. package/dest/orchestrator/top-tree-orchestrator.js +232 -0
  32. package/dest/orchestrator/top-tree-proving-state.d.ts +61 -0
  33. package/dest/orchestrator/top-tree-proving-state.d.ts.map +1 -0
  34. package/dest/orchestrator/top-tree-proving-state.js +185 -0
  35. package/dest/orchestrator/tx-proving-state.d.ts +3 -3
  36. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  37. package/dest/prover-client/prover-client.d.ts +61 -4
  38. package/dest/prover-client/prover-client.d.ts.map +1 -1
  39. package/dest/prover-client/prover-client.js +54 -7
  40. package/dest/proving_broker/broker_prover_facade.d.ts +3 -3
  41. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  42. package/dest/proving_broker/broker_prover_facade.js +13 -1
  43. package/dest/proving_broker/config.d.ts +8 -72
  44. package/dest/proving_broker/config.d.ts.map +1 -1
  45. package/dest/proving_broker/config.js +2 -2
  46. package/dest/proving_broker/index.d.ts +2 -1
  47. package/dest/proving_broker/index.d.ts.map +1 -1
  48. package/dest/proving_broker/index.js +1 -0
  49. package/dest/proving_broker/proving_broker.d.ts +3 -2
  50. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  51. package/dest/proving_broker/proving_broker.js +219 -76
  52. package/dest/proving_broker/proving_broker_database/memory.d.ts +5 -2
  53. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  54. package/dest/proving_broker/proving_broker_database/memory.js +14 -1
  55. package/dest/proving_broker/proving_broker_database/persisted.d.ts +15 -2
  56. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  57. package/dest/proving_broker/proving_broker_database/persisted.js +57 -6
  58. package/dest/proving_broker/proving_broker_database.d.ts +27 -1
  59. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  60. package/dest/proving_broker/rpc.d.ts +15 -4
  61. package/dest/proving_broker/rpc.d.ts.map +1 -1
  62. package/dest/proving_broker/rpc.js +91 -24
  63. package/dest/test/epoch_settlement.d.ts +36 -0
  64. package/dest/test/epoch_settlement.d.ts.map +1 -0
  65. package/dest/test/epoch_settlement.js +52 -0
  66. package/dest/test/index.d.ts +2 -0
  67. package/dest/test/index.d.ts.map +1 -0
  68. package/dest/test/index.js +1 -0
  69. package/dest/test/mock_prover.d.ts +1 -1
  70. package/dest/test/mock_prover.js +2 -2
  71. package/package.json +19 -18
  72. package/src/config.ts +5 -0
  73. package/src/light/lightweight_checkpoint_builder.ts +16 -6
  74. package/src/mocks/fixtures.ts +2 -4
  75. package/src/mocks/test_context.ts +22 -40
  76. package/src/orchestrator/checkpoint-proving-state.ts +21 -162
  77. package/src/orchestrator/{orchestrator.ts → checkpoint-sub-tree-orchestrator.ts} +415 -661
  78. package/src/orchestrator/chonk-cache.ts +99 -0
  79. package/src/orchestrator/index.ts +8 -1
  80. package/src/orchestrator/proving-scheduler.ts +160 -0
  81. package/src/orchestrator/top-tree-orchestrator.ts +384 -0
  82. package/src/orchestrator/top-tree-proving-state.ts +219 -0
  83. package/src/orchestrator/tx-proving-state.ts +3 -3
  84. package/src/prover-client/prover-client.ts +128 -18
  85. package/src/proving_broker/broker_prover_facade.ts +12 -3
  86. package/src/proving_broker/config.ts +2 -1
  87. package/src/proving_broker/index.ts +1 -0
  88. package/src/proving_broker/proving_broker.ts +209 -78
  89. package/src/proving_broker/proving_broker_database/memory.ts +16 -2
  90. package/src/proving_broker/proving_broker_database/persisted.ts +71 -8
  91. package/src/proving_broker/proving_broker_database.ts +30 -0
  92. package/src/proving_broker/rpc.ts +52 -24
  93. package/src/test/epoch_settlement.ts +82 -0
  94. package/src/test/index.ts +1 -0
  95. package/src/test/mock_prover.ts +2 -2
  96. package/dest/orchestrator/epoch-proving-state.d.ts +0 -75
  97. package/dest/orchestrator/epoch-proving-state.d.ts.map +0 -1
  98. package/dest/orchestrator/epoch-proving-state.js +0 -269
  99. package/dest/orchestrator/orchestrator.d.ts +0 -130
  100. package/dest/orchestrator/orchestrator.d.ts.map +0 -1
  101. package/dest/prover-client/server-epoch-prover.d.ts +0 -32
  102. package/dest/prover-client/server-epoch-prover.d.ts.map +0 -1
  103. package/dest/prover-client/server-epoch-prover.js +0 -40
  104. package/src/orchestrator/epoch-proving-state.ts +0 -380
  105. package/src/prover-client/server-epoch-prover.ts +0 -69
@@ -393,7 +393,7 @@ class SingleEpochDatabase {
393
393
  estimateSize() {
394
394
  return this.store.estimateSize();
395
395
  }
396
- async batchWrite(jobs, results) {
396
+ async batchWrite(jobs, results, deletedResults = []) {
397
397
  await this.store.transactionAsync(async ()=>{
398
398
  for (const job of jobs){
399
399
  await this.jobs.set(job.id, jsonStringify(job));
@@ -401,6 +401,11 @@ class SingleEpochDatabase {
401
401
  for (const [id, result] of results){
402
402
  await this.jobResults.set(id, jsonStringify(result));
403
403
  }
404
+ // Deletes are applied after sets so that, if a set and a delete for the same id land in one
405
+ // batch (e.g. an abort immediately followed by a revive's result-delete), the delete wins.
406
+ for (const id of deletedResults){
407
+ await this.jobResults.delete(id);
408
+ }
404
409
  });
405
410
  }
406
411
  async *allProvingJobs() {
@@ -414,6 +419,14 @@ class SingleEpochDatabase {
414
419
  ];
415
420
  }
416
421
  }
422
+ async getProvingJobInputs(id) {
423
+ const jobStr = await this.jobs.getAsync(id);
424
+ return jobStr ? jsonParseWithSchema(jobStr, ProvingJob).inputsUri : undefined;
425
+ }
426
+ async getProvingJobResult(id) {
427
+ const resultStr = await this.jobResults.getAsync(id);
428
+ return resultStr ? jsonParseWithSchema(resultStr, ProvingJobSettledResult) : undefined;
429
+ }
417
430
  async setProvingJobError(id, reason) {
418
431
  const result = {
419
432
  status: 'rejected',
@@ -421,6 +434,12 @@ class SingleEpochDatabase {
421
434
  };
422
435
  await this.jobResults.set(id, jsonStringify(result));
423
436
  }
437
+ async setProvingJobAborted(id) {
438
+ const result = {
439
+ status: 'aborted'
440
+ };
441
+ await this.jobResults.set(id, jsonStringify(result));
442
+ }
424
443
  async setProvingJobResult(id, value) {
425
444
  const result = {
426
445
  status: 'fulfilled',
@@ -468,9 +487,11 @@ export class KVBrokerDatabase {
468
487
  // exposed for testing
469
488
  async commitWrites(items, epochNumber) {
470
489
  const jobsToAdd = items.filter((item)=>'id' in item);
471
- const resultsToAdd = items.filter((item)=>Array.isArray(item));
490
+ const resultOps = items.filter((item)=>Array.isArray(item));
491
+ const resultsToSet = resultOps.filter((op)=>op[1] !== undefined);
492
+ const resultsToDelete = resultOps.filter((op)=>op[1] === undefined).map(([id])=>id);
472
493
  const db = await this.getEpochDatabase(EpochNumber(epochNumber));
473
- await db.batchWrite(jobsToAdd, resultsToAdd);
494
+ await db.batchWrite(jobsToAdd, resultsToSet, resultsToDelete);
474
495
  }
475
496
  async estimateSize() {
476
497
  const sizes = await Promise.all(Array.from(this.epochs.values()).map((x)=>x.estimateSize()));
@@ -499,7 +520,7 @@ export class KVBrokerDatabase {
499
520
  continue;
500
521
  }
501
522
  logger.info(`Loading broker database for epoch ${epochNumber} from ${fullDirectory} with map size ${config.dataStoreMapSizeKb}KB`);
502
- const db = await openVersionedStoreAt(fullDirectory, SingleEpochDatabase.SCHEMA_VERSION, config.l1Contracts.rollupAddress, config.dataStoreMapSizeKb);
523
+ const db = await openVersionedStoreAt(fullDirectory, SingleEpochDatabase.SCHEMA_VERSION, config.rollupAddress, config.dataStoreMapSizeKb);
503
524
  const epochDb = new SingleEpochDatabase(db);
504
525
  epochs.set(epochNumber, epochDb);
505
526
  }
@@ -528,8 +549,13 @@ export class KVBrokerDatabase {
528
549
  this.epochs.delete(old);
529
550
  }
530
551
  }
552
+ // Key jobs by the id-derived epoch, the same epoch results are written under (setProvingJobResult et
553
+ // al.). This keeps a job's inputs and its result co-located in one epoch database so both can be read
554
+ // back with a single keyed lookup (getProvingJobInputs/getProvingJobResult) rather than a scan. The id
555
+ // embeds the epoch and equals `job.epochNumber` at every construction site, so this matches the prior
556
+ // storage epoch while making the id the single source of truth for placement.
531
557
  addProvingJob(job) {
532
- return this.batchQueue.put(job, job.epochNumber);
558
+ return this.batchQueue.put(job, getEpochFromProvingJobId(job.id));
533
559
  }
534
560
  async *allProvingJobs() {
535
561
  const iterators = Array.from(this.epochs.values()).map((x)=>x.allProvingJobs());
@@ -537,6 +563,17 @@ export class KVBrokerDatabase {
537
563
  yield* it;
538
564
  }
539
565
  }
566
+ // A job id is `${epochNumber}:${type}:${inputsHash}`, so its epoch is recoverable directly and maps to
567
+ // exactly one epoch database. Results are already written under this same id-derived epoch (see
568
+ // setProvingJobResult et al.), and a job's `epochNumber` equals its id-epoch at every construction site,
569
+ // so inputs live there too. Use `epochs.get` (not `getEpochDatabase`, which would create the store on a
570
+ // miss) so a read for an unknown id has no side effects.
571
+ getProvingJobInputs(id) {
572
+ return this.epochs.get(getEpochFromProvingJobId(id))?.getProvingJobInputs(id) ?? Promise.resolve(undefined);
573
+ }
574
+ getProvingJobResult(id) {
575
+ return this.epochs.get(getEpochFromProvingJobId(id))?.getProvingJobResult(id) ?? Promise.resolve(undefined);
576
+ }
540
577
  setProvingJobError(id, reason) {
541
578
  return this.batchQueue.put([
542
579
  id,
@@ -546,6 +583,20 @@ export class KVBrokerDatabase {
546
583
  }
547
584
  ], getEpochFromProvingJobId(id));
548
585
  }
586
+ setProvingJobAborted(id) {
587
+ return this.batchQueue.put([
588
+ id,
589
+ {
590
+ status: 'aborted'
591
+ }
592
+ ], getEpochFromProvingJobId(id));
593
+ }
594
+ deleteProvingJobResult(id) {
595
+ return this.batchQueue.put([
596
+ id,
597
+ undefined
598
+ ], getEpochFromProvingJobId(id));
599
+ }
549
600
  setProvingJobResult(id, value) {
550
601
  return this.batchQueue.put([
551
602
  id,
@@ -563,7 +614,7 @@ export class KVBrokerDatabase {
563
614
  recursive: true
564
615
  });
565
616
  this.logger.info(`Creating broker database for epoch ${epochNumber} at ${newEpochDirectory} with map size ${this.config.dataStoreMapSizeKb}`);
566
- const db = await openVersionedStoreAt(newEpochDirectory, SingleEpochDatabase.SCHEMA_VERSION, this.config.l1Contracts.rollupAddress, this.config.dataStoreMapSizeKb);
617
+ const db = await openVersionedStoreAt(newEpochDirectory, SingleEpochDatabase.SCHEMA_VERSION, this.config.rollupAddress, this.config.dataStoreMapSizeKb);
567
618
  epochDb = new SingleEpochDatabase(db);
568
619
  this.epochs.set(epochNumber, epochDb);
569
620
  }
@@ -18,6 +18,18 @@ export interface ProvingBrokerDatabase {
18
18
  * Returns an iterator over all saved proving jobs
19
19
  */
20
20
  allProvingJobs(): AsyncIterableIterator<[ProvingJob, ProvingJobSettledResult | undefined]>;
21
+ /**
22
+ * Reads a single job's inputs URI by id, or undefined if the job is unknown. The broker keeps only
23
+ * job metadata in memory and reads the (large) inputs from here on demand when dispatching to an agent.
24
+ * @param id - The ID of the proof request
25
+ */
26
+ getProvingJobInputs(id: ProvingJobId): Promise<ProofUri | undefined>;
27
+ /**
28
+ * Reads a single job's settled result by id, or undefined if not settled. The broker keeps only the
29
+ * settled status in memory and reads the (large) fulfilled proof from here on demand.
30
+ * @param id - The ID of the proof request
31
+ */
32
+ getProvingJobResult(id: ProvingJobId): Promise<ProvingJobSettledResult | undefined>;
21
33
  /**
22
34
  * Saves the result of a proof request
23
35
  * @param id - The ID of the proof request to save the result for
@@ -32,9 +44,23 @@ export interface ProvingBrokerDatabase {
32
44
  * @param err - The error that occurred while processing the proof request
33
45
  */
34
46
  setProvingJobError(id: ProvingJobId, err: string): Promise<void>;
47
+ /**
48
+ * Records that a proof request was cancelled. Unlike a result or error this is not terminal:
49
+ * re-enqueuing the same job id revives it, so the aborted state can survive a restart without
50
+ * permanently blocking the proof.
51
+ * @param id - The ID of the cancelled proof request
52
+ */
53
+ setProvingJobAborted(id: ProvingJobId): Promise<void>;
54
+ /**
55
+ * Clears any stored result for a proof request, returning it to the pending state while keeping
56
+ * the job itself. Used when reviving an aborted job so the revival is persisted and a restart
57
+ * cannot resurrect the stale aborted state.
58
+ * @param id - The ID of the proof request whose result should be cleared
59
+ */
60
+ deleteProvingJobResult(id: ProvingJobId): Promise<void>;
35
61
  /**
36
62
  * Closes the database
37
63
  */
38
64
  close(): Promise<void>;
39
65
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmluZ19icm9rZXJfZGF0YWJhc2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aW5nX2Jyb2tlci9wcm92aW5nX2Jyb2tlcl9kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuSDs7R0FFRztBQUNILE1BQU0sV0FBVyxxQkFBcUI7SUFDcEM7OztPQUdHO0lBQ0gsYUFBYSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlDOzs7T0FHRztJQUNILGtDQUFrQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTVFOztPQUVHO0lBQ0gsY0FBYyxJQUFJLHFCQUFxQixDQUFDLENBQUMsVUFBVSxFQUFFLHVCQUF1QixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFM0Y7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRFOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqRTs7T0FFRztJQUNILEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDeEIifQ==
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmluZ19icm9rZXJfZGF0YWJhc2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aW5nX2Jyb2tlci9wcm92aW5nX2Jyb2tlcl9kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuSDs7R0FFRztBQUNILE1BQU0sV0FBVyxxQkFBcUI7SUFDcEM7OztPQUdHO0lBQ0gsYUFBYSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlDOzs7T0FHRztJQUNILGtDQUFrQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTVFOztPQUVHO0lBQ0gsY0FBYyxJQUFJLHFCQUFxQixDQUFDLENBQUMsVUFBVSxFQUFFLHVCQUF1QixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFM0Y7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLEVBQUUsRUFBRSxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUVyRTs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsRUFBRSxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFcEY7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRFOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqRTs7Ozs7T0FLRztJQUNILG9CQUFvQixDQUFDLEVBQUUsRUFBRSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXREOzs7OztPQUtHO0lBQ0gsc0JBQXNCLENBQUMsRUFBRSxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFeEQ7O09BRUc7SUFDSCxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3hCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"proving_broker_database.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proving_broker_database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;OAGG;IACH,kCAAkC,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;OAEG;IACH,cAAc,IAAI,qBAAqB,CAAC,CAAC,UAAU,EAAE,uBAAuB,GAAG,SAAS,CAAC,CAAC,CAAC;IAE3F;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
1
+ {"version":3,"file":"proving_broker_database.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proving_broker_database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;OAGG;IACH,kCAAkC,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;OAEG;IACH,cAAc,IAAI,qBAAqB,CAAC,CAAC,UAAU,EAAE,uBAAuB,GAAG,SAAS,CAAC,CAAC,CAAC;IAE3F;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAErE;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC;IAEpF;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
@@ -1,6 +1,17 @@
1
1
  import { type ProvingJobBroker, type ProvingJobBrokerDebug, type ProvingJobConsumer, type ProvingJobProducer } from '@aztec/stdlib/interfaces/server';
2
2
  import { type ApiSchemaFor } from '@aztec/stdlib/schemas';
3
3
  import { type ComponentsVersions } from '@aztec/stdlib/versioning';
4
+ /**
5
+ * Max JSON-RPC request body the broker clients will send.
6
+ *
7
+ * Job inputs and proof results travel inline as `data:` URIs on this path, so a single call is routinely larger than
8
+ * the 1 mb the generic JSON-RPC client allows — that default sizes batches of small node requests against the node
9
+ * server's own default. An AVM (`PUBLIC_VM`) result is around 1.3 mb today. This value must stay at or below the
10
+ * broker server's `RPC_MAX_BODY_SIZE`, which deployments set to 50mb.
11
+ */
12
+ export declare const PROVER_BROKER_MAX_REQUEST_BODY_SIZE: number;
13
+ /** Indefinite backoff for broker communication: 1, 1, 1, 2, 4, 4, 4, ... seconds. */
14
+ export declare function proverBrokerBackoff(): Generator<number, void, unknown>;
4
15
  export declare const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer>;
5
16
  export declare const ProvingJobConsumerSchema: ApiSchemaFor<ProvingJobConsumer>;
6
17
  export declare const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker>;
@@ -11,17 +22,17 @@ export declare function createProvingJobBrokerClient(url: string, versions: Part
11
22
  headers: {
12
23
  get: (header: string) => string | null | undefined;
13
24
  };
14
- }>): ProvingJobBroker;
25
+ }>, maxRequestBodySize?: number): ProvingJobBroker;
15
26
  export declare function createProvingJobProducerClient(url: string, versions: Partial<ComponentsVersions>, fetch?: (host: string, body: unknown, extraHeaders?: Record<string, string> | undefined, noRetry?: boolean | undefined) => Promise<{
16
27
  response: any;
17
28
  headers: {
18
29
  get: (header: string) => string | null | undefined;
19
30
  };
20
- }>): ProvingJobProducer;
31
+ }>, maxRequestBodySize?: number): ProvingJobProducer;
21
32
  export declare function createProvingJobConsumerClient(url: string, versions: Partial<ComponentsVersions>, fetch?: (host: string, body: unknown, extraHeaders?: Record<string, string> | undefined, noRetry?: boolean | undefined) => Promise<{
22
33
  response: any;
23
34
  headers: {
24
35
  get: (header: string) => string | null | undefined;
25
36
  };
26
- }>): ProvingJobConsumer;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnBjLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmluZ19icm9rZXIvcnBjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFJTCxLQUFLLGdCQUFnQixFQUNyQixLQUFLLHFCQUFxQixFQUMxQixLQUFLLGtCQUFrQixFQUV2QixLQUFLLGtCQUFrQixFQUV4QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBWSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFnQyxNQUFNLDBCQUEwQixDQUFDO0FBY2pHLGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxZQUFZLENBQUMsa0JBQWtCLENBS3JFLENBQUM7QUFFRixlQUFPLE1BQU0sd0JBQXdCLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixDQWNyRSxDQUFDO0FBRUYsZUFBTyxNQUFNLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxnQkFBZ0IsQ0FHakUsQ0FBQztBQUVGLGVBQU8sTUFBTSwyQkFBMkIsRUFBRSxZQUFZLENBQUMscUJBQXFCLENBSzNFLENBQUM7QUFFRixlQUFPLE1BQU0sK0JBQStCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixHQUFHLHFCQUFxQixDQUdsRyxDQUFDO0FBRUYsd0JBQWdCLDRCQUE0QixDQUMxQyxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFDckMsS0FBSzs7Ozs7RUFBb0MsR0FDeEMsZ0JBQWdCLENBTWxCO0FBRUQsd0JBQWdCLDhCQUE4QixDQUM1QyxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFDckMsS0FBSzs7Ozs7RUFBb0MsR0FDeEMsa0JBQWtCLENBTXBCO0FBRUQsd0JBQWdCLDhCQUE4QixDQUM1QyxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFDckMsS0FBSzs7Ozs7RUFBb0MsR0FDeEMsa0JBQWtCLENBTXBCIn0=
37
+ }>, maxRequestBodySize?: number): ProvingJobConsumer;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnBjLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmluZ19icm9rZXIvcnBjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFJTCxLQUFLLGdCQUFnQixFQUNyQixLQUFLLHFCQUFxQixFQUMxQixLQUFLLGtCQUFrQixFQUV2QixLQUFLLGtCQUFrQixFQUV4QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBWSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFnQyxNQUFNLDBCQUEwQixDQUFDO0FBS2pHOzs7Ozs7O0dBT0c7QUFDSCxlQUFPLE1BQU0sbUNBQW1DLFFBQW1CLENBQUM7QUFFcEUscUZBQXFGO0FBQ3JGLHdCQUFpQixtQkFBbUIscUNBTW5DO0FBV0QsZUFBTyxNQUFNLHdCQUF3QixFQUFFLFlBQVksQ0FBQyxrQkFBa0IsQ0FLckUsQ0FBQztBQUVGLGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxZQUFZLENBQUMsa0JBQWtCLENBaUJyRSxDQUFDO0FBRUYsZUFBTyxNQUFNLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxnQkFBZ0IsQ0FHakUsQ0FBQztBQUVGLGVBQU8sTUFBTSwyQkFBMkIsRUFBRSxZQUFZLENBQUMscUJBQXFCLENBSzNFLENBQUM7QUFFRixlQUFPLE1BQU0sK0JBQStCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixHQUFHLHFCQUFxQixDQUdsRyxDQUFDO0FBRUYsd0JBQWdCLDRCQUE0QixDQUMxQyxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFDckMsS0FBSzs7Ozs7RUFBOEMsRUFDbkQsa0JBQWtCLFNBQXNDLEdBQ3ZELGdCQUFnQixDQU9sQjtBQUVELHdCQUFnQiw4QkFBOEIsQ0FDNUMsR0FBRyxFQUFFLE1BQU0sRUFDWCxRQUFRLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQ3JDLEtBQUs7Ozs7O0VBQThDLEVBQ25ELGtCQUFrQixTQUFzQyxHQUN2RCxrQkFBa0IsQ0FPcEI7QUFFRCx3QkFBZ0IsOEJBQThCLENBQzVDLEdBQUcsRUFBRSxNQUFNLEVBQ1gsUUFBUSxFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxFQUNyQyxLQUFLOzs7OztFQUE4QyxFQUNuRCxrQkFBa0IsU0FBc0MsR0FDdkQsa0JBQWtCLENBT3BCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/proving_broker/rpc.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAgC,MAAM,0BAA0B,CAAC;AAcjG,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAKrE,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAcrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,YAAY,CAAC,gBAAgB,CAGjE,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,YAAY,CAAC,qBAAqB,CAK3E,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,YAAY,CAAC,gBAAgB,GAAG,qBAAqB,CAGlG,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,gBAAgB,CAMlB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,kBAAkB,CAMpB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,kBAAkB,CAMpB"}
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/proving_broker/rpc.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAgC,MAAM,0BAA0B,CAAC;AAKjG;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,QAAmB,CAAC;AAEpE,qFAAqF;AACrF,wBAAiB,mBAAmB,qCAMnC;AAWD,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAKrE,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAiBrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,YAAY,CAAC,gBAAgB,CAGjE,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,YAAY,CAAC,qBAAqB,CAK3E,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,YAAY,CAAC,gBAAgB,GAAG,qBAAqB,CAGlG,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAA8C,EACnD,kBAAkB,SAAsC,GACvD,gBAAgB,CAOlB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAA8C,EACnD,kBAAkB,SAAsC,GACvD,kBAAkB,CAOpB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAA8C,EACnD,kBAAkB,SAAsC,GACvD,kBAAkB,CAOpB"}
@@ -6,6 +6,27 @@ import { optional } from '@aztec/stdlib/schemas';
6
6
  import { getVersioningResponseHandler } from '@aztec/stdlib/versioning';
7
7
  import { makeTracedFetch } from '@aztec/telemetry-client';
8
8
  import { z } from 'zod';
9
+ /**
10
+ * Max JSON-RPC request body the broker clients will send.
11
+ *
12
+ * Job inputs and proof results travel inline as `data:` URIs on this path, so a single call is routinely larger than
13
+ * the 1 mb the generic JSON-RPC client allows — that default sizes batches of small node requests against the node
14
+ * server's own default. An AVM (`PUBLIC_VM`) result is around 1.3 mb today. This value must stay at or below the
15
+ * broker server's `RPC_MAX_BODY_SIZE`, which deployments set to 50mb.
16
+ */ export const PROVER_BROKER_MAX_REQUEST_BODY_SIZE = 50 * 1024 * 1024;
17
+ /** Indefinite backoff for broker communication: 1, 1, 1, 2, 4, 4, 4, ... seconds. */ export function* proverBrokerBackoff() {
18
+ const v = [
19
+ 1,
20
+ 1,
21
+ 1,
22
+ 2,
23
+ 4
24
+ ];
25
+ let i = 0;
26
+ while(true){
27
+ yield v[Math.min(i++, v.length - 1)];
28
+ }
29
+ }
9
30
  const ProvingJobFilterSchema = z.object({
10
31
  allowList: z.array(z.nativeEnum(ProvingRequestType))
11
32
  });
@@ -14,58 +35,104 @@ const GetProvingJobResponse = z.object({
14
35
  time: z.number()
15
36
  });
16
37
  export const ProvingJobProducerSchema = {
17
- enqueueProvingJob: z.function().args(ProvingJob).returns(ProvingJobStatus),
18
- getProvingJobStatus: z.function().args(ProvingJobId).returns(ProvingJobStatus),
19
- cancelProvingJob: z.function().args(ProvingJobId).returns(z.void()),
20
- getCompletedJobs: z.function().args(z.array(ProvingJobId)).returns(z.array(ProvingJobId))
38
+ enqueueProvingJob: z.function({
39
+ input: z.tuple([
40
+ ProvingJob
41
+ ]),
42
+ output: ProvingJobStatus
43
+ }),
44
+ getProvingJobStatus: z.function({
45
+ input: z.tuple([
46
+ ProvingJobId
47
+ ]),
48
+ output: ProvingJobStatus
49
+ }),
50
+ cancelProvingJob: z.function({
51
+ input: z.tuple([
52
+ ProvingJobId
53
+ ]),
54
+ output: z.void()
55
+ }),
56
+ getCompletedJobs: z.function({
57
+ input: z.tuple([
58
+ z.array(ProvingJobId)
59
+ ]),
60
+ output: z.array(ProvingJobId)
61
+ })
21
62
  };
22
63
  export const ProvingJobConsumerSchema = {
23
- getProvingJob: z.function().args(optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional()),
24
- reportProvingJobError: z.function().args(ProvingJobId, z.string(), optional(z.boolean()), optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional()),
25
- reportProvingJobProgress: z.function().args(ProvingJobId, z.number(), optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional()),
26
- reportProvingJobSuccess: z.function().args(ProvingJobId, ProofUri, optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional())
64
+ getProvingJob: z.function({
65
+ input: z.tuple([
66
+ optional(ProvingJobFilterSchema)
67
+ ]),
68
+ output: GetProvingJobResponse.optional()
69
+ }),
70
+ reportProvingJobError: z.function({
71
+ input: z.tuple([
72
+ ProvingJobId,
73
+ z.string(),
74
+ optional(z.boolean()),
75
+ optional(ProvingJobFilterSchema)
76
+ ]),
77
+ output: GetProvingJobResponse.optional()
78
+ }),
79
+ reportProvingJobProgress: z.function({
80
+ input: z.tuple([
81
+ ProvingJobId,
82
+ z.number(),
83
+ optional(ProvingJobFilterSchema)
84
+ ]),
85
+ output: GetProvingJobResponse.optional()
86
+ }),
87
+ reportProvingJobSuccess: z.function({
88
+ input: z.tuple([
89
+ ProvingJobId,
90
+ ProofUri,
91
+ optional(ProvingJobFilterSchema)
92
+ ]),
93
+ output: GetProvingJobResponse.optional()
94
+ })
27
95
  };
28
96
  export const ProvingJobBrokerSchema = {
29
97
  ...ProvingJobConsumerSchema,
30
98
  ...ProvingJobProducerSchema
31
99
  };
32
100
  export const ProvingJobBrokerDebugSchema = {
33
- replayProvingJob: z.function().args(ProvingJobId, z.nativeEnum(ProvingRequestType), EpochNumberSchema, ProofUri).returns(ProvingJobStatus)
101
+ replayProvingJob: z.function({
102
+ input: z.tuple([
103
+ ProvingJobId,
104
+ z.nativeEnum(ProvingRequestType),
105
+ EpochNumberSchema,
106
+ ProofUri
107
+ ]),
108
+ output: ProvingJobStatus
109
+ })
34
110
  };
35
111
  export const ProvingJobBrokerSchemaWithDebug = {
36
112
  ...ProvingJobBrokerSchema,
37
113
  ...ProvingJobBrokerDebugSchema
38
114
  };
39
- export function createProvingJobBrokerClient(url, versions, fetch = makeTracedFetch([
40
- 1,
41
- 2,
42
- 3
43
- ], false)) {
115
+ export function createProvingJobBrokerClient(url, versions, fetch = makeTracedFetch(proverBrokerBackoff, false), maxRequestBodySize = PROVER_BROKER_MAX_REQUEST_BODY_SIZE) {
44
116
  return createSafeJsonRpcClient(url, ProvingJobBrokerSchema, {
45
117
  namespaceMethods: 'proverBroker',
46
118
  fetch,
119
+ maxRequestBodySize,
47
120
  onResponse: getVersioningResponseHandler(versions)
48
121
  });
49
122
  }
50
- export function createProvingJobProducerClient(url, versions, fetch = makeTracedFetch([
51
- 1,
52
- 2,
53
- 3
54
- ], false)) {
123
+ export function createProvingJobProducerClient(url, versions, fetch = makeTracedFetch(proverBrokerBackoff, false), maxRequestBodySize = PROVER_BROKER_MAX_REQUEST_BODY_SIZE) {
55
124
  return createSafeJsonRpcClient(url, ProvingJobProducerSchema, {
56
125
  namespaceMethods: 'provingJobProducer',
57
126
  fetch,
127
+ maxRequestBodySize,
58
128
  onResponse: getVersioningResponseHandler(versions)
59
129
  });
60
130
  }
61
- export function createProvingJobConsumerClient(url, versions, fetch = makeTracedFetch([
62
- 1,
63
- 2,
64
- 3
65
- ], false)) {
131
+ export function createProvingJobConsumerClient(url, versions, fetch = makeTracedFetch(proverBrokerBackoff, false), maxRequestBodySize = PROVER_BROKER_MAX_REQUEST_BODY_SIZE) {
66
132
  return createSafeJsonRpcClient(url, ProvingJobConsumerSchema, {
67
133
  namespaceMethods: 'provingJobConsumer',
68
134
  fetch,
135
+ maxRequestBodySize,
69
136
  onResponse: getVersioningResponseHandler(versions)
70
137
  });
71
138
  }
@@ -0,0 +1,36 @@
1
+ import type { RollupCheatCodes } from '@aztec/ethereum/test';
2
+ import type { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import type { L2BlockSource } from '@aztec/stdlib/block';
5
+ /** Arguments for {@link settleEpochOutbox}. */
6
+ export type SettleEpochOutboxArgs = {
7
+ /** Cheat codes used to write the computed out hash directly into the L1 Outbox storage. */
8
+ rollupCheatCodes: RollupCheatCodes;
9
+ /** Source of checkpointed L2 blocks for the epoch being settled. */
10
+ l2BlockSource: L2BlockSource;
11
+ /** Epoch to settle. */
12
+ epoch: EpochNumber;
13
+ /**
14
+ * When set, only checkpoints up to and including this number are covered. Used to settle a partial
15
+ * epoch (the AZIP-14 Outbox keeps one root per `numCheckpointsInEpoch`, so a prefix of an epoch can
16
+ * be settled and consumed before the epoch completes). When omitted, every checkpointed block in the
17
+ * epoch is covered.
18
+ */
19
+ maxCheckpoint?: CheckpointNumber;
20
+ log: Logger;
21
+ };
22
+ /**
23
+ * Computes the epoch out hash over the checkpointed blocks of an epoch (optionally only up to
24
+ * `maxCheckpoint`) and writes it into the L1 Outbox via cheat codes. This is the synthetic,
25
+ * no-prover equivalent of an epoch root proof landing on L1: it makes the L2-to-L1 messages in the
26
+ * covered checkpoints consumable. It does NOT advance the rollup's proven tip — callers
27
+ * `markAsProven` separately so a single prove call can settle multiple epochs before marking proven.
28
+ *
29
+ * Used by the test-only proving drivers: the `AutomineSequencer`'s auto-settle loop and the standalone
30
+ * `EpochTestSettler`. Lives here (rather than in either consumer) so both share one implementation.
31
+ *
32
+ * @returns The last checkpoint number covered by the settled range, or `undefined` if the epoch has
33
+ * no checkpointed blocks (within the `maxCheckpoint` bound).
34
+ */
35
+ export declare function settleEpochOutbox({ rollupCheatCodes, l2BlockSource, epoch, maxCheckpoint, log }: SettleEpochOutboxArgs): Promise<CheckpointNumber | undefined>;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2hfc2V0dGxlbWVudC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvZXBvY2hfc2V0dGxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBYyxNQUFNLGlDQUFpQyxDQUFDO0FBRWpHLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3pELCtDQUErQztBQUMvQyxNQUFNLE1BQU0scUJBQXFCLEdBQUc7SUFDbEMsMkZBQTJGO0lBQzNGLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0lBQ25DLG9FQUFvRTtJQUNwRSxhQUFhLEVBQUUsYUFBYSxDQUFDO0lBQzdCLHVCQUF1QjtJQUN2QixLQUFLLEVBQUUsV0FBVyxDQUFDO0lBQ25COzs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7SUFDakMsR0FBRyxFQUFFLE1BQU0sQ0FBQztDQUNiLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCx3QkFBc0IsaUJBQWlCLENBQUMsRUFDdEMsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixLQUFLLEVBQ0wsYUFBYSxFQUNiLEdBQUcsRUFDSixFQUFFLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsQ0FxQy9EIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoch_settlement.d.ts","sourceRoot":"","sources":["../../src/test/epoch_settlement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAc,MAAM,iCAAiC,CAAC;AAEjG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,+CAA+C;AAC/C,MAAM,MAAM,qBAAqB,GAAG;IAClC,2FAA2F;IAC3F,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oEAAoE;IACpE,aAAa,EAAE,aAAa,CAAC;IAC7B,uBAAuB;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,aAAa,EACb,GAAG,EACJ,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAqC/D"}
@@ -0,0 +1,52 @@
1
+ import { computeEpochOutHash } from '@aztec/stdlib/messaging';
2
+ /**
3
+ * Computes the epoch out hash over the checkpointed blocks of an epoch (optionally only up to
4
+ * `maxCheckpoint`) and writes it into the L1 Outbox via cheat codes. This is the synthetic,
5
+ * no-prover equivalent of an epoch root proof landing on L1: it makes the L2-to-L1 messages in the
6
+ * covered checkpoints consumable. It does NOT advance the rollup's proven tip — callers
7
+ * `markAsProven` separately so a single prove call can settle multiple epochs before marking proven.
8
+ *
9
+ * Used by the test-only proving drivers: the `AutomineSequencer`'s auto-settle loop and the standalone
10
+ * `EpochTestSettler`. Lives here (rather than in either consumer) so both share one implementation.
11
+ *
12
+ * @returns The last checkpoint number covered by the settled range, or `undefined` if the epoch has
13
+ * no checkpointed blocks (within the `maxCheckpoint` bound).
14
+ */ export async function settleEpochOutbox({ rollupCheatCodes, l2BlockSource, epoch, maxCheckpoint, log }) {
15
+ let blocks = await l2BlockSource.getBlocks({
16
+ epoch,
17
+ onlyCheckpointed: true
18
+ });
19
+ if (maxCheckpoint !== undefined) {
20
+ blocks = blocks.filter((block)=>block.checkpointNumber <= maxCheckpoint);
21
+ }
22
+ if (blocks.length === 0) {
23
+ return undefined;
24
+ }
25
+ log.info(`Settling epoch ${epoch}${maxCheckpoint !== undefined ? ` up to checkpoint ${maxCheckpoint}` : ''} with blocks ${blocks[0]?.header.getBlockNumber()} to ${blocks.at(-1)?.header.getBlockNumber()}`, {
26
+ epoch,
27
+ maxCheckpoint,
28
+ blocks: blocks.map((block)=>block.toBlockInfo())
29
+ });
30
+ const messagesInEpoch = [];
31
+ // Undefined (not SlotNumber.ZERO) so a first checkpointed block at slot 0 still opens checkpoint 0.
32
+ let previousSlotNumber;
33
+ let checkpointIndex = -1;
34
+ for (const block of blocks){
35
+ const slotNumber = block.header.globalVariables.slotNumber;
36
+ if (slotNumber !== previousSlotNumber) {
37
+ checkpointIndex++;
38
+ messagesInEpoch[checkpointIndex] = [];
39
+ previousSlotNumber = slotNumber;
40
+ }
41
+ messagesInEpoch[checkpointIndex].push(block.body.txEffects.map((txEffect)=>txEffect.l2ToL1Msgs));
42
+ }
43
+ const outHash = computeEpochOutHash(messagesInEpoch);
44
+ if (!outHash.isZero()) {
45
+ await rollupCheatCodes.insertOutbox(epoch, messagesInEpoch.length, outHash.toBigInt());
46
+ } else {
47
+ log.info(`No L2 to L1 messages in epoch ${epoch}`, {
48
+ epoch
49
+ });
50
+ }
51
+ return blocks.at(-1)?.checkpointNumber;
52
+ }
@@ -0,0 +1,2 @@
1
+ export { settleEpochOutbox, type SettleEpochOutboxArgs } from './epoch_settlement.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1 @@
1
+ export { settleEpochOutbox } from './epoch_settlement.js';
@@ -19,7 +19,7 @@ export declare class TestBroker implements ProvingJobProducer {
19
19
  }
20
20
  export declare class MockProver implements ServerCircuitProver {
21
21
  constructor();
22
- getAvmProof(_inputs: AvmCircuitInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<import("@aztec/stdlib/proofs").RecursiveProof<16400>>;
22
+ getAvmProof(_inputs: AvmCircuitInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<import("@aztec/stdlib/proofs").RecursiveProof<14532>>;
23
23
  getBaseParityProof(_inputs: ParityBasePrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs, 410>>;
24
24
  getRootParityProof(_inputs: ParityRootPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs, 410>>;
25
25
  getPublicChonkVerifierProof(_inputs: PublicChonkVerifierPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<PublicChonkVerifierPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
@@ -1,4 +1,4 @@
1
- import { AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED, NESTED_RECURSIVE_PROOF_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, RECURSIVE_PROOF_LENGTH } from '@aztec/constants';
1
+ import { AVM_V2_PROOF_LENGTH_IN_FIELDS, NESTED_RECURSIVE_PROOF_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, RECURSIVE_PROOF_LENGTH } from '@aztec/constants';
2
2
  import { times } from '@aztec/foundation/collection';
3
3
  import { makePublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
4
4
  import { makeEmptyRecursiveProof, makeRecursiveProof } from '@aztec/stdlib/proofs';
@@ -44,7 +44,7 @@ export class TestBroker {
44
44
  export class MockProver {
45
45
  constructor(){}
46
46
  getAvmProof(_inputs, _signal, _epochNumber) {
47
- return Promise.resolve(makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED));
47
+ return Promise.resolve(makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS));
48
48
  }
49
49
  getBaseParityProof(_inputs, _signal, _epochNumber) {
50
50
  return Promise.resolve(makePublicInputsAndRecursiveProof(makeParityPublicInputs(), makeRecursiveProof(RECURSIVE_PROOF_LENGTH), VerificationKeyData.makeFakeHonk()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/prover-client",
3
- "version": "0.0.1-commit.c2eed6949",
3
+ "version": "0.0.1-commit.c52d6e7",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -9,7 +9,8 @@
9
9
  "./orchestrator": "./dest/orchestrator/index.js",
10
10
  "./helpers": "./dest/orchestrator/block-building-helpers.js",
11
11
  "./light": "./dest/light/index.js",
12
- "./config": "./dest/config.js"
12
+ "./config": "./dest/config.js",
13
+ "./test": "./dest/test/index.js"
13
14
  },
14
15
  "typedocOptions": {
15
16
  "entryPoints": [
@@ -28,7 +29,7 @@
28
29
  "clean": "rm -rf ./dest .tsbuildinfo",
29
30
  "bb": "node --no-warnings ./dest/bb/index.js",
30
31
  "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=3500000",
31
- "test:debug": "LOG_LEVEL=debug NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=1500000 --testNamePattern prover/bb_prover/parity"
32
+ "test:debug": "LOG_LEVEL=\"debug; info: json-rpc, simulator\" NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=1500000 --testNamePattern prover/bb_prover/parity"
32
33
  },
33
34
  "jest": {
34
35
  "moduleNameMapper": {
@@ -68,28 +69,28 @@
68
69
  ]
69
70
  },
70
71
  "dependencies": {
71
- "@aztec/bb-prover": "0.0.1-commit.c2eed6949",
72
- "@aztec/blob-lib": "0.0.1-commit.c2eed6949",
73
- "@aztec/constants": "0.0.1-commit.c2eed6949",
74
- "@aztec/ethereum": "0.0.1-commit.c2eed6949",
75
- "@aztec/foundation": "0.0.1-commit.c2eed6949",
76
- "@aztec/kv-store": "0.0.1-commit.c2eed6949",
77
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.c2eed6949",
78
- "@aztec/noir-types": "0.0.1-commit.c2eed6949",
79
- "@aztec/protocol-contracts": "0.0.1-commit.c2eed6949",
80
- "@aztec/simulator": "0.0.1-commit.c2eed6949",
81
- "@aztec/stdlib": "0.0.1-commit.c2eed6949",
82
- "@aztec/telemetry-client": "0.0.1-commit.c2eed6949",
83
- "@aztec/world-state": "0.0.1-commit.c2eed6949",
72
+ "@aztec/bb-prover": "0.0.1-commit.c52d6e7",
73
+ "@aztec/blob-lib": "0.0.1-commit.c52d6e7",
74
+ "@aztec/constants": "0.0.1-commit.c52d6e7",
75
+ "@aztec/ethereum": "0.0.1-commit.c52d6e7",
76
+ "@aztec/foundation": "0.0.1-commit.c52d6e7",
77
+ "@aztec/kv-store": "0.0.1-commit.c52d6e7",
78
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.c52d6e7",
79
+ "@aztec/noir-types": "6.0.0-nightly.20260807",
80
+ "@aztec/protocol-contracts": "0.0.1-commit.c52d6e7",
81
+ "@aztec/simulator": "0.0.1-commit.c52d6e7",
82
+ "@aztec/stdlib": "0.0.1-commit.c52d6e7",
83
+ "@aztec/telemetry-client": "0.0.1-commit.c52d6e7",
84
+ "@aztec/world-state": "0.0.1-commit.c52d6e7",
84
85
  "@iarna/toml": "^2.2.5",
85
86
  "commander": "^12.1.0",
86
87
  "lodash.chunk": "^4.2.0",
87
88
  "source-map-support": "^0.5.21",
88
89
  "tslib": "^2.4.0",
89
- "zod": "^3.23.8"
90
+ "zod": "^4"
90
91
  },
91
92
  "devDependencies": {
92
- "@aztec/noir-contracts.js": "0.0.1-commit.c2eed6949",
93
+ "@aztec/noir-contracts.js": "0.0.1-commit.c52d6e7",
93
94
  "@jest/globals": "^30.0.0",
94
95
  "@types/jest": "^30.0.0",
95
96
  "@types/node": "^22.15.17",
package/src/config.ts CHANGED
@@ -63,6 +63,11 @@ export const bbConfigMappings: ConfigMappingsType<BBConfig & ACVMConfig> = {
63
63
  description: 'Thread count for the peer batch verifier parallel reduce. 0 = auto.',
64
64
  ...numberConfigHelper(6),
65
65
  },
66
+ bbDebugOutputDir: {
67
+ env: 'BB_DEBUG_OUTPUT_DIR',
68
+ description:
69
+ 'When set, bb.js operations write input/output files and log equivalent CLI commands to this directory',
70
+ },
66
71
  };
67
72
 
68
73
  export const proverClientConfigMappings: ConfigMappingsType<ProverClientUserConfig> = {