@aztec/prover-client 3.0.0-devnet.2 → 3.0.0-devnet.20251212

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 (109) hide show
  1. package/dest/block-factory/index.d.ts +1 -1
  2. package/dest/block-factory/light.d.ts +8 -8
  3. package/dest/block-factory/light.d.ts.map +1 -1
  4. package/dest/block-factory/light.js +37 -23
  5. package/dest/config.d.ts +1 -1
  6. package/dest/config.js +1 -1
  7. package/dest/index.d.ts +1 -1
  8. package/dest/light/lightweight_checkpoint_builder.d.ts +29 -0
  9. package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
  10. package/dest/light/lightweight_checkpoint_builder.js +108 -0
  11. package/dest/mocks/fixtures.d.ts +1 -4
  12. package/dest/mocks/fixtures.d.ts.map +1 -1
  13. package/dest/mocks/fixtures.js +7 -17
  14. package/dest/mocks/test_context.d.ts +27 -46
  15. package/dest/mocks/test_context.d.ts.map +1 -1
  16. package/dest/mocks/test_context.js +102 -116
  17. package/dest/orchestrator/block-building-helpers.d.ts +19 -21
  18. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  19. package/dest/orchestrator/block-building-helpers.js +93 -118
  20. package/dest/orchestrator/block-proving-state.d.ts +17 -11
  21. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  22. package/dest/orchestrator/block-proving-state.js +81 -20
  23. package/dest/orchestrator/checkpoint-proving-state.d.ts +8 -8
  24. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -1
  25. package/dest/orchestrator/checkpoint-proving-state.js +15 -16
  26. package/dest/orchestrator/epoch-proving-state.d.ts +10 -9
  27. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  28. package/dest/orchestrator/epoch-proving-state.js +6 -6
  29. package/dest/orchestrator/index.d.ts +1 -1
  30. package/dest/orchestrator/orchestrator.d.ts +13 -13
  31. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  32. package/dest/orchestrator/orchestrator.js +54 -60
  33. package/dest/orchestrator/orchestrator_metrics.d.ts +1 -1
  34. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  35. package/dest/orchestrator/tx-proving-state.d.ts +6 -6
  36. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  37. package/dest/orchestrator/tx-proving-state.js +14 -23
  38. package/dest/prover-client/factory.d.ts +1 -1
  39. package/dest/prover-client/index.d.ts +1 -1
  40. package/dest/prover-client/prover-client.d.ts +1 -1
  41. package/dest/prover-client/prover-client.d.ts.map +1 -1
  42. package/dest/prover-client/server-epoch-prover.d.ts +9 -8
  43. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  44. package/dest/prover-client/server-epoch-prover.js +4 -4
  45. package/dest/proving_broker/broker_prover_facade.d.ts +21 -21
  46. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  47. package/dest/proving_broker/broker_prover_facade.js +7 -6
  48. package/dest/proving_broker/config.d.ts +12 -8
  49. package/dest/proving_broker/config.d.ts.map +1 -1
  50. package/dest/proving_broker/config.js +8 -2
  51. package/dest/proving_broker/factory.d.ts +1 -1
  52. package/dest/proving_broker/fixtures.d.ts +3 -2
  53. package/dest/proving_broker/fixtures.d.ts.map +1 -1
  54. package/dest/proving_broker/fixtures.js +3 -2
  55. package/dest/proving_broker/index.d.ts +1 -1
  56. package/dest/proving_broker/proof_store/factory.d.ts +2 -2
  57. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +1 -1
  58. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
  59. package/dest/proving_broker/proof_store/index.d.ts +1 -1
  60. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
  61. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
  62. package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
  63. package/dest/proving_broker/proving_agent.d.ts +1 -1
  64. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  65. package/dest/proving_broker/proving_agent_instrumentation.d.ts +1 -1
  66. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -1
  67. package/dest/proving_broker/proving_broker.d.ts +2 -2
  68. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  69. package/dest/proving_broker/proving_broker.js +4 -3
  70. package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
  71. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  72. package/dest/proving_broker/proving_broker_database/persisted.d.ts +3 -2
  73. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  74. package/dest/proving_broker/proving_broker_database/persisted.js +3 -2
  75. package/dest/proving_broker/proving_broker_database.d.ts +3 -2
  76. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  77. package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
  78. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
  79. package/dest/proving_broker/proving_job_controller.d.ts +3 -2
  80. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  81. package/dest/proving_broker/proving_job_controller.js +3 -3
  82. package/dest/proving_broker/rpc.d.ts +4 -4
  83. package/dest/test/mock_proof_store.d.ts +3 -3
  84. package/dest/test/mock_proof_store.d.ts.map +1 -1
  85. package/dest/test/mock_prover.d.ts +5 -6
  86. package/dest/test/mock_prover.d.ts.map +1 -1
  87. package/dest/test/mock_prover.js +3 -3
  88. package/package.json +18 -17
  89. package/src/block-factory/light.ts +40 -43
  90. package/src/config.ts +1 -1
  91. package/src/light/lightweight_checkpoint_builder.ts +144 -0
  92. package/src/mocks/fixtures.ts +7 -30
  93. package/src/mocks/test_context.ts +145 -177
  94. package/src/orchestrator/block-building-helpers.ts +133 -215
  95. package/src/orchestrator/block-proving-state.ts +103 -25
  96. package/src/orchestrator/checkpoint-proving-state.ts +24 -20
  97. package/src/orchestrator/epoch-proving-state.ts +15 -11
  98. package/src/orchestrator/orchestrator.ts +76 -74
  99. package/src/orchestrator/tx-proving-state.ts +24 -33
  100. package/src/prover-client/server-epoch-prover.ts +8 -9
  101. package/src/proving_broker/broker_prover_facade.ts +32 -29
  102. package/src/proving_broker/config.ts +8 -1
  103. package/src/proving_broker/fixtures.ts +8 -3
  104. package/src/proving_broker/proving_broker.ts +4 -3
  105. package/src/proving_broker/proving_broker_database/memory.ts +2 -1
  106. package/src/proving_broker/proving_broker_database/persisted.ts +5 -4
  107. package/src/proving_broker/proving_broker_database.ts +2 -1
  108. package/src/proving_broker/proving_job_controller.ts +5 -4
  109. package/src/test/mock_prover.ts +9 -7
@@ -1,62 +1,64 @@
1
1
  import type { BBProverConfig } from '@aztec/bb-prover';
2
2
  import { TestCircuitProver } from '@aztec/bb-prover';
3
- import { SpongeBlob } from '@aztec/blob-lib';
4
3
  import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
5
- import { padArrayEnd, times, timesParallel } from '@aztec/foundation/collection';
6
- import { Fr } from '@aztec/foundation/fields';
4
+ import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
5
+ import { padArrayEnd, times, timesAsync } from '@aztec/foundation/collection';
6
+ import { Fr } from '@aztec/foundation/curves/bn254';
7
7
  import type { Logger } from '@aztec/foundation/log';
8
- import { TestDateProvider } from '@aztec/foundation/timer';
9
8
  import type { FieldsOf } from '@aztec/foundation/types';
10
9
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
11
10
  import { ProtocolContractsList } from '@aztec/protocol-contracts';
12
11
  import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-juice';
13
- import { SimpleContractDataSource } from '@aztec/simulator/public/fixtures';
14
- import { PublicProcessorFactory } from '@aztec/simulator/server';
15
12
  import { PublicDataWrite } from '@aztec/stdlib/avm';
16
13
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
17
14
  import { EthAddress } from '@aztec/stdlib/block';
18
- import { getCheckpointBlobFields } from '@aztec/stdlib/checkpoint';
19
- import type { ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
15
+ import type { Checkpoint } from '@aztec/stdlib/checkpoint';
16
+ import type { MerkleTreeWriteOperations, ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
20
17
  import type { CheckpointConstantData } from '@aztec/stdlib/rollup';
21
- import { makeBloatedProcessedTx } from '@aztec/stdlib/testing';
18
+ import { mockProcessedTx } from '@aztec/stdlib/testing';
22
19
  import { MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
23
- import { type BlockHeader, type GlobalVariables, type ProcessedTx, TreeSnapshots, type Tx } from '@aztec/stdlib/tx';
20
+ import {
21
+ type BlockHeader,
22
+ type GlobalVariables,
23
+ type ProcessedTx,
24
+ StateReference,
25
+ TreeSnapshots,
26
+ } from '@aztec/stdlib/tx';
24
27
  import type { MerkleTreeAdminDatabase } from '@aztec/world-state';
25
28
  import { NativeWorldStateService } from '@aztec/world-state/native';
26
29
 
27
30
  import { promises as fs } from 'fs';
28
31
 
29
- import { buildBlockWithCleanDB } from '../block-factory/light.js';
30
- import { getTreeSnapshot } from '../orchestrator/block-building-helpers.js';
32
+ import { LightweightCheckpointBuilder } from '../light/lightweight_checkpoint_builder.js';
33
+ import {
34
+ buildFinalBlobChallenges,
35
+ getTreeSnapshot,
36
+ insertSideEffects,
37
+ } from '../orchestrator/block-building-helpers.js';
31
38
  import type { BlockProvingState } from '../orchestrator/block-proving-state.js';
32
39
  import { ProvingOrchestrator } from '../orchestrator/index.js';
33
40
  import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js';
34
41
  import { TestBroker } from '../test/mock_prover.js';
35
- import {
36
- getEnvironmentConfig,
37
- getSimulator,
38
- makeCheckpointConstants,
39
- makeGlobals,
40
- updateExpectedTreesFromTxs,
41
- } from './fixtures.js';
42
+ import { getEnvironmentConfig, getSimulator, makeCheckpointConstants, makeGlobals } from './fixtures.js';
42
43
 
43
44
  export class TestContext {
44
45
  private headers: Map<number, BlockHeader> = new Map();
46
+ private checkpoints: Checkpoint[] = [];
47
+ private nextCheckpointIndex = 0;
48
+ private nextBlockNumber = 1;
49
+ private epochNumber = 1;
45
50
  private feePayerBalance: Fr;
46
51
 
47
52
  constructor(
48
53
  public worldState: MerkleTreeAdminDatabase,
49
- public firstCheckpointNumber: Fr,
50
- public globalVariables: GlobalVariables,
51
54
  public prover: ServerCircuitProver,
52
55
  public broker: TestBroker,
53
56
  public brokerProverFacade: BrokerCircuitProverFacade,
54
57
  public orchestrator: TestProvingOrchestrator,
55
- public blockNumber: number,
56
- public feePayer: AztecAddress,
58
+ private feePayer: AztecAddress,
57
59
  initialFeePayerBalance: Fr,
58
- public directoriesToCleanup: string[],
59
- public logger: Logger,
60
+ private directoriesToCleanup: string[],
61
+ private logger: Logger,
60
62
  ) {
61
63
  this.feePayerBalance = initialFeePayerBalance;
62
64
  }
@@ -65,27 +67,17 @@ export class TestContext {
65
67
  return this.orchestrator;
66
68
  }
67
69
 
68
- public getCheckpointConstants(checkpointIndex = 0): CheckpointConstantData {
69
- return makeCheckpointConstants(this.firstCheckpointNumber.toNumber() + checkpointIndex);
70
- }
71
-
72
70
  static async new(
73
71
  logger: Logger,
74
72
  {
75
73
  proverCount = 4,
76
74
  createProver = async (bbConfig: BBProverConfig) => new TestCircuitProver(await getSimulator(bbConfig, logger)),
77
- slotNumber = 1,
78
- blockNumber = 1,
79
75
  }: {
80
76
  proverCount?: number;
81
77
  createProver?: (bbConfig: BBProverConfig) => Promise<ServerCircuitProver>;
82
- slotNumber?: number;
83
- blockNumber?: number;
84
78
  } = {},
85
79
  ) {
86
80
  const directoriesToCleanup: string[] = [];
87
- const firstCheckpointNumber = new Fr(slotNumber);
88
- const globalVariables = makeGlobals(blockNumber, slotNumber);
89
81
 
90
82
  const feePayer = AztecAddress.fromNumber(42222);
91
83
  const initialFeePayerBalance = new Fr(10n ** 20n);
@@ -129,13 +121,10 @@ export class TestContext {
129
121
 
130
122
  return new this(
131
123
  ws,
132
- firstCheckpointNumber,
133
- globalVariables,
134
124
  localProver,
135
125
  broker,
136
126
  facade,
137
127
  orchestrator,
138
- blockNumber,
139
128
  feePayer,
140
129
  initialFeePayerBalance,
141
130
  directoriesToCleanup,
@@ -147,16 +136,6 @@ export class TestContext {
147
136
  return this.worldState.fork();
148
137
  }
149
138
 
150
- public getBlockHeader(blockNumber: 0): BlockHeader;
151
- public getBlockHeader(blockNumber: number): BlockHeader | undefined;
152
- public getBlockHeader(blockNumber = 0): BlockHeader | undefined {
153
- return blockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.headers.get(blockNumber);
154
- }
155
-
156
- public getPreviousBlockHeader(currentBlockNumber = this.blockNumber): BlockHeader {
157
- return this.getBlockHeader(currentBlockNumber - 1)!;
158
- }
159
-
160
139
  async cleanup() {
161
140
  await this.brokerProverFacade.stop();
162
141
  await this.broker.stop();
@@ -169,188 +148,172 @@ export class TestContext {
169
148
  }
170
149
  }
171
150
 
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);
176
- const tx = await makeBloatedProcessedTx({
177
- header,
178
- vkTreeRoot: getVKTreeRoot(),
179
- protocolContracts: ProtocolContractsList,
180
- globalVariables,
181
- feePayer: this.feePayer,
182
- ...opts,
183
- });
184
- this.feePayerBalance = new Fr(this.feePayerBalance.toBigInt() - tx.txEffect.transactionFee.toBigInt());
185
- if (opts?.privateOnly) {
186
- const feePayerSlot = await computeFeePayerBalanceLeafSlot(this.feePayer);
187
- tx.txEffect.publicDataWrites[0] = new PublicDataWrite(feePayerSlot, this.feePayerBalance);
188
- }
189
- return tx;
151
+ public startNewEpoch() {
152
+ this.checkpoints = [];
153
+ this.nextCheckpointIndex = 0;
154
+ this.epochNumber++;
190
155
  }
191
156
 
192
- /** Creates a block with the given number of txs and adds it to world-state */
193
- public async makePendingBlock(
194
- numTxs: number,
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
- } = {},
206
- ) {
207
- const slotNumber = this.firstCheckpointNumber.toNumber() + checkpointIndex;
208
- const globalVariables = makeGlobals(blockNumber, slotNumber);
209
- const blockNum = globalVariables.blockNumber;
210
- const db = await this.worldState.fork();
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);
218
- const txs = await timesParallel(numTxs, i =>
219
- this.makeProcessedTx({
220
- seed: i + blockNum * 1000,
221
- globalVariables,
222
- newL1ToL2Snapshot,
223
- ...makeProcessedTxOpts(i),
224
- }),
225
- );
226
- await this.setTreeRoots(txs);
157
+ // Return blob fields of all checkpoints in the epoch.
158
+ public getBlobFields() {
159
+ return this.checkpoints.map(checkpoint => checkpoint.toBlobFields());
160
+ }
227
161
 
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 };
162
+ public async getFinalBlobChallenges() {
163
+ const blobFields = this.getBlobFields();
164
+ return await buildFinalBlobChallenges(blobFields);
232
165
  }
233
166
 
234
- public async makePendingBlocksInCheckpoint(
167
+ public async makeCheckpoint(
235
168
  numBlocks: number,
236
169
  {
237
- checkpointIndex = 0,
238
- numTxsPerBlock = 1,
170
+ numTxsPerBlock = 0,
239
171
  numL1ToL2Messages = 0,
240
- firstBlockNumber = this.blockNumber + checkpointIndex * numBlocks,
241
- makeGlobalVariablesOpts = () => ({}),
242
172
  makeProcessedTxOpts = () => ({}),
173
+ ...constantOpts
243
174
  }: {
244
- checkpointIndex?: number;
245
175
  numTxsPerBlock?: number | number[];
246
176
  numL1ToL2Messages?: number;
247
- firstBlockNumber?: number;
248
- makeGlobalVariablesOpts?: (
249
- blockNumber: number,
250
- checkpointIndex: number,
251
- ) => Partial<FieldsOf<GlobalVariables> & FieldsOf<CheckpointConstantData>>;
252
177
  makeProcessedTxOpts?: (
253
178
  blockGlobalVariables: GlobalVariables,
254
179
  txIndex: number,
255
- ) => Partial<Parameters<typeof makeBloatedProcessedTx>[0]>;
256
- } = {},
180
+ ) => Partial<Parameters<typeof mockProcessedTx>[0]>;
181
+ } & Partial<FieldsOf<CheckpointConstantData>> = {},
257
182
  ) {
258
- const slotNumber = this.firstCheckpointNumber.toNumber() + checkpointIndex;
183
+ if (numBlocks === 0) {
184
+ throw new Error(
185
+ 'Cannot make a checkpoint with 0 blocks. Crate an empty block (numTxsPerBlock = 0) if there are no txs.',
186
+ );
187
+ }
188
+
189
+ const checkpointIndex = this.nextCheckpointIndex++;
190
+ const checkpointNumber = CheckpointNumber(checkpointIndex + 1);
191
+ const slotNumber = checkpointNumber * 15; // times an arbitrary number to make it different to the checkpoint number
192
+
193
+ const constants = makeCheckpointConstants(slotNumber, constantOpts);
194
+
195
+ const fork = await this.worldState.fork();
196
+
197
+ // Build l1 to l2 messages.
259
198
  const l1ToL2Messages = times(numL1ToL2Messages, i => new Fr(slotNumber * 100 + i));
260
- const merkleTrees = await this.worldState.fork();
261
- await merkleTrees.appendLeaves(
199
+ await fork.appendLeaves(
262
200
  MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
263
201
  padArrayEnd<Fr, number>(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP),
264
202
  );
265
- const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, merkleTrees);
203
+ const newL1ToL2Snapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, fork);
266
204
 
205
+ const startBlockNumber = this.nextBlockNumber;
206
+ const previousBlockHeader = this.getBlockHeader(BlockNumber(startBlockNumber - 1));
207
+
208
+ // Build global variables.
267
209
  const blockGlobalVariables = times(numBlocks, i =>
268
- makeGlobals(firstBlockNumber + i, slotNumber, makeGlobalVariablesOpts(firstBlockNumber + i, checkpointIndex)),
210
+ makeGlobals(startBlockNumber + i, slotNumber, {
211
+ coinbase: constants.coinbase,
212
+ feeRecipient: constants.feeRecipient,
213
+ gasFees: constants.gasFees,
214
+ }),
269
215
  );
216
+ this.nextBlockNumber += numBlocks;
217
+
218
+ // Build txs.
270
219
  let totalTxs = 0;
271
- const blockTxs = await timesParallel(numBlocks, blockIndex => {
220
+ const blockEndStates: StateReference[] = [];
221
+ const blockTxs = await timesAsync(numBlocks, async blockIndex => {
272
222
  const txIndexOffset = totalTxs;
273
223
  const numTxs = typeof numTxsPerBlock === 'number' ? numTxsPerBlock : numTxsPerBlock[blockIndex];
274
224
  totalTxs += numTxs;
275
- return timesParallel(numTxs, txIndex =>
225
+ const txs = await timesAsync(numTxs, txIndex =>
276
226
  this.makeProcessedTx({
277
- seed: (txIndexOffset + txIndex + 1) * 321 + (checkpointIndex + 1) * 123456,
227
+ seed: (txIndexOffset + txIndex + 1) * 321 + (checkpointIndex + 1) * 123456 + this.epochNumber * 0x99999,
278
228
  globalVariables: blockGlobalVariables[blockIndex],
279
- header: this.getBlockHeader(firstBlockNumber - 1),
229
+ anchorBlockHeader: previousBlockHeader,
280
230
  newL1ToL2Snapshot,
281
231
  ...makeProcessedTxOpts(blockGlobalVariables[blockIndex], txIndexOffset + txIndex),
282
232
  }),
283
233
  );
234
+
235
+ // Insert side effects into the trees.
236
+ const endState = await this.updateTrees(txs, fork);
237
+ blockEndStates.push(endState);
238
+
239
+ return txs;
284
240
  });
285
241
 
286
- const blobFields = getCheckpointBlobFields(blockTxs.map(txs => txs.map(tx => tx.txEffect)));
287
- const spongeBlobState = await SpongeBlob.init(blobFields.length);
242
+ const cleanFork = await this.worldState.fork();
243
+ const builder = await LightweightCheckpointBuilder.startNewCheckpoint(
244
+ checkpointNumber,
245
+ constants,
246
+ l1ToL2Messages,
247
+ cleanFork,
248
+ );
288
249
 
289
- const blocks: { header: BlockHeader; txs: ProcessedTx[] }[] = [];
250
+ // Add tx effects to db and build block headers.
251
+ const blocks = [];
290
252
  for (let i = 0; i < numBlocks; i++) {
291
- const isFirstBlock = i === 0;
292
- const blockNumber = firstBlockNumber + i;
293
- const globalVariables = blockGlobalVariables[i];
294
253
  const txs = blockTxs[i];
254
+ const state = blockEndStates[i];
295
255
 
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);
256
+ const block = await builder.addBlock(blockGlobalVariables[i], state, txs);
301
257
 
302
- const header = block.getBlockHeader();
303
- this.headers.set(blockNumber, header);
258
+ const header = block.header;
259
+ this.headers.set(block.number, header);
304
260
 
305
- await this.worldState.handleL2BlockAndMessages(block, blockMsgs, isFirstBlock);
306
-
307
- const blockBlobFields = block.body.toBlobFields();
308
- await spongeBlobState.absorb(blockBlobFields);
261
+ const blockMsgs = block.indexWithinCheckpoint === 0 ? l1ToL2Messages : [];
262
+ await this.worldState.handleL2BlockAndMessages(block, blockMsgs);
309
263
 
310
264
  blocks.push({ header, txs });
311
265
  }
312
266
 
313
- return { blocks, l1ToL2Messages, blobFields };
314
- }
267
+ const checkpoint = await builder.completeCheckpoint();
268
+ this.checkpoints.push(checkpoint);
315
269
 
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
- );
270
+ return {
271
+ constants,
272
+ header: checkpoint.header,
273
+ blocks,
274
+ l1ToL2Messages,
275
+ previousBlockHeader,
276
+ };
277
+ }
334
278
 
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,
279
+ private async makeProcessedTx(opts: Parameters<typeof mockProcessedTx>[0] = {}): Promise<ProcessedTx> {
280
+ const tx = await mockProcessedTx({
281
+ vkTreeRoot: getVKTreeRoot(),
282
+ protocolContracts: ProtocolContractsList,
283
+ feePayer: this.feePayer,
284
+ ...opts,
342
285
  });
343
286
 
344
- return await publicProcessor.process(txs, { maxTransactions });
287
+ this.feePayerBalance = new Fr(this.feePayerBalance.toBigInt() - tx.txEffect.transactionFee.toBigInt());
288
+
289
+ const feePayerSlot = await computeFeePayerBalanceLeafSlot(this.feePayer);
290
+ const feePaymentPublicDataWrite = new PublicDataWrite(feePayerSlot, this.feePayerBalance);
291
+ tx.txEffect.publicDataWrites[0] = feePaymentPublicDataWrite;
292
+ if (tx.avmProvingRequest) {
293
+ tx.avmProvingRequest.inputs.publicInputs.accumulatedData.publicDataWrites[0] = feePaymentPublicDataWrite;
294
+ }
295
+
296
+ return tx;
297
+ }
298
+
299
+ private getBlockHeader(blockNumber: BlockNumber): BlockHeader {
300
+ if (Number(blockNumber) > 0 && Number(blockNumber) >= this.nextBlockNumber) {
301
+ throw new Error(`Block header not built for block number ${blockNumber}.`);
302
+ }
303
+ return Number(blockNumber) === 0
304
+ ? this.worldState.getCommitted().getInitialHeader()
305
+ : this.headers.get(Number(blockNumber))!;
345
306
  }
346
307
 
347
- private async setTreeRoots(txs: ProcessedTx[]) {
348
- const db = await this.worldState.fork();
308
+ private async updateTrees(txs: ProcessedTx[], fork: MerkleTreeWriteOperations) {
309
+ let startStateReference = await fork.getStateReference();
310
+ let endStateReference = startStateReference;
349
311
  for (const tx of txs) {
350
- const startStateReference = await db.getStateReference();
351
- await updateExpectedTreesFromTxs(db, [tx]);
352
- const endStateReference = await db.getStateReference();
312
+ await insertSideEffects(tx, fork);
313
+ endStateReference = await fork.getStateReference();
314
+
353
315
  if (tx.avmProvingRequest) {
316
+ // Update the trees in the avm public inputs so that the proof won't fail.
354
317
  const l1ToL2MessageTree = tx.avmProvingRequest.inputs.publicInputs.startTreeSnapshots.l1ToL2MessageTree;
355
318
  tx.avmProvingRequest.inputs.publicInputs.startTreeSnapshots = new TreeSnapshots(
356
319
  l1ToL2MessageTree,
@@ -358,6 +321,7 @@ export class TestContext {
358
321
  startStateReference.partial.nullifierTree,
359
322
  startStateReference.partial.publicDataTree,
360
323
  );
324
+
361
325
  tx.avmProvingRequest.inputs.publicInputs.endTreeSnapshots = new TreeSnapshots(
362
326
  l1ToL2MessageTree,
363
327
  endStateReference.partial.noteHashTree,
@@ -365,7 +329,11 @@ export class TestContext {
365
329
  endStateReference.partial.publicDataTree,
366
330
  );
367
331
  }
332
+
333
+ startStateReference = endStateReference;
368
334
  }
335
+
336
+ return endStateReference;
369
337
  }
370
338
  }
371
339