@aztec/prover-client 0.0.0-test.1 → 0.0.1-commit.b655e406

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 (121) hide show
  1. package/dest/block-factory/index.d.ts +2 -0
  2. package/dest/block-factory/index.d.ts.map +1 -0
  3. package/dest/block-factory/light.d.ts +38 -0
  4. package/dest/block-factory/light.d.ts.map +1 -0
  5. package/dest/block-factory/light.js +94 -0
  6. package/dest/config.d.ts +6 -6
  7. package/dest/config.d.ts.map +1 -1
  8. package/dest/config.js +11 -1
  9. package/dest/mocks/fixtures.d.ts +7 -4
  10. package/dest/mocks/fixtures.d.ts.map +1 -1
  11. package/dest/mocks/fixtures.js +32 -4
  12. package/dest/mocks/test_context.d.ts +43 -15
  13. package/dest/mocks/test_context.d.ts.map +1 -1
  14. package/dest/mocks/test_context.js +110 -48
  15. package/dest/orchestrator/block-building-helpers.d.ts +37 -28
  16. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  17. package/dest/orchestrator/block-building-helpers.js +156 -150
  18. package/dest/orchestrator/block-proving-state.d.ts +62 -46
  19. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  20. package/dest/orchestrator/block-proving-state.js +223 -179
  21. package/dest/orchestrator/checkpoint-proving-state.d.ts +63 -0
  22. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  23. package/dest/orchestrator/checkpoint-proving-state.js +211 -0
  24. package/dest/orchestrator/epoch-proving-state.d.ts +37 -24
  25. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  26. package/dest/orchestrator/epoch-proving-state.js +143 -73
  27. package/dest/orchestrator/orchestrator.d.ts +34 -31
  28. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  29. package/dest/orchestrator/orchestrator.js +392 -234
  30. package/dest/orchestrator/orchestrator_metrics.d.ts +2 -0
  31. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  32. package/dest/orchestrator/orchestrator_metrics.js +9 -0
  33. package/dest/orchestrator/tx-proving-state.d.ts +12 -10
  34. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  35. package/dest/orchestrator/tx-proving-state.js +30 -38
  36. package/dest/prover-client/prover-client.d.ts +3 -3
  37. package/dest/prover-client/prover-client.d.ts.map +1 -1
  38. package/dest/prover-client/prover-client.js +5 -4
  39. package/dest/prover-client/server-epoch-prover.d.ts +13 -10
  40. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  41. package/dest/prover-client/server-epoch-prover.js +11 -11
  42. package/dest/proving_broker/broker_prover_facade.d.ts +22 -15
  43. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  44. package/dest/proving_broker/broker_prover_facade.js +64 -39
  45. package/dest/proving_broker/config.d.ts +9 -4
  46. package/dest/proving_broker/config.d.ts.map +1 -1
  47. package/dest/proving_broker/config.js +15 -4
  48. package/dest/proving_broker/factory.d.ts +1 -1
  49. package/dest/proving_broker/factory.d.ts.map +1 -1
  50. package/dest/proving_broker/factory.js +5 -1
  51. package/dest/proving_broker/fixtures.js +1 -1
  52. package/dest/proving_broker/proof_store/factory.js +1 -1
  53. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
  54. package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
  55. package/dest/proving_broker/proof_store/index.d.ts +1 -0
  56. package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
  57. package/dest/proving_broker/proof_store/index.js +1 -0
  58. package/dest/proving_broker/proving_agent.d.ts +3 -3
  59. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  60. package/dest/proving_broker/proving_agent.js +83 -47
  61. package/dest/proving_broker/proving_broker.d.ts +11 -2
  62. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  63. package/dest/proving_broker/proving_broker.js +34 -22
  64. package/dest/proving_broker/proving_broker_database/memory.js +1 -1
  65. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  66. package/dest/proving_broker/proving_broker_database/persisted.js +9 -8
  67. package/dest/proving_broker/proving_job_controller.d.ts +7 -8
  68. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  69. package/dest/proving_broker/proving_job_controller.js +89 -61
  70. package/dest/proving_broker/rpc.d.ts +3 -5
  71. package/dest/proving_broker/rpc.d.ts.map +1 -1
  72. package/dest/proving_broker/rpc.js +1 -4
  73. package/dest/test/mock_proof_store.d.ts +9 -0
  74. package/dest/test/mock_proof_store.d.ts.map +1 -0
  75. package/dest/test/mock_proof_store.js +10 -0
  76. package/dest/test/mock_prover.d.ts +23 -16
  77. package/dest/test/mock_prover.d.ts.map +1 -1
  78. package/dest/test/mock_prover.js +38 -20
  79. package/package.json +29 -29
  80. package/src/block-factory/index.ts +1 -0
  81. package/src/block-factory/light.ts +140 -0
  82. package/src/config.ts +24 -8
  83. package/src/mocks/fixtures.ts +43 -15
  84. package/src/mocks/test_context.ts +201 -75
  85. package/src/orchestrator/block-building-helpers.ts +247 -243
  86. package/src/orchestrator/block-proving-state.ts +247 -231
  87. package/src/orchestrator/checkpoint-proving-state.ts +299 -0
  88. package/src/orchestrator/epoch-proving-state.ts +187 -111
  89. package/src/orchestrator/orchestrator.ts +590 -289
  90. package/src/orchestrator/orchestrator_metrics.ts +20 -1
  91. package/src/orchestrator/tx-proving-state.ts +60 -61
  92. package/src/prover-client/prover-client.ts +16 -14
  93. package/src/prover-client/server-epoch-prover.ts +40 -21
  94. package/src/proving_broker/broker_prover_facade.ts +200 -113
  95. package/src/proving_broker/config.ts +17 -6
  96. package/src/proving_broker/factory.ts +2 -1
  97. package/src/proving_broker/fixtures.ts +1 -1
  98. package/src/proving_broker/proof_store/factory.ts +1 -1
  99. package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
  100. package/src/proving_broker/proof_store/index.ts +1 -0
  101. package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
  102. package/src/proving_broker/proving_agent.ts +89 -47
  103. package/src/proving_broker/proving_broker.ts +51 -32
  104. package/src/proving_broker/proving_broker_database/memory.ts +1 -1
  105. package/src/proving_broker/proving_broker_database/persisted.ts +9 -8
  106. package/src/proving_broker/proving_job_controller.ts +92 -81
  107. package/src/proving_broker/rpc.ts +1 -6
  108. package/src/test/mock_proof_store.ts +14 -0
  109. package/src/test/mock_prover.ts +164 -60
  110. package/dest/bin/get-proof-inputs.d.ts +0 -2
  111. package/dest/bin/get-proof-inputs.d.ts.map +0 -1
  112. package/dest/bin/get-proof-inputs.js +0 -51
  113. package/dest/block_builder/index.d.ts +0 -6
  114. package/dest/block_builder/index.d.ts.map +0 -1
  115. package/dest/block_builder/light.d.ts +0 -33
  116. package/dest/block_builder/light.d.ts.map +0 -1
  117. package/dest/block_builder/light.js +0 -82
  118. package/src/bin/get-proof-inputs.ts +0 -59
  119. package/src/block_builder/index.ts +0 -6
  120. package/src/block_builder/light.ts +0 -101
  121. /package/dest/{block_builder → block-factory}/index.js +0 -0
@@ -1,45 +1,52 @@
1
1
  import type { BBProverConfig } from '@aztec/bb-prover';
2
- import { times, timesParallel } from '@aztec/foundation/collection';
2
+ import { TestCircuitProver } from '@aztec/bb-prover';
3
+ import { SpongeBlob } from '@aztec/blob-lib';
4
+ import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
5
+ import { padArrayEnd, times, timesParallel } from '@aztec/foundation/collection';
3
6
  import { Fr } from '@aztec/foundation/fields';
4
7
  import type { Logger } from '@aztec/foundation/log';
5
8
  import { TestDateProvider } from '@aztec/foundation/timer';
9
+ import type { FieldsOf } from '@aztec/foundation/types';
6
10
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
7
- import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
11
+ import { ProtocolContractsList } from '@aztec/protocol-contracts';
8
12
  import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-juice';
9
- import {
10
- PublicProcessor,
11
- PublicTxSimulationTester,
12
- PublicTxSimulator,
13
- SimpleContractDataSource,
14
- WorldStateDB,
15
- } from '@aztec/simulator/server';
13
+ import { SimpleContractDataSource } from '@aztec/simulator/public/fixtures';
14
+ import { PublicProcessorFactory } from '@aztec/simulator/server';
16
15
  import { PublicDataWrite } from '@aztec/stdlib/avm';
17
16
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
18
- import type { L2Block } from '@aztec/stdlib/block';
17
+ import { EthAddress } from '@aztec/stdlib/block';
18
+ import { getCheckpointBlobFields } from '@aztec/stdlib/checkpoint';
19
19
  import type { ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
20
+ import type { CheckpointConstantData } from '@aztec/stdlib/rollup';
20
21
  import { makeBloatedProcessedTx } from '@aztec/stdlib/testing';
21
- import { type AppendOnlyTreeSnapshot, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
22
+ import { MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
22
23
  import { type BlockHeader, type GlobalVariables, type ProcessedTx, TreeSnapshots, type Tx } from '@aztec/stdlib/tx';
23
24
  import type { MerkleTreeAdminDatabase } from '@aztec/world-state';
24
25
  import { NativeWorldStateService } from '@aztec/world-state/native';
25
26
 
26
27
  import { promises as fs } from 'fs';
27
28
 
28
- import { TestCircuitProver } from '../../../bb-prover/src/test/test_circuit_prover.js';
29
- import { buildBlock } from '../block_builder/light.js';
29
+ import { buildBlockWithCleanDB } from '../block-factory/light.js';
30
+ import { getTreeSnapshot } from '../orchestrator/block-building-helpers.js';
31
+ import type { BlockProvingState } from '../orchestrator/block-proving-state.js';
30
32
  import { ProvingOrchestrator } from '../orchestrator/index.js';
31
33
  import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js';
32
34
  import { TestBroker } from '../test/mock_prover.js';
33
- import { getEnvironmentConfig, getSimulationProvider, makeGlobals, updateExpectedTreesFromTxs } from './fixtures.js';
35
+ import {
36
+ getEnvironmentConfig,
37
+ getSimulator,
38
+ makeCheckpointConstants,
39
+ makeGlobals,
40
+ updateExpectedTreesFromTxs,
41
+ } from './fixtures.js';
34
42
 
35
43
  export class TestContext {
36
44
  private headers: Map<number, BlockHeader> = new Map();
37
45
  private feePayerBalance: Fr;
38
46
 
39
47
  constructor(
40
- public publicTxSimulator: PublicTxSimulator,
41
48
  public worldState: MerkleTreeAdminDatabase,
42
- public publicProcessor: PublicProcessor,
49
+ public firstCheckpointNumber: Fr,
43
50
  public globalVariables: GlobalVariables,
44
51
  public prover: ServerCircuitProver,
45
52
  public broker: TestBroker,
@@ -49,7 +56,6 @@ export class TestContext {
49
56
  public feePayer: AztecAddress,
50
57
  initialFeePayerBalance: Fr,
51
58
  public directoriesToCleanup: string[],
52
- public tester: PublicTxSimulationTester,
53
59
  public logger: Logger,
54
60
  ) {
55
61
  this.feePayerBalance = initialFeePayerBalance;
@@ -59,15 +65,27 @@ export class TestContext {
59
65
  return this.orchestrator;
60
66
  }
61
67
 
68
+ public getCheckpointConstants(checkpointIndex = 0): CheckpointConstantData {
69
+ return makeCheckpointConstants(this.firstCheckpointNumber.toNumber() + checkpointIndex);
70
+ }
71
+
62
72
  static async new(
63
73
  logger: Logger,
64
- proverCount = 4,
65
- createProver: (bbConfig: BBProverConfig) => Promise<ServerCircuitProver> = async (bbConfig: BBProverConfig) =>
66
- new TestCircuitProver(await getSimulationProvider(bbConfig, logger)),
67
- blockNumber = 1,
74
+ {
75
+ proverCount = 4,
76
+ createProver = async (bbConfig: BBProverConfig) => new TestCircuitProver(await getSimulator(bbConfig, logger)),
77
+ slotNumber = 1,
78
+ blockNumber = 1,
79
+ }: {
80
+ proverCount?: number;
81
+ createProver?: (bbConfig: BBProverConfig) => Promise<ServerCircuitProver>;
82
+ slotNumber?: number;
83
+ blockNumber?: number;
84
+ } = {},
68
85
  ) {
69
86
  const directoriesToCleanup: string[] = [];
70
- const globalVariables = makeGlobals(blockNumber);
87
+ const firstCheckpointNumber = new Fr(slotNumber);
88
+ const globalVariables = makeGlobals(blockNumber, slotNumber);
71
89
 
72
90
  const feePayer = AztecAddress.fromNumber(42222);
73
91
  const initialFeePayerBalance = new Fr(10n ** 20n);
@@ -76,25 +94,10 @@ export class TestContext {
76
94
 
77
95
  // Separated dbs for public processor and prover - see public_processor for context
78
96
  const ws = await NativeWorldStateService.tmp(
79
- undefined /* rollupAddress */,
80
- true /* cleanupTmpDir */,
97
+ /*rollupAddress=*/ undefined,
98
+ /*cleanupTmpDir=*/ true,
81
99
  prefilledPublicData,
82
100
  );
83
- const publicDb = await ws.fork();
84
-
85
- const contractDataSource = new SimpleContractDataSource();
86
- const worldStateDB = new WorldStateDB(publicDb, contractDataSource);
87
-
88
- const tester = new PublicTxSimulationTester(worldStateDB, contractDataSource, publicDb);
89
-
90
- const publicTxSimulator = new PublicTxSimulator(publicDb, worldStateDB, globalVariables, true);
91
- const processor = new PublicProcessor(
92
- publicDb,
93
- globalVariables,
94
- worldStateDB,
95
- publicTxSimulator,
96
- new TestDateProvider(),
97
- );
98
101
 
99
102
  let localProver: ServerCircuitProver;
100
103
  const config = await getEnvironmentConfig(logger);
@@ -107,6 +110,8 @@ export class TestContext {
107
110
  bbBinaryPath: config.expectedBBPath,
108
111
  bbWorkingDirectory: config.bbWorkingDirectory,
109
112
  bbSkipCleanup: config.bbSkipCleanup,
113
+ numConcurrentIVCVerifiers: 2,
114
+ bbIVCConcurrency: 1,
110
115
  };
111
116
  localProver = await createProver(bbConfig);
112
117
  }
@@ -117,15 +122,14 @@ export class TestContext {
117
122
 
118
123
  const broker = new TestBroker(proverCount, localProver);
119
124
  const facade = new BrokerCircuitProverFacade(broker);
120
- const orchestrator = new TestProvingOrchestrator(ws, facade, Fr.ZERO);
125
+ const orchestrator = new TestProvingOrchestrator(ws, facade, EthAddress.ZERO);
121
126
 
122
127
  await broker.start();
123
128
  facade.start();
124
129
 
125
130
  return new this(
126
- publicTxSimulator,
127
131
  ws,
128
- processor,
132
+ firstCheckpointNumber,
129
133
  globalVariables,
130
134
  localProver,
131
135
  broker,
@@ -135,7 +139,6 @@ export class TestContext {
135
139
  feePayer,
136
140
  initialFeePayerBalance,
137
141
  directoriesToCleanup,
138
- tester,
139
142
  logger,
140
143
  );
141
144
  }
@@ -146,7 +149,7 @@ export class TestContext {
146
149
 
147
150
  public getBlockHeader(blockNumber: 0): BlockHeader;
148
151
  public getBlockHeader(blockNumber: number): BlockHeader | undefined;
149
- public getBlockHeader(blockNumber = 0) {
152
+ public getBlockHeader(blockNumber = 0): BlockHeader | undefined {
150
153
  return blockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.headers.get(blockNumber);
151
154
  }
152
155
 
@@ -166,19 +169,15 @@ export class TestContext {
166
169
  }
167
170
  }
168
171
 
169
- public async makeProcessedTx(opts?: Parameters<typeof makeBloatedProcessedTx>[0]): Promise<ProcessedTx>;
170
- public async makeProcessedTx(seed?: number): Promise<ProcessedTx>;
171
- public async makeProcessedTx(
172
- seedOrOpts?: Parameters<typeof makeBloatedProcessedTx>[0] | number,
173
- ): Promise<ProcessedTx> {
174
- const opts = typeof seedOrOpts === 'number' ? { seed: seedOrOpts } : seedOrOpts;
175
- const blockNum = (opts?.globalVariables ?? this.globalVariables).blockNumber.toNumber();
176
- const header = this.getBlockHeader(blockNum - 1);
172
+ async makeProcessedTx(opts?: Parameters<typeof makeBloatedProcessedTx>[0]): Promise<ProcessedTx> {
173
+ const globalVariables = opts?.globalVariables ?? this.globalVariables;
174
+ const blockNumber = globalVariables.blockNumber;
175
+ const header = opts?.header ?? this.getBlockHeader(blockNumber - 1);
177
176
  const tx = await makeBloatedProcessedTx({
178
177
  header,
179
178
  vkTreeRoot: getVKTreeRoot(),
180
- protocolContractTreeRoot,
181
- globalVariables: this.globalVariables,
179
+ protocolContracts: ProtocolContractsList,
180
+ globalVariables,
182
181
  feePayer: this.feePayer,
183
182
  ...opts,
184
183
  });
@@ -193,44 +192,174 @@ export class TestContext {
193
192
  /** Creates a block with the given number of txs and adds it to world-state */
194
193
  public async makePendingBlock(
195
194
  numTxs: number,
196
- numMsgs: number = 0,
197
- blockNumOrGlobals: GlobalVariables | number = this.globalVariables,
198
- makeProcessedTxOpts: (index: number) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]> = () => ({}),
195
+ {
196
+ checkpointIndex = 0,
197
+ numL1ToL2Messages = 0,
198
+ blockNumber = this.blockNumber,
199
+ makeProcessedTxOpts = () => ({}),
200
+ }: {
201
+ checkpointIndex?: number;
202
+ numL1ToL2Messages?: number;
203
+ blockNumber?: number;
204
+ makeProcessedTxOpts?: (index: number) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]>;
205
+ } = {},
199
206
  ) {
200
- const globalVariables = typeof blockNumOrGlobals === 'number' ? makeGlobals(blockNumOrGlobals) : blockNumOrGlobals;
201
- const blockNum = globalVariables.blockNumber.toNumber();
207
+ const slotNumber = this.firstCheckpointNumber.toNumber() + checkpointIndex;
208
+ const globalVariables = makeGlobals(blockNumber, slotNumber);
209
+ const blockNum = globalVariables.blockNumber;
202
210
  const db = await this.worldState.fork();
203
- const msgs = times(numMsgs, i => new Fr(blockNum * 100 + i));
211
+ const l1ToL2Messages = times(numL1ToL2Messages, i => new Fr(blockNum * 100 + i));
212
+ const merkleTrees = await this.worldState.fork();
213
+ await merkleTrees.appendLeaves(
214
+ MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
215
+ padArrayEnd<Fr, number>(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP),
216
+ );
217
+ const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, merkleTrees);
204
218
  const txs = await timesParallel(numTxs, i =>
205
- this.makeProcessedTx({ seed: i + blockNum * 1000, globalVariables, ...makeProcessedTxOpts(i) }),
219
+ this.makeProcessedTx({
220
+ seed: i + blockNum * 1000,
221
+ globalVariables,
222
+ newL1ToL2Snapshot,
223
+ ...makeProcessedTxOpts(i),
224
+ }),
206
225
  );
207
226
  await this.setTreeRoots(txs);
208
227
 
209
- const block = await buildBlock(txs, globalVariables, msgs, db);
210
- this.headers.set(blockNum, block.header);
211
- await this.worldState.handleL2BlockAndMessages(block, msgs);
212
- return { block, txs, msgs };
228
+ const block = await buildBlockWithCleanDB(txs, globalVariables, l1ToL2Messages, db);
229
+ this.headers.set(blockNum, block.getBlockHeader());
230
+ await this.worldState.handleL2BlockAndMessages(block, l1ToL2Messages);
231
+ return { block, txs, l1ToL2Messages };
232
+ }
233
+
234
+ public async makePendingBlocksInCheckpoint(
235
+ numBlocks: number,
236
+ {
237
+ checkpointIndex = 0,
238
+ numTxsPerBlock = 1,
239
+ numL1ToL2Messages = 0,
240
+ firstBlockNumber = this.blockNumber + checkpointIndex * numBlocks,
241
+ makeGlobalVariablesOpts = () => ({}),
242
+ makeProcessedTxOpts = () => ({}),
243
+ }: {
244
+ checkpointIndex?: number;
245
+ numTxsPerBlock?: number | number[];
246
+ numL1ToL2Messages?: number;
247
+ firstBlockNumber?: number;
248
+ makeGlobalVariablesOpts?: (
249
+ blockNumber: number,
250
+ checkpointIndex: number,
251
+ ) => Partial<FieldsOf<GlobalVariables> & FieldsOf<CheckpointConstantData>>;
252
+ makeProcessedTxOpts?: (
253
+ blockGlobalVariables: GlobalVariables,
254
+ txIndex: number,
255
+ ) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]>;
256
+ } = {},
257
+ ) {
258
+ const slotNumber = this.firstCheckpointNumber.toNumber() + checkpointIndex;
259
+ const l1ToL2Messages = times(numL1ToL2Messages, i => new Fr(slotNumber * 100 + i));
260
+ const merkleTrees = await this.worldState.fork();
261
+ await merkleTrees.appendLeaves(
262
+ MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
263
+ padArrayEnd<Fr, number>(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP),
264
+ );
265
+ const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, merkleTrees);
266
+
267
+ const blockGlobalVariables = times(numBlocks, i =>
268
+ makeGlobals(firstBlockNumber + i, slotNumber, makeGlobalVariablesOpts(firstBlockNumber + i, checkpointIndex)),
269
+ );
270
+ let totalTxs = 0;
271
+ const blockTxs = await timesParallel(numBlocks, blockIndex => {
272
+ const txIndexOffset = totalTxs;
273
+ const numTxs = typeof numTxsPerBlock === 'number' ? numTxsPerBlock : numTxsPerBlock[blockIndex];
274
+ totalTxs += numTxs;
275
+ return timesParallel(numTxs, txIndex =>
276
+ this.makeProcessedTx({
277
+ seed: (txIndexOffset + txIndex + 1) * 321 + (checkpointIndex + 1) * 123456,
278
+ globalVariables: blockGlobalVariables[blockIndex],
279
+ header: this.getBlockHeader(firstBlockNumber - 1),
280
+ newL1ToL2Snapshot,
281
+ ...makeProcessedTxOpts(blockGlobalVariables[blockIndex], txIndexOffset + txIndex),
282
+ }),
283
+ );
284
+ });
285
+
286
+ const blobFields = getCheckpointBlobFields(blockTxs.map(txs => txs.map(tx => tx.txEffect)));
287
+ const spongeBlobState = await SpongeBlob.init(blobFields.length);
288
+
289
+ const blocks: { header: BlockHeader; txs: ProcessedTx[] }[] = [];
290
+ for (let i = 0; i < numBlocks; i++) {
291
+ const isFirstBlock = i === 0;
292
+ const blockNumber = firstBlockNumber + i;
293
+ const globalVariables = blockGlobalVariables[i];
294
+ const txs = blockTxs[i];
295
+
296
+ await this.setTreeRoots(txs);
297
+
298
+ const fork = await this.worldState.fork();
299
+ const blockMsgs = isFirstBlock ? l1ToL2Messages : [];
300
+ const block = await buildBlockWithCleanDB(txs, globalVariables, blockMsgs, fork, spongeBlobState, isFirstBlock);
301
+
302
+ const header = block.getBlockHeader();
303
+ this.headers.set(blockNumber, header);
304
+
305
+ await this.worldState.handleL2BlockAndMessages(block, blockMsgs, isFirstBlock);
306
+
307
+ const blockBlobFields = block.body.toBlobFields();
308
+ await spongeBlobState.absorb(blockBlobFields);
309
+
310
+ blocks.push({ header, txs });
311
+ }
312
+
313
+ return { blocks, l1ToL2Messages, blobFields };
213
314
  }
214
315
 
215
- public async processPublicFunctions(txs: Tx[], maxTransactions: number) {
216
- return await this.publicProcessor.process(txs, { maxTransactions });
316
+ public async processPublicFunctions(
317
+ txs: Tx[],
318
+ {
319
+ maxTransactions = txs.length,
320
+ numL1ToL2Messages = 0,
321
+ contractDataSource,
322
+ }: {
323
+ maxTransactions?: number;
324
+ numL1ToL2Messages?: number;
325
+ contractDataSource?: SimpleContractDataSource;
326
+ } = {},
327
+ ) {
328
+ const l1ToL2Messages = times(numL1ToL2Messages, i => new Fr(this.blockNumber * 100 + i));
329
+ const merkleTrees = await this.worldState.fork();
330
+ await merkleTrees.appendLeaves(
331
+ MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
332
+ padArrayEnd<Fr, number>(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP),
333
+ );
334
+
335
+ const processorFactory = new PublicProcessorFactory(
336
+ contractDataSource ?? new SimpleContractDataSource(),
337
+ new TestDateProvider(),
338
+ );
339
+ const publicProcessor = processorFactory.create(merkleTrees, this.globalVariables, {
340
+ skipFeeEnforcement: false,
341
+ clientInitiatedSimulation: false,
342
+ });
343
+
344
+ return await publicProcessor.process(txs, { maxTransactions });
217
345
  }
218
346
 
219
- public async setTreeRoots(txs: ProcessedTx[]) {
347
+ private async setTreeRoots(txs: ProcessedTx[]) {
220
348
  const db = await this.worldState.fork();
221
349
  for (const tx of txs) {
222
350
  const startStateReference = await db.getStateReference();
223
351
  await updateExpectedTreesFromTxs(db, [tx]);
224
352
  const endStateReference = await db.getStateReference();
225
353
  if (tx.avmProvingRequest) {
354
+ const l1ToL2MessageTree = tx.avmProvingRequest.inputs.publicInputs.startTreeSnapshots.l1ToL2MessageTree;
226
355
  tx.avmProvingRequest.inputs.publicInputs.startTreeSnapshots = new TreeSnapshots(
227
- startStateReference.l1ToL2MessageTree,
356
+ l1ToL2MessageTree,
228
357
  startStateReference.partial.noteHashTree,
229
358
  startStateReference.partial.nullifierTree,
230
359
  startStateReference.partial.publicDataTree,
231
360
  );
232
361
  tx.avmProvingRequest.inputs.publicInputs.endTreeSnapshots = new TreeSnapshots(
233
- endStateReference.l1ToL2MessageTree,
362
+ l1ToL2MessageTree,
234
363
  endStateReference.partial.noteHashTree,
235
364
  endStateReference.partial.nullifierTree,
236
365
  endStateReference.partial.publicDataTree,
@@ -245,12 +374,9 @@ class TestProvingOrchestrator extends ProvingOrchestrator {
245
374
 
246
375
  // Disable this check by default, since it requires seeding world state with the block being built
247
376
  // This is only enabled in some tests with multiple blocks that populate the pending chain via makePendingBlock
248
- protected override verifyBuiltBlockAgainstSyncedState(
249
- l2Block: L2Block,
250
- newArchive: AppendOnlyTreeSnapshot,
251
- ): Promise<void> {
377
+ protected override verifyBuiltBlockAgainstSyncedState(provingState: BlockProvingState): Promise<void> {
252
378
  if (this.isVerifyBuiltBlockAgainstSyncedStateEnabled) {
253
- return super.verifyBuiltBlockAgainstSyncedState(l2Block, newArchive);
379
+ return super.verifyBuiltBlockAgainstSyncedState(provingState);
254
380
  }
255
381
  return Promise.resolve();
256
382
  }