@aztec/prover-client 3.0.0-nightly.20250917 → 3.0.0-nightly.20250918

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 (51) hide show
  1. package/dest/block-factory/light.d.ts +5 -3
  2. package/dest/block-factory/light.d.ts.map +1 -1
  3. package/dest/block-factory/light.js +16 -9
  4. package/dest/mocks/fixtures.d.ts +3 -1
  5. package/dest/mocks/fixtures.d.ts.map +1 -1
  6. package/dest/mocks/fixtures.js +19 -2
  7. package/dest/mocks/test_context.d.ts +30 -9
  8. package/dest/mocks/test_context.d.ts.map +1 -1
  9. package/dest/mocks/test_context.js +68 -15
  10. package/dest/orchestrator/block-building-helpers.d.ts +16 -14
  11. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  12. package/dest/orchestrator/block-building-helpers.js +69 -66
  13. package/dest/orchestrator/block-proving-state.d.ts +53 -46
  14. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  15. package/dest/orchestrator/block-proving-state.js +209 -172
  16. package/dest/orchestrator/checkpoint-proving-state.d.ts +62 -0
  17. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  18. package/dest/orchestrator/checkpoint-proving-state.js +208 -0
  19. package/dest/orchestrator/epoch-proving-state.d.ts +32 -25
  20. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  21. package/dest/orchestrator/epoch-proving-state.js +132 -81
  22. package/dest/orchestrator/orchestrator.d.ts +25 -24
  23. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  24. package/dest/orchestrator/orchestrator.js +318 -190
  25. package/dest/prover-client/server-epoch-prover.d.ts +8 -7
  26. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  27. package/dest/prover-client/server-epoch-prover.js +7 -7
  28. package/dest/proving_broker/broker_prover_facade.d.ts +12 -7
  29. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  30. package/dest/proving_broker/broker_prover_facade.js +30 -15
  31. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  32. package/dest/proving_broker/proving_broker.js +18 -7
  33. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  34. package/dest/proving_broker/proving_job_controller.js +26 -6
  35. package/dest/test/mock_prover.d.ts +12 -7
  36. package/dest/test/mock_prover.d.ts.map +1 -1
  37. package/dest/test/mock_prover.js +25 -10
  38. package/package.json +15 -15
  39. package/src/block-factory/light.ts +33 -9
  40. package/src/mocks/fixtures.ts +25 -7
  41. package/src/mocks/test_context.ts +113 -21
  42. package/src/orchestrator/block-building-helpers.ts +107 -93
  43. package/src/orchestrator/block-proving-state.ts +225 -212
  44. package/src/orchestrator/checkpoint-proving-state.ts +294 -0
  45. package/src/orchestrator/epoch-proving-state.ts +169 -121
  46. package/src/orchestrator/orchestrator.ts +466 -247
  47. package/src/prover-client/server-epoch-prover.ts +30 -16
  48. package/src/proving_broker/broker_prover_facade.ts +145 -71
  49. package/src/proving_broker/proving_broker.ts +24 -6
  50. package/src/proving_broker/proving_job_controller.ts +26 -6
  51. package/src/test/mock_prover.ts +105 -28
@@ -1,4 +1,4 @@
1
- import { Blob } from '@aztec/blob-lib';
1
+ import { BatchedBlob, Blob, SpongeBlob } from '@aztec/blob-lib';
2
2
  import { ARCHIVE_HEIGHT, CIVC_PROOF_LENGTH, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, PUBLIC_DATA_TREE_HEIGHT } from '@aztec/constants';
3
3
  import { makeTuple } from '@aztec/foundation/array';
4
4
  import { padArrayEnd } from '@aztec/foundation/collection';
@@ -7,23 +7,21 @@ import { BLS12Point, Fr } from '@aztec/foundation/fields';
7
7
  import { assertLength, toFriendlyJSON } from '@aztec/foundation/serialize';
8
8
  import { MembershipWitness, MerkleTreeCalculator, computeUnbalancedMerkleTreeRoot } from '@aztec/foundation/trees';
9
9
  import { getVkData } from '@aztec/noir-protocol-circuits-types/server/vks';
10
- import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
11
- import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
10
+ import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vk-tree';
12
11
  import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-juice';
13
12
  import { PublicDataHint } from '@aztec/stdlib/avm';
14
- import { Body } from '@aztec/stdlib/block';
13
+ import { Body, L2BlockHeader, getBlockBlobFields } from '@aztec/stdlib/block';
15
14
  import { ContractClassLogFields } from '@aztec/stdlib/logs';
16
15
  import { Proof, ProofData, RecursiveProof } from '@aztec/stdlib/proofs';
17
16
  import { BlockConstantData, PrivateBaseRollupHints, PrivateBaseStateDiffHints, PublicBaseRollupHints, PublicTubePrivateInputs } from '@aztec/stdlib/rollup';
18
17
  import { AppendOnlyTreeSnapshot, MerkleTreeId, NullifierLeafPreimage, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, getTreeHeight } from '@aztec/stdlib/trees';
19
- import { BlockHeader, ContentCommitment, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
18
+ import { BlockHeader, ContentCommitment, GlobalVariables, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
20
19
  import { VkData } from '@aztec/stdlib/vks';
21
20
  import { Attributes, runInSpan } from '@aztec/telemetry-client';
22
21
  // Builds the hints for base rollup. Updating the contract, nullifier, and data trees in the process.
23
- export const insertSideEffectsAndBuildBaseRollupHints = runInSpan('BlockBuilderHelpers', 'buildBaseRollupHints', async (span, tx, globalVariables, newL1ToL2MessageTreeSnapshot, db, startSpongeBlob)=>{
22
+ export const insertSideEffectsAndBuildBaseRollupHints = runInSpan('BlockBuilderHelpers', 'buildBaseRollupHints', async (span, tx, lastArchive, newL1ToL2MessageTreeSnapshot, startSpongeBlob, proverId, db)=>{
24
23
  span.setAttribute(Attributes.TX_HASH, tx.hash.toString());
25
24
  // Get trees info before any changes hit
26
- const lastArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
27
25
  const start = new PartialStateReference(await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE, db), await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE, db), await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE, db));
28
26
  // Get the subtree sibling paths for the circuit
29
27
  const noteHashSubtreeSiblingPathArray = await getSubtreeSiblingPath(MerkleTreeId.NOTE_HASH_TREE, NOTE_HASH_SUBTREE_HEIGHT, db);
@@ -47,18 +45,16 @@ export const insertSideEffectsAndBuildBaseRollupHints = runInSpan('BlockBuilderH
47
45
  const nullifierPredecessorMembershipWitnessesWithoutPadding = nullifierWitnessLeaves.map((l)=>MembershipWitness.fromBufferArray(l.index, assertLength(l.siblingPath.toBufferArray(), NULLIFIER_TREE_HEIGHT)));
48
46
  const nullifierSubtreeSiblingPathArray = nullifiersSubtreeSiblingPath.toFields();
49
47
  const nullifierSubtreeSiblingPath = makeTuple(NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, (i)=>i < nullifierSubtreeSiblingPathArray.length ? nullifierSubtreeSiblingPathArray[i] : Fr.ZERO);
50
- // Append new data to startSpongeBlob
51
- const inputSpongeBlob = startSpongeBlob.clone();
52
- await startSpongeBlob.absorb(tx.txEffect.toBlobFields());
53
48
  const contractClassLogsFields = makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, (i)=>tx.txEffect.contractClassLogs[i]?.fields || ContractClassLogFields.empty());
54
49
  if (tx.avmProvingRequest) {
55
- const blockHash = await tx.data.constants.historicalHeader.hash();
50
+ const blockHash = await tx.data.constants.anchorBlockHeader.hash();
56
51
  const archiveRootMembershipWitness = await getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT, db);
57
52
  return PublicBaseRollupHints.from({
58
- startSpongeBlob: inputSpongeBlob,
53
+ startSpongeBlob,
59
54
  lastArchive,
60
55
  archiveRootMembershipWitness,
61
- contractClassLogsFields
56
+ contractClassLogsFields,
57
+ proverId
62
58
  });
63
59
  } else {
64
60
  if (txPublicDataUpdateRequestInfo.lowPublicDataWritesMembershipWitnesses.length > 1 || txPublicDataUpdateRequestInfo.lowPublicDataWritesPreimages.length > 1 || txPublicDataUpdateRequestInfo.publicDataWritesSiblingPaths.length > 1) {
@@ -78,18 +74,19 @@ export const insertSideEffectsAndBuildBaseRollupHints = runInSpan('BlockBuilderH
78
74
  feeWriteLowLeafMembershipWitness,
79
75
  feeWriteSiblingPath
80
76
  });
81
- const blockHash = await tx.data.constants.historicalHeader.hash();
77
+ const blockHash = await tx.data.constants.anchorBlockHeader.hash();
82
78
  const archiveRootMembershipWitness = await getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT, db);
83
79
  const constants = BlockConstantData.from({
84
80
  lastArchive,
85
- newL1ToL2: newL1ToL2MessageTreeSnapshot,
86
- vkTreeRoot: getVKTreeRoot(),
87
- protocolContractTreeRoot,
88
- globalVariables
81
+ l1ToL2TreeSnapshot: newL1ToL2MessageTreeSnapshot,
82
+ vkTreeRoot: tx.data.constants.vkTreeRoot,
83
+ protocolContractTreeRoot: tx.data.constants.protocolContractTreeRoot,
84
+ globalVariables: tx.globalVariables,
85
+ proverId
89
86
  });
90
87
  return PrivateBaseRollupHints.from({
91
88
  start,
92
- startSpongeBlob: inputSpongeBlob,
89
+ startSpongeBlob,
93
90
  stateDiffHints,
94
91
  feePayerFeeJuiceBalanceReadHint,
95
92
  archiveRootMembershipWitness,
@@ -124,8 +121,10 @@ export function getPublicTubePrivateInputsFromTx(tx) {
124
121
  const proofData = new ProofData(tx.data.toPrivateToPublicKernelCircuitPublicInputs(), getCivcProofFromTx(tx), getVkData('HidingKernelToPublic'));
125
122
  return new PublicTubePrivateInputs(proofData);
126
123
  }
127
- export const buildBlobHints = runInSpan('BlockBuilderHelpers', 'buildBlobHints', async (_span, txEffects)=>{
128
- const blobFields = txEffects.flatMap((tx)=>tx.toBlobFields());
124
+ // Build "hints" as the private inputs for the checkpoint root rollup circuit.
125
+ // The `blobCommitments` will be accumulated and checked in the root rollup against the `finalBlobChallenges`.
126
+ // The `blobsHash` will be validated on L1 against the blob fields.
127
+ export const buildBlobHints = runInSpan('BlockBuilderHelpers', 'buildBlobHints', async (_span, blobFields)=>{
129
128
  const blobs = await Blob.getBlobsPerBlock(blobFields);
130
129
  // TODO(#13430): The blobsHash is confusingly similar to blobCommitmentsHash, calculated from below blobCommitments:
131
130
  // - blobsHash := sha256([blobhash_0, ..., blobhash_m]) = a hash of all blob hashes in a block with m+1 blobs inserted into the header, exists so a user can cross check blobs.
@@ -135,32 +134,45 @@ export const buildBlobHints = runInSpan('BlockBuilderHelpers', 'buildBlobHints',
135
134
  const blobCommitments = blobs.map((b)=>BLS12Point.decompress(b.commitment));
136
135
  const blobsHash = new Fr(getBlobsHashFromBlobs(blobs));
137
136
  return {
138
- blobFields,
139
137
  blobCommitments,
140
138
  blobs,
141
139
  blobsHash
142
140
  };
143
141
  });
144
- export const accumulateBlobs = runInSpan('BlockBuilderHelpers', 'accumulateBlobs', async (_span, txs, startBlobAccumulator)=>{
145
- const blobFields = txs.flatMap((tx)=>tx.txEffect.toBlobFields());
142
+ // Build the data required to prove the txs in an epoch. Currently only used in tests.
143
+ export const buildBlobDataFromTxs = async (txsPerCheckpoint)=>{
144
+ const blobFields = txsPerCheckpoint.map((txs)=>getBlockBlobFields(txs.map((tx)=>tx.txEffect)));
145
+ const finalBlobChallenges = await buildFinalBlobChallenges(blobFields);
146
+ return {
147
+ blobFieldsLengths: blobFields.map((fields)=>fields.length),
148
+ finalBlobChallenges
149
+ };
150
+ };
151
+ export const buildFinalBlobChallenges = async (blobFieldsPerCheckpoint)=>{
152
+ const blobs = await Promise.all(blobFieldsPerCheckpoint.map((blobFields)=>Blob.getBlobsPerBlock(blobFields)));
153
+ return await BatchedBlob.precomputeBatchedBlobChallenges(blobs.flat());
154
+ };
155
+ export const accumulateBlobs = runInSpan('BlockBuilderHelpers', 'accumulateBlobs', async (_span, blobFields, startBlobAccumulator)=>{
146
156
  const blobs = await Blob.getBlobsPerBlock(blobFields);
147
157
  const endBlobAccumulator = startBlobAccumulator.accumulateBlobs(blobs);
148
158
  return endBlobAccumulator;
149
159
  });
150
- export const buildHeaderFromCircuitOutputs = runInSpan('BlockBuilderHelpers', 'buildHeaderFromCircuitOutputs', (_span, previousRollupData, parityPublicInputs, rootRollupOutputs, blobsHash, endState)=>{
151
- if (previousRollupData.length > 2) {
152
- throw new Error(`There can't be more than 2 previous rollups. Received ${previousRollupData.length}.`);
153
- }
154
- const outHash = previousRollupData.length === 0 ? Fr.ZERO : previousRollupData.length === 1 ? previousRollupData[0].outHash : sha256ToField([
155
- previousRollupData[0].outHash,
156
- previousRollupData[1].outHash
157
- ]);
158
- const contentCommitment = new ContentCommitment(blobsHash, parityPublicInputs.shaRoot, outHash);
159
- const accumulatedFees = previousRollupData.reduce((sum, d)=>sum.add(d.accumulatedFees), Fr.ZERO);
160
- const accumulatedManaUsed = previousRollupData.reduce((sum, d)=>sum.add(d.accumulatedManaUsed), Fr.ZERO);
161
- return new BlockHeader(rootRollupOutputs.previousArchive, contentCommitment, endState, rootRollupOutputs.endGlobalVariables, accumulatedFees, accumulatedManaUsed);
160
+ export const buildHeaderFromCircuitOutputs = runInSpan('BlockBuilderHelpers', 'buildHeaderFromCircuitOutputs', async (_span, blockRootRollupOutput)=>{
161
+ const constants = blockRootRollupOutput.constants;
162
+ const globalVariables = GlobalVariables.from({
163
+ chainId: constants.chainId,
164
+ version: constants.version,
165
+ blockNumber: blockRootRollupOutput.previousArchive.nextAvailableLeafIndex,
166
+ timestamp: blockRootRollupOutput.endTimestamp,
167
+ slotNumber: constants.slotNumber,
168
+ coinbase: constants.coinbase,
169
+ feeRecipient: constants.feeRecipient,
170
+ gasFees: constants.gasFees
171
+ });
172
+ const spongeBlobHash = await blockRootRollupOutput.endSpongeBlob.clone().squeeze();
173
+ return new BlockHeader(blockRootRollupOutput.previousArchive, blockRootRollupOutput.endState, spongeBlobHash, globalVariables, blockRootRollupOutput.accumulatedFees, blockRootRollupOutput.accumulatedManaUsed);
162
174
  });
163
- export const buildHeaderAndBodyFromTxs = runInSpan('BlockBuilderHelpers', 'buildHeaderAndBodyFromTxs', async (span, txs, globalVariables, l1ToL2Messages, db)=>{
175
+ export const buildHeaderAndBodyFromTxs = runInSpan('BlockBuilderHelpers', 'buildHeaderAndBodyFromTxs', async (span, txs, globalVariables, l1ToL2Messages, db, startSpongeBlob)=>{
164
176
  span.setAttribute(Attributes.BLOCK_NUMBER, globalVariables.blockNumber);
165
177
  const stateReference = new StateReference(await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db), new PartialStateReference(await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE, db), await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE, db), await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE, db)));
166
178
  const previousArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
@@ -169,16 +181,33 @@ export const buildHeaderAndBodyFromTxs = runInSpan('BlockBuilderHelpers', 'build
169
181
  const txOutHashes = txEffects.map((tx)=>tx.txOutHash());
170
182
  const outHash = txOutHashes.length === 0 ? Fr.ZERO : new Fr(computeUnbalancedMerkleTreeRoot(txOutHashes));
171
183
  const parityShaRoot = await computeInHashFromL1ToL2Messages(l1ToL2Messages);
172
- const blobsHash = getBlobsHashFromBlobs(await Blob.getBlobsPerBlock(body.toBlobFields()));
184
+ const blobFields = body.toBlobFields();
185
+ const blobsHash = getBlobsHashFromBlobs(await Blob.getBlobsPerBlock(blobFields));
173
186
  const contentCommitment = new ContentCommitment(blobsHash, parityShaRoot, outHash);
174
187
  const fees = txEffects.reduce((acc, tx)=>acc.add(tx.transactionFee), Fr.ZERO);
175
188
  const manaUsed = txs.reduce((acc, tx)=>acc.add(new Fr(tx.gasUsed.billedGas.l2Gas)), Fr.ZERO);
176
- const header = new BlockHeader(previousArchive, contentCommitment, stateReference, globalVariables, fees, manaUsed);
189
+ const endSpongeBlob = startSpongeBlob?.clone() ?? SpongeBlob.init(blobFields.length);
190
+ await endSpongeBlob.absorb(blobFields);
191
+ const spongeBlobHash = await endSpongeBlob.squeeze();
192
+ const header = new L2BlockHeader(previousArchive, contentCommitment, stateReference, globalVariables, fees, manaUsed, spongeBlobHash);
177
193
  return {
178
194
  header,
179
195
  body
180
196
  };
181
197
  });
198
+ export const buildBlockHeaderFromTxs = runInSpan('BlockBuilderHelpers', 'buildBlockHeaderFromTxs', async (span, txs, globalVariables, startSpongeBlob, db)=>{
199
+ span.setAttribute(Attributes.BLOCK_NUMBER, globalVariables.blockNumber);
200
+ const stateReference = new StateReference(await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db), new PartialStateReference(await getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE, db), await getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE, db), await getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE, db)));
201
+ const previousArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
202
+ const blobFields = getBlockBlobFields(txs.map((tx)=>tx.txEffect));
203
+ const endSpongeBlob = startSpongeBlob.clone();
204
+ await endSpongeBlob.absorb(blobFields);
205
+ const spongeBlobHash = await endSpongeBlob.squeeze();
206
+ const txEffects = txs.map((tx)=>tx.txEffect);
207
+ const fees = txEffects.reduce((acc, tx)=>acc.add(tx.transactionFee), Fr.ZERO);
208
+ const manaUsed = txs.reduce((acc, tx)=>acc.add(new Fr(tx.gasUsed.billedGas.l2Gas)), Fr.ZERO);
209
+ return new BlockHeader(previousArchive, stateReference, spongeBlobHash, globalVariables, fees, manaUsed);
210
+ });
182
211
  /** Computes the inHash for a block's ContentCommitment given its l1 to l2 messages. */ export async function computeInHashFromL1ToL2Messages(unpaddedL1ToL2Messages) {
183
212
  const l1ToL2Messages = padArrayEnd(unpaddedL1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
184
213
  const hasher = (left, right)=>Promise.resolve(sha256Trunc(Buffer.concat([
@@ -199,32 +228,6 @@ export async function getEmptyBlockBlobsHash() {
199
228
  const blobHash = (await Blob.getBlobsPerBlock([])).map((b)=>b.getEthVersionedBlobHash());
200
229
  return sha256ToField(blobHash);
201
230
  }
202
- // Validate that the roots of all local trees match the output of the root circuit simulation
203
- // TODO: does this get called?
204
- export async function validateBlockRootOutput(blockRootOutput, blockHeader, db) {
205
- await Promise.all([
206
- validateState(blockHeader.state, db),
207
- validateSimulatedTree(await getTreeSnapshot(MerkleTreeId.ARCHIVE, db), blockRootOutput.newArchive, 'Archive')
208
- ]);
209
- }
210
- export const validateState = runInSpan('BlockBuilderHelpers', 'validateState', async (_span, state, db)=>{
211
- const promises = [
212
- MerkleTreeId.NOTE_HASH_TREE,
213
- MerkleTreeId.NULLIFIER_TREE,
214
- MerkleTreeId.PUBLIC_DATA_TREE
215
- ].map(async (id)=>{
216
- return {
217
- key: id,
218
- value: await getTreeSnapshot(id, db)
219
- };
220
- });
221
- const snapshots = new Map((await Promise.all(promises)).map((obj)=>[
222
- obj.key,
223
- obj.value
224
- ]));
225
- validatePartialState(state.partial, snapshots);
226
- validateSimulatedTree(await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db), state.l1ToL2MessageTree, 'L1ToL2MessageTree');
227
- });
228
231
  export async function getLastSiblingPath(treeId, db) {
229
232
  const { size } = await db.getTreeInfo(treeId);
230
233
  const path = await db.getSiblingPath(treeId, size - 1n);
@@ -300,7 +303,7 @@ function validateSimulatedTree(localTree, simulatedTree, name, label) {
300
303
  }
301
304
  }
302
305
  export function validateTx(tx) {
303
- const txHeader = tx.data.constants.historicalHeader;
306
+ const txHeader = tx.data.constants.anchorBlockHeader;
304
307
  if (txHeader.state.l1ToL2MessageTree.isEmpty()) {
305
308
  throw new Error(`Empty L1 to L2 messages tree in tx: ${toFriendlyJSON(tx)}`);
306
309
  }
@@ -1,17 +1,20 @@
1
- import { BatchedBlobAccumulator, SpongeBlob } from '@aztec/blob-lib';
1
+ import type { SpongeBlob } from '@aztec/blob-lib';
2
2
  import { type ARCHIVE_HEIGHT, type L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH } from '@aztec/constants';
3
3
  import { Fr } from '@aztec/foundation/fields';
4
4
  import type { Tuple } from '@aztec/foundation/serialize';
5
5
  import { type TreeNodeLocation } from '@aztec/foundation/trees';
6
- import type { EthAddress, L2Block } from '@aztec/stdlib/block';
7
6
  import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
8
7
  import { type ParityPublicInputs, RootParityInputs } from '@aztec/stdlib/parity';
9
- import { type BaseOrMergeRollupPublicInputs, type BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, EmptyBlockRootRollupInputs, MergeRollupInputs, PaddingBlockRootRollupInputs, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
10
- import { AppendOnlyTreeSnapshot, type MerkleTreeId } from '@aztec/stdlib/trees';
11
- import { type BlockHeader, type GlobalVariables } from '@aztec/stdlib/tx';
12
- import type { EpochProvingState } from './epoch-proving-state.js';
8
+ import { type BaseOrMergeRollupPublicInputs, BlockRollupPublicInputs, BlockRootEmptyTxFirstRollupPrivateInputs, BlockRootRollupPrivateInputs, BlockRootSingleTxRollupPrivateInputs, CheckpointConstantData, MergeRollupInputs } from '@aztec/stdlib/rollup';
9
+ import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
10
+ import { type BlockHeader, GlobalVariables } from '@aztec/stdlib/tx';
11
+ import type { UInt64 } from '@aztec/stdlib/types';
12
+ import type { CheckpointProvingState } from './checkpoint-proving-state.js';
13
13
  import type { TxProvingState } from './tx-proving-state.js';
14
- export type TreeSnapshots = Map<MerkleTreeId, AppendOnlyTreeSnapshot>;
14
+ export type ProofState<T, PROOF_LENGTH extends number> = {
15
+ provingOutput?: PublicInputsAndRecursiveProof<T, PROOF_LENGTH>;
16
+ isProving?: boolean;
17
+ };
15
18
  /**
16
19
  * The current state of the proving schedule for a given block. Managed by ProvingState.
17
20
  * Contains the raw inputs and intermediate state to generate every constituent proof in the tree.
@@ -19,59 +22,62 @@ export type TreeSnapshots = Map<MerkleTreeId, AppendOnlyTreeSnapshot>;
19
22
  export declare class BlockProvingState {
20
23
  #private;
21
24
  readonly index: number;
22
- readonly globalVariables: GlobalVariables;
23
- readonly newL1ToL2Messages: Fr[];
24
- readonly l1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot;
25
- private readonly l1ToL2MessageSubtreeSiblingPath;
26
- readonly l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot;
27
- private readonly lastArchiveSnapshot;
25
+ readonly blockNumber: number;
26
+ readonly totalNumTxs: number;
27
+ private readonly constants;
28
+ private readonly timestamp;
29
+ readonly lastArchiveTreeSnapshot: AppendOnlyTreeSnapshot;
28
30
  private readonly lastArchiveSiblingPath;
29
- private readonly newArchiveSiblingPath;
30
- private readonly previousBlockHeader;
31
- private readonly proverId;
32
- private readonly parentEpoch;
33
- private baseOrMergeProvingOutputs;
34
- private baseParityProvingOutputs;
35
- private rootParityProvingOutput;
36
- private blockRootProvingOutput;
37
- blockRootRollupStarted: boolean;
38
- block: L2Block | undefined;
39
- spongeBlobState: SpongeBlob | undefined;
40
- startBlobAccumulator: BatchedBlobAccumulator | undefined;
41
- endBlobAccumulator: BatchedBlobAccumulator | undefined;
42
- blobsHash: Fr | undefined;
43
- totalNumTxs: number;
31
+ private readonly lastL1ToL2MessageTreeSnapshot;
32
+ private readonly lastL1ToL2MessageSubtreeSiblingPath;
33
+ readonly newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot;
34
+ private readonly headerOfLastBlockInPreviousCheckpoint;
35
+ private readonly startSpongeBlob;
36
+ parentCheckpoint: CheckpointProvingState;
37
+ private baseOrMergeProofs;
38
+ private baseParityProofs;
39
+ private rootParityProof;
40
+ private blockRootProof;
41
+ private builtBlockHeader;
42
+ private endSpongeBlob;
44
43
  private txs;
45
- error: string | undefined;
46
- constructor(index: number, globalVariables: GlobalVariables, newL1ToL2Messages: Fr[], l1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, l1ToL2MessageSubtreeSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>, l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot, lastArchiveSnapshot: AppendOnlyTreeSnapshot, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, newArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, previousBlockHeader: BlockHeader, proverId: EthAddress, parentEpoch: EpochProvingState);
47
- get blockNumber(): number;
48
- startNewBlock(numTxs: number, numBlobFields: number): void;
44
+ private isFirstBlock;
45
+ private error;
46
+ constructor(index: number, blockNumber: number, totalNumTxs: number, constants: CheckpointConstantData, timestamp: UInt64, lastArchiveTreeSnapshot: AppendOnlyTreeSnapshot, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, lastL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, lastL1ToL2MessageSubtreeSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, headerOfLastBlockInPreviousCheckpoint: BlockHeader, startSpongeBlob: SpongeBlob, parentCheckpoint: CheckpointProvingState);
47
+ get epochNumber(): number;
49
48
  addNewTx(tx: TxProvingState): number;
49
+ isAcceptingTxs(): boolean;
50
+ getProcessedTxs(): import("@aztec/stdlib/tx").ProcessedTx[];
51
+ tryStartProvingBase(txIndex: number): boolean;
50
52
  setBaseRollupProof(txIndex: number, provingOutput: PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
53
+ tryStartProvingMerge(location: TreeNodeLocation): boolean;
51
54
  setMergeRollupProof(location: TreeNodeLocation, provingOutput: PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
55
+ tryStartProvingBaseParity(index: number): boolean;
52
56
  setBaseParityProof(index: number, provingOutput: PublicInputsAndRecursiveProof<ParityPublicInputs>): void;
57
+ tryStartProvingRootParity(): boolean;
53
58
  setRootParityProof(provingOutput: PublicInputsAndRecursiveProof<ParityPublicInputs>): void;
54
- setBlockRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
55
- setBlock(block: L2Block): void;
56
- setStartBlobAccumulator(accumulator: BatchedBlobAccumulator): void;
57
- setEndBlobAccumulator(accumulator: BatchedBlobAccumulator): void;
58
- accumulateBlobs(): Promise<void>;
59
- get allTxs(): TxProvingState[];
60
- /** Returns the block number as an epoch number. Used for prioritizing proof requests. */
61
- get epochNumber(): number;
59
+ tryStartProvingBlockRoot(): boolean;
60
+ setBlockRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
61
+ getBlockRootRollupOutput(): BlockRollupPublicInputs | undefined;
62
+ setBuiltBlockHeader(blockHeader: BlockHeader): void;
63
+ getBuiltBlockHeader(): BlockHeader | undefined;
64
+ getGlobalVariables(): GlobalVariables;
65
+ getStartSpongeBlob(): SpongeBlob;
66
+ setEndSpongeBlob(endSpongeBlob: SpongeBlob): void;
67
+ getEndSpongeBlob(): SpongeBlob | undefined;
68
+ getBlockBlobFields(): Fr[];
62
69
  getParentLocation(location: TreeNodeLocation): TreeNodeLocation;
63
70
  getMergeRollupInputs(mergeLocation: TreeNodeLocation): MergeRollupInputs;
64
- getBlockRootRollupTypeAndInputs(): Promise<{
71
+ getBlockRootRollupTypeAndInputs(): {
65
72
  rollupType: string;
66
- inputs: EmptyBlockRootRollupInputs;
73
+ inputs: BlockRootEmptyTxFirstRollupPrivateInputs;
67
74
  } | {
68
75
  rollupType: string;
69
- inputs: SingleTxBlockRootRollupInputs;
76
+ inputs: BlockRootSingleTxRollupPrivateInputs;
70
77
  } | {
71
78
  rollupType: string;
72
- inputs: BlockRootRollupInputs;
73
- }>;
74
- getPaddingBlockRootInputs(): PaddingBlockRootRollupInputs;
79
+ inputs: BlockRootRollupPrivateInputs;
80
+ };
75
81
  getRootParityInputs(): RootParityInputs;
76
82
  getTxProvingState(txIndex: number): TxProvingState;
77
83
  buildHeaderFromProvingOutputs(): Promise<BlockHeader>;
@@ -80,6 +86,7 @@ export declare class BlockProvingState {
80
86
  isReadyForRootParity(): boolean;
81
87
  isComplete(): boolean;
82
88
  verifyState(): boolean;
89
+ getError(): string | undefined;
83
90
  reject(reason: string): void;
84
91
  }
85
92
  //# sourceMappingURL=block-proving-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-proving-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/block-proving-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,wCAAwC,EAE7C,KAAK,yCAAyC,EAG/C,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,KAAK,gBAAgB,EAAuB,MAAM,yBAAyB,CAAC;AAGrF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,KAAK,kBAAkB,EAAmB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EACL,KAAK,6BAA6B,EAClC,uBAAuB,EACvB,wCAAwC,EAExC,4BAA4B,EAE5B,oCAAoC,EACpC,sBAAsB,EACtB,iBAAiB,EAGlB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,KAAK,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,YAAY,SAAS,MAAM,IAAI;IACvD,aAAa,CAAC,EAAE,6BAA6B,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,qBAAa,iBAAiB;;aAmBV,KAAK,EAAE,MAAM;aACb,WAAW,EAAE,MAAM;aACnB,WAAW,EAAE,MAAM;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;aACV,uBAAuB,EAAE,sBAAsB;IAC/D,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,6BAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAC,mCAAmC;aACpC,4BAA4B,EAAE,sBAAsB;IACpE,OAAO,CAAC,QAAQ,CAAC,qCAAqC;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe;IACzB,gBAAgB,EAAE,sBAAsB;IA9BjD,OAAO,CAAC,iBAAiB,CAEM;IAC/B,OAAO,CAAC,gBAAgB,CAGC;IACzB,OAAO,CAAC,eAAe,CAAmF;IAC1G,OAAO,CAAC,cAAc,CAER;IACd,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,KAAK,CAAqB;gBAGhB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAClB,SAAS,EAAE,sBAAsB,EACjC,SAAS,EAAE,MAAM,EAClB,uBAAuB,EAAE,sBAAsB,EAC9C,sBAAsB,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,cAAc,CAAC,EACxD,6BAA6B,EAAE,sBAAsB,EACrD,mCAAmC,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,wCAAwC,CAAC,EAChG,4BAA4B,EAAE,sBAAsB,EACnD,qCAAqC,EAAE,WAAW,EAClD,eAAe,EAAE,UAAU,EACrC,gBAAgB,EAAE,sBAAsB;IAUjD,IAAW,WAAW,IAAI,MAAM,CAE/B;IAGM,QAAQ,CAAC,EAAE,EAAE,cAAc;IAS3B,cAAc;IAId,eAAe;IAIf,mBAAmB,CAAC,OAAO,EAAE,MAAM;IASnC,kBAAkB,CACvB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,6BAA6B,CAC1C,6BAA6B,EAC7B,OAAO,yCAAyC,CACjD,GACA,gBAAgB;IAIZ,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB;IAS/C,mBAAmB,CACxB,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,6BAA6B,CAC1C,6BAA6B,EAC7B,OAAO,yCAAyC,CACjD;IAKI,yBAAyB,CAAC,KAAK,EAAE,MAAM;IAUvC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,6BAA6B,CAAC,kBAAkB,CAAC;IASlG,yBAAyB;IASzB,kBAAkB,CAAC,aAAa,EAAE,6BAA6B,CAAC,kBAAkB,CAAC;IAInF,wBAAwB;IASxB,uBAAuB,CAC5B,aAAa,EAAE,6BAA6B,CAC1C,uBAAuB,EACvB,OAAO,yCAAyC,CACjD,GACA,gBAAgB;IAKZ,wBAAwB;IAIxB,mBAAmB,CAAC,WAAW,EAAE,WAAW;IAI5C,mBAAmB;IAInB,kBAAkB;IAkBlB,kBAAkB;IAIlB,gBAAgB,CAAC,aAAa,EAAE,UAAU;IAI1C,gBAAgB;IAIhB,kBAAkB;IAIlB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB;IAI5C,oBAAoB,CAAC,aAAa,EAAE,gBAAgB;IASpD,+BAA+B;;;;;;;;;;IAuE/B,mBAAmB;IAanB,iBAAiB,CAAC,OAAO,EAAE,MAAM;IAI3B,6BAA6B;IAQnC,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB;IAKhD,yBAAyB;IAMzB,oBAAoB;IAIpB,UAAU;IAIV,WAAW;IAIX,QAAQ;IAIR,MAAM,CAAC,MAAM,EAAE,MAAM;CAmC7B"}