@aztec/prover-client 0.0.0-test.1 → 0.0.1-commit.017a351
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.
- package/dest/config.d.ts +8 -8
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +26 -2
- package/dest/index.d.ts +1 -1
- package/dest/light/index.d.ts +2 -0
- package/dest/light/index.d.ts.map +1 -0
- package/dest/light/index.js +1 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts +52 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
- package/dest/light/lightweight_checkpoint_builder.js +231 -0
- package/dest/mocks/fixtures.d.ts +8 -8
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +36 -17
- package/dest/mocks/test_context.d.ts +45 -32
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +162 -90
- package/dest/orchestrator/block-building-helpers.d.ts +36 -29
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +170 -189
- package/dest/orchestrator/block-proving-state.d.ts +73 -48
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +289 -177
- package/dest/orchestrator/checkpoint-proving-state.d.ts +83 -0
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/checkpoint-proving-state.js +252 -0
- package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts +107 -0
- package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts.map +1 -0
- package/dest/orchestrator/checkpoint-sub-tree-orchestrator.js +151 -0
- package/dest/orchestrator/epoch-proving-context.d.ts +51 -0
- package/dest/orchestrator/epoch-proving-context.d.ts.map +1 -0
- package/dest/orchestrator/epoch-proving-context.js +81 -0
- package/dest/orchestrator/epoch-proving-state.d.ts +43 -28
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +179 -73
- package/dest/orchestrator/index.d.ts +4 -1
- package/dest/orchestrator/index.d.ts.map +1 -1
- package/dest/orchestrator/index.js +3 -0
- package/dest/orchestrator/orchestrator.d.ts +59 -51
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +808 -385
- package/dest/orchestrator/orchestrator_metrics.d.ts +1 -1
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +2 -6
- package/dest/orchestrator/proving-scheduler.d.ts +72 -0
- package/dest/orchestrator/proving-scheduler.d.ts.map +1 -0
- package/dest/orchestrator/proving-scheduler.js +117 -0
- package/dest/orchestrator/top-tree-orchestrator.d.ts +83 -0
- package/dest/orchestrator/top-tree-orchestrator.d.ts.map +1 -0
- package/dest/orchestrator/top-tree-orchestrator.js +182 -0
- package/dest/orchestrator/top-tree-proving-scheduler.d.ts +62 -0
- package/dest/orchestrator/top-tree-proving-scheduler.d.ts.map +1 -0
- package/dest/orchestrator/top-tree-proving-scheduler.js +73 -0
- package/dest/orchestrator/top-tree-proving-state.d.ts +61 -0
- package/dest/orchestrator/top-tree-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/top-tree-proving-state.js +185 -0
- package/dest/orchestrator/tx-proving-state.d.ts +15 -12
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +27 -44
- package/dest/prover-client/factory.d.ts +3 -3
- package/dest/prover-client/factory.d.ts.map +1 -1
- package/dest/prover-client/index.d.ts +1 -1
- package/dest/prover-client/prover-client.d.ts +68 -9
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +68 -14
- package/dest/prover-client/server-epoch-prover.d.ts +16 -12
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +11 -11
- package/dest/proving_broker/broker_prover_facade.d.ts +28 -19
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +74 -61
- package/dest/proving_broker/config.d.ts +18 -61
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +43 -9
- package/dest/proving_broker/factory.d.ts +2 -2
- package/dest/proving_broker/factory.d.ts.map +1 -1
- package/dest/proving_broker/factory.js +5 -1
- package/dest/proving_broker/fixtures.d.ts +3 -2
- package/dest/proving_broker/fixtures.d.ts.map +1 -1
- package/dest/proving_broker/fixtures.js +3 -2
- package/dest/proving_broker/index.d.ts +2 -1
- package/dest/proving_broker/index.d.ts.map +1 -1
- package/dest/proving_broker/index.js +1 -0
- package/dest/proving_broker/proof_store/factory.d.ts +2 -5
- package/dest/proving_broker/proof_store/factory.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/factory.js +7 -30
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
- package/dest/proving_broker/proof_store/index.d.ts +2 -1
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.js +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
- package/dest/proving_broker/proving_agent.d.ts +8 -12
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +86 -65
- package/dest/proving_broker/proving_broker.d.ts +18 -6
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +108 -44
- package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/memory.js +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +5 -3
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +401 -11
- package/dest/proving_broker/proving_broker_database.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +3 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.js +22 -35
- package/dest/proving_broker/proving_job_controller.d.ts +11 -10
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +92 -62
- package/dest/proving_broker/rpc.d.ts +9 -7
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +88 -27
- package/dest/test/mock_proof_store.d.ts +9 -0
- package/dest/test/mock_proof_store.d.ts.map +1 -0
- package/dest/test/mock_proof_store.js +10 -0
- package/dest/test/mock_prover.d.ts +23 -17
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +38 -20
- package/package.json +34 -33
- package/src/config.ts +41 -9
- package/src/light/index.ts +1 -0
- package/src/light/lightweight_checkpoint_builder.ts +320 -0
- package/src/mocks/fixtures.ts +46 -40
- package/src/mocks/test_context.ts +231 -120
- package/src/orchestrator/block-building-helpers.ts +258 -334
- package/src/orchestrator/block-proving-state.ts +334 -231
- package/src/orchestrator/checkpoint-proving-state.ts +362 -0
- package/src/orchestrator/checkpoint-sub-tree-orchestrator.ts +271 -0
- package/src/orchestrator/epoch-proving-context.ts +101 -0
- package/src/orchestrator/epoch-proving-state.ts +239 -111
- package/src/orchestrator/index.ts +8 -0
- package/src/orchestrator/orchestrator.ts +591 -451
- package/src/orchestrator/orchestrator_metrics.ts +2 -6
- package/src/orchestrator/proving-scheduler.ts +156 -0
- package/src/orchestrator/top-tree-orchestrator.ts +314 -0
- package/src/orchestrator/top-tree-proving-scheduler.ts +154 -0
- package/src/orchestrator/top-tree-proving-state.ts +220 -0
- package/src/orchestrator/tx-proving-state.ts +48 -66
- package/src/prover-client/factory.ts +6 -2
- package/src/prover-client/prover-client.ts +173 -38
- package/src/prover-client/server-epoch-prover.ts +40 -22
- package/src/proving_broker/broker_prover_facade.ts +227 -149
- package/src/proving_broker/config.ts +49 -8
- package/src/proving_broker/factory.ts +2 -1
- package/src/proving_broker/fixtures.ts +8 -3
- package/src/proving_broker/index.ts +1 -0
- package/src/proving_broker/proof_store/factory.ts +10 -32
- package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
- package/src/proving_broker/proof_store/index.ts +1 -0
- package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
- package/src/proving_broker/proving_agent.ts +95 -66
- package/src/proving_broker/proving_broker.ts +121 -49
- package/src/proving_broker/proving_broker_database/memory.ts +3 -2
- package/src/proving_broker/proving_broker_database/persisted.ts +31 -15
- package/src/proving_broker/proving_broker_database.ts +2 -1
- package/src/proving_broker/proving_broker_instrumentation.ts +23 -35
- package/src/proving_broker/proving_job_controller.ts +100 -83
- package/src/proving_broker/rpc.ts +46 -25
- package/src/test/mock_proof_store.ts +14 -0
- package/src/test/mock_prover.ts +156 -64
- package/dest/bin/get-proof-inputs.d.ts +0 -2
- package/dest/bin/get-proof-inputs.d.ts.map +0 -1
- package/dest/bin/get-proof-inputs.js +0 -51
- package/dest/block_builder/index.d.ts +0 -6
- package/dest/block_builder/index.d.ts.map +0 -1
- package/dest/block_builder/index.js +0 -1
- package/dest/block_builder/light.d.ts +0 -33
- package/dest/block_builder/light.d.ts.map +0 -1
- package/dest/block_builder/light.js +0 -82
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +0 -14
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +0 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +0 -51
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
- package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
- package/src/bin/get-proof-inputs.ts +0 -59
- package/src/block_builder/index.ts +0 -6
- package/src/block_builder/light.ts +0 -101
- package/src/proving_broker/proof_store/gcs_proof_store.ts +0 -72
- package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { BatchedBlobAccumulator, type FinalBlobBatchingChallenges } from '@aztec/blob-lib';
|
|
2
|
+
import { type ARCHIVE_HEIGHT, type L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH, type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, OUT_HASH_TREE_HEIGHT } from '@aztec/constants';
|
|
3
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
|
+
import type { Tuple } from '@aztec/foundation/serialize';
|
|
6
|
+
import { type TreeNodeLocation } from '@aztec/foundation/trees';
|
|
7
|
+
import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
|
|
8
|
+
import { ParityBasePrivateInputs } from '@aztec/stdlib/parity';
|
|
9
|
+
import { BlockMergeRollupPrivateInputs, BlockRollupPublicInputs, CheckpointConstantData, CheckpointRollupPublicInputs, CheckpointRootRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs } from '@aztec/stdlib/rollup';
|
|
10
|
+
import type { CircuitName } from '@aztec/stdlib/stats';
|
|
11
|
+
import type { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
12
|
+
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
13
|
+
import type { UInt64 } from '@aztec/stdlib/types';
|
|
14
|
+
import { BlockProvingState } from './block-proving-state.js';
|
|
15
|
+
import type { EpochProvingState } from './epoch-proving-state.js';
|
|
16
|
+
type OutHashHint = {
|
|
17
|
+
treeSnapshot: AppendOnlyTreeSnapshot;
|
|
18
|
+
siblingPath: Tuple<Fr, typeof OUT_HASH_TREE_HEIGHT>;
|
|
19
|
+
};
|
|
20
|
+
export declare class CheckpointProvingState {
|
|
21
|
+
#private;
|
|
22
|
+
readonly index: number;
|
|
23
|
+
readonly constants: CheckpointConstantData;
|
|
24
|
+
readonly totalNumBlocks: number;
|
|
25
|
+
private readonly finalBlobBatchingChallenges;
|
|
26
|
+
private readonly headerOfLastBlockInPreviousCheckpoint;
|
|
27
|
+
private readonly lastArchiveSiblingPath;
|
|
28
|
+
private readonly l1ToL2Messages;
|
|
29
|
+
private readonly lastL1ToL2MessageTreeSnapshot;
|
|
30
|
+
private readonly lastL1ToL2MessageSubtreeRootSiblingPath;
|
|
31
|
+
private readonly newL1ToL2MessageTreeSnapshot;
|
|
32
|
+
private readonly newL1ToL2MessageSubtreeRootSiblingPath;
|
|
33
|
+
parentEpoch: EpochProvingState;
|
|
34
|
+
private onBlobAccumulatorSet;
|
|
35
|
+
private blockProofs;
|
|
36
|
+
private checkpointRootProof;
|
|
37
|
+
private blocks;
|
|
38
|
+
private previousOutHashHint;
|
|
39
|
+
private outHash;
|
|
40
|
+
private newOutHashHint;
|
|
41
|
+
private startBlobAccumulator;
|
|
42
|
+
private endBlobAccumulator;
|
|
43
|
+
private blobFields;
|
|
44
|
+
private error;
|
|
45
|
+
readonly firstBlockNumber: BlockNumber;
|
|
46
|
+
constructor(index: number, constants: CheckpointConstantData, totalNumBlocks: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges, headerOfLastBlockInPreviousCheckpoint: BlockHeader, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, l1ToL2Messages: Fr[], lastL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, parentEpoch: EpochProvingState, onBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => Promise<void>);
|
|
47
|
+
get epochNumber(): number;
|
|
48
|
+
startNewBlock(blockNumber: BlockNumber, timestamp: UInt64, totalNumTxs: number, lastArchiveTreeSnapshot: AppendOnlyTreeSnapshot, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>): BlockProvingState;
|
|
49
|
+
isAcceptingBlocks(): boolean;
|
|
50
|
+
setBlockRootRollupProof(blockIndex: number, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
|
|
51
|
+
tryStartProvingBlockMerge(location: TreeNodeLocation): boolean;
|
|
52
|
+
setBlockMergeRollupProof(location: TreeNodeLocation, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
|
|
53
|
+
tryStartProvingCheckpointRoot(): boolean;
|
|
54
|
+
setCheckpointRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
|
|
55
|
+
getBaseParityInputs(baseParityIndex: number): ParityBasePrivateInputs;
|
|
56
|
+
setOutHashHint(hint: OutHashHint): void;
|
|
57
|
+
getOutHashHint(): OutHashHint | undefined;
|
|
58
|
+
accumulateBlockOutHashes(): Fr | undefined;
|
|
59
|
+
setOutHashHintForNextCheckpoint(hint: OutHashHint): void;
|
|
60
|
+
getOutHashHintForNextCheckpoint(): OutHashHint | undefined;
|
|
61
|
+
accumulateBlobs(startBlobAccumulator: BatchedBlobAccumulator): Promise<BatchedBlobAccumulator | undefined>;
|
|
62
|
+
getEndBlobAccumulator(): BatchedBlobAccumulator | undefined;
|
|
63
|
+
getParentLocation(location: TreeNodeLocation): TreeNodeLocation;
|
|
64
|
+
getBlockMergeRollupInputs(mergeLocation: TreeNodeLocation): BlockMergeRollupPrivateInputs;
|
|
65
|
+
getCheckpointRootRollupType(): CircuitName;
|
|
66
|
+
getCheckpointRootRollupInputs(): Promise<CheckpointRootRollupPrivateInputs | CheckpointRootSingleBlockRollupPrivateInputs>;
|
|
67
|
+
getBlockProvingStateByBlockNumber(blockNumber: BlockNumber): BlockProvingState | undefined;
|
|
68
|
+
isReadyForBlockMerge(location: TreeNodeLocation): boolean;
|
|
69
|
+
isReadyForCheckpointRoot(): boolean;
|
|
70
|
+
verifyState(): boolean;
|
|
71
|
+
getError(): string | undefined;
|
|
72
|
+
cancel(): void;
|
|
73
|
+
reject(reason: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Returns the block-level proof outputs that feed into the checkpoint root rollup.
|
|
76
|
+
* Used by `CheckpointSubTreeOrchestrator` to surface its sub-tree result.
|
|
77
|
+
*/
|
|
78
|
+
getSubTreeOutputProofs(): (PublicInputsAndRecursiveProof<BlockRollupPublicInputs, 480> | undefined)[];
|
|
79
|
+
/** Sibling path of the archive tree captured before any block in this checkpoint landed. */
|
|
80
|
+
getLastArchiveSiblingPath(): [Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr, Fr];
|
|
81
|
+
}
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludC1wcm92aW5nLXN0YXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JjaGVzdHJhdG9yL2NoZWNrcG9pbnQtcHJvdmluZy1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLEtBQUssMkJBQTJCLEVBR2pDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLEtBQUssY0FBYyxFQUduQixLQUFLLDZDQUE2QyxFQUNsRCxLQUFLLHlDQUF5QyxFQUU5QyxvQkFBb0IsRUFDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUF1QixNQUFNLHlCQUF5QixDQUFDO0FBQ3JGLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFckYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUNMLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUU1QixpQ0FBaUMsRUFDakMsNENBQTRDLEVBQzdDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/checkpoint-proving-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { SpongeBlob, encodeCheckpointBlobDataFromBlocks } from '@aztec/blob-lib';
|
|
2
|
+
import { BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB, NUM_MSGS_PER_BASE_PARITY } from '@aztec/constants';
|
|
3
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
5
|
+
import { BLS12Point } from '@aztec/foundation/curves/bls12';
|
|
6
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
7
|
+
import { UnbalancedTreeStore } from '@aztec/foundation/trees';
|
|
8
|
+
import { computeCheckpointOutHash } from '@aztec/stdlib/messaging';
|
|
9
|
+
import { ParityBasePrivateInputs } from '@aztec/stdlib/parity';
|
|
10
|
+
import { BlockMergeRollupPrivateInputs, CheckpointRootRollupHints, CheckpointRootRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs } from '@aztec/stdlib/rollup';
|
|
11
|
+
import { accumulateBlobs, buildBlobHints, toProofData } from './block-building-helpers.js';
|
|
12
|
+
import { BlockProvingState } from './block-proving-state.js';
|
|
13
|
+
export class CheckpointProvingState {
|
|
14
|
+
index;
|
|
15
|
+
constants;
|
|
16
|
+
totalNumBlocks;
|
|
17
|
+
finalBlobBatchingChallenges;
|
|
18
|
+
headerOfLastBlockInPreviousCheckpoint;
|
|
19
|
+
lastArchiveSiblingPath;
|
|
20
|
+
l1ToL2Messages;
|
|
21
|
+
lastL1ToL2MessageTreeSnapshot;
|
|
22
|
+
lastL1ToL2MessageSubtreeRootSiblingPath;
|
|
23
|
+
newL1ToL2MessageTreeSnapshot;
|
|
24
|
+
newL1ToL2MessageSubtreeRootSiblingPath;
|
|
25
|
+
parentEpoch;
|
|
26
|
+
onBlobAccumulatorSet;
|
|
27
|
+
blockProofs;
|
|
28
|
+
checkpointRootProof;
|
|
29
|
+
blocks;
|
|
30
|
+
previousOutHashHint;
|
|
31
|
+
outHash;
|
|
32
|
+
// The snapshot and sibling path after the checkpoint's out hash is inserted.
|
|
33
|
+
// Stored here to be retrieved for the next checkpoint when it's added.
|
|
34
|
+
newOutHashHint;
|
|
35
|
+
startBlobAccumulator;
|
|
36
|
+
endBlobAccumulator;
|
|
37
|
+
blobFields;
|
|
38
|
+
error;
|
|
39
|
+
firstBlockNumber;
|
|
40
|
+
constructor(index, constants, totalNumBlocks, finalBlobBatchingChallenges, headerOfLastBlockInPreviousCheckpoint, lastArchiveSiblingPath, l1ToL2Messages, // The snapshot and sibling path before the new l1 to l2 message subtree is inserted.
|
|
41
|
+
lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, // The snapshot and sibling path after the new l1 to l2 message subtree is inserted.
|
|
42
|
+
newL1ToL2MessageTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath, parentEpoch, onBlobAccumulatorSet){
|
|
43
|
+
this.index = index;
|
|
44
|
+
this.constants = constants;
|
|
45
|
+
this.totalNumBlocks = totalNumBlocks;
|
|
46
|
+
this.finalBlobBatchingChallenges = finalBlobBatchingChallenges;
|
|
47
|
+
this.headerOfLastBlockInPreviousCheckpoint = headerOfLastBlockInPreviousCheckpoint;
|
|
48
|
+
this.lastArchiveSiblingPath = lastArchiveSiblingPath;
|
|
49
|
+
this.l1ToL2Messages = l1ToL2Messages;
|
|
50
|
+
this.lastL1ToL2MessageTreeSnapshot = lastL1ToL2MessageTreeSnapshot;
|
|
51
|
+
this.lastL1ToL2MessageSubtreeRootSiblingPath = lastL1ToL2MessageSubtreeRootSiblingPath;
|
|
52
|
+
this.newL1ToL2MessageTreeSnapshot = newL1ToL2MessageTreeSnapshot;
|
|
53
|
+
this.newL1ToL2MessageSubtreeRootSiblingPath = newL1ToL2MessageSubtreeRootSiblingPath;
|
|
54
|
+
this.parentEpoch = parentEpoch;
|
|
55
|
+
this.onBlobAccumulatorSet = onBlobAccumulatorSet;
|
|
56
|
+
this.blocks = [];
|
|
57
|
+
this.blockProofs = new UnbalancedTreeStore(totalNumBlocks);
|
|
58
|
+
this.firstBlockNumber = BlockNumber(headerOfLastBlockInPreviousCheckpoint.globalVariables.blockNumber + 1);
|
|
59
|
+
}
|
|
60
|
+
get epochNumber() {
|
|
61
|
+
return this.parentEpoch.epochNumber;
|
|
62
|
+
}
|
|
63
|
+
startNewBlock(blockNumber, timestamp, totalNumTxs, lastArchiveTreeSnapshot, lastArchiveSiblingPath) {
|
|
64
|
+
const index = Number(blockNumber) - Number(this.firstBlockNumber);
|
|
65
|
+
if (index >= this.totalNumBlocks) {
|
|
66
|
+
throw new Error(`Unable to start a new block at index ${index}. Expected at most ${this.totalNumBlocks} blocks.`);
|
|
67
|
+
}
|
|
68
|
+
// If this is the first block, we use the snapshot and sibling path before the new l1 to l2 messages are inserted.
|
|
69
|
+
// Otherwise, we use the snapshot and sibling path after the new l1 to l2 messages are inserted, which will always
|
|
70
|
+
// happen in the first block.
|
|
71
|
+
const lastL1ToL2MessageTreeSnapshot = index === 0 ? this.lastL1ToL2MessageTreeSnapshot : this.newL1ToL2MessageTreeSnapshot;
|
|
72
|
+
const lastL1ToL2MessageSubtreeRootSiblingPath = index === 0 ? this.lastL1ToL2MessageSubtreeRootSiblingPath : this.newL1ToL2MessageSubtreeRootSiblingPath;
|
|
73
|
+
const startSpongeBlob = index === 0 ? SpongeBlob.init() : this.blocks[index - 1]?.getEndSpongeBlob();
|
|
74
|
+
if (!startSpongeBlob) {
|
|
75
|
+
throw new Error('Cannot start a new block before the trees have progressed from the tx effects in the previous block.');
|
|
76
|
+
}
|
|
77
|
+
const block = new BlockProvingState(index, blockNumber, totalNumTxs, this.constants, timestamp, lastArchiveTreeSnapshot, lastArchiveSiblingPath, lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, this.newL1ToL2MessageTreeSnapshot, this.headerOfLastBlockInPreviousCheckpoint, startSpongeBlob, this);
|
|
78
|
+
this.blocks[index] = block;
|
|
79
|
+
return block;
|
|
80
|
+
}
|
|
81
|
+
// Returns true if we are still able to accept blocks, false otherwise.
|
|
82
|
+
isAcceptingBlocks() {
|
|
83
|
+
return this.blocks.filter((b)=>!!b).length < this.totalNumBlocks;
|
|
84
|
+
}
|
|
85
|
+
setBlockRootRollupProof(blockIndex, provingOutput) {
|
|
86
|
+
return this.blockProofs.setLeaf(blockIndex, {
|
|
87
|
+
provingOutput
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
tryStartProvingBlockMerge(location) {
|
|
91
|
+
if (this.blockProofs.getNode(location)?.isProving) {
|
|
92
|
+
return false;
|
|
93
|
+
} else {
|
|
94
|
+
this.blockProofs.setNode(location, {
|
|
95
|
+
isProving: true
|
|
96
|
+
});
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
setBlockMergeRollupProof(location, provingOutput) {
|
|
101
|
+
this.blockProofs.setNode(location, {
|
|
102
|
+
provingOutput
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
tryStartProvingCheckpointRoot() {
|
|
106
|
+
if (this.checkpointRootProof?.isProving) {
|
|
107
|
+
return false;
|
|
108
|
+
} else {
|
|
109
|
+
this.checkpointRootProof = {
|
|
110
|
+
isProving: true
|
|
111
|
+
};
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
setCheckpointRootRollupProof(provingOutput) {
|
|
116
|
+
this.checkpointRootProof = {
|
|
117
|
+
provingOutput
|
|
118
|
+
};
|
|
119
|
+
return this.parentEpoch.setCheckpointRootRollupProof(this.index, provingOutput);
|
|
120
|
+
}
|
|
121
|
+
getBaseParityInputs(baseParityIndex) {
|
|
122
|
+
const messages = padArrayEnd(this.l1ToL2Messages.slice(baseParityIndex * NUM_MSGS_PER_BASE_PARITY, (baseParityIndex + 1) * NUM_MSGS_PER_BASE_PARITY), Fr.ZERO, NUM_MSGS_PER_BASE_PARITY);
|
|
123
|
+
return new ParityBasePrivateInputs(messages, this.constants.vkTreeRoot, this.constants.proverId);
|
|
124
|
+
}
|
|
125
|
+
setOutHashHint(hint) {
|
|
126
|
+
this.previousOutHashHint = hint;
|
|
127
|
+
}
|
|
128
|
+
getOutHashHint() {
|
|
129
|
+
return this.previousOutHashHint;
|
|
130
|
+
}
|
|
131
|
+
accumulateBlockOutHashes() {
|
|
132
|
+
if (this.isAcceptingBlocks() || this.blocks.some((b)=>!b?.hasEndState())) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (!this.outHash) {
|
|
136
|
+
const messagesPerBlock = this.blocks.map((b)=>b.getTxEffects().map((tx)=>tx.l2ToL1Msgs));
|
|
137
|
+
this.outHash = computeCheckpointOutHash(messagesPerBlock);
|
|
138
|
+
}
|
|
139
|
+
return this.outHash;
|
|
140
|
+
}
|
|
141
|
+
setOutHashHintForNextCheckpoint(hint) {
|
|
142
|
+
this.newOutHashHint = hint;
|
|
143
|
+
}
|
|
144
|
+
getOutHashHintForNextCheckpoint() {
|
|
145
|
+
return this.newOutHashHint;
|
|
146
|
+
}
|
|
147
|
+
async accumulateBlobs(startBlobAccumulator) {
|
|
148
|
+
if (this.isAcceptingBlocks() || this.blocks.some((b)=>!b?.hasEndState())) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
this.blobFields = encodeCheckpointBlobDataFromBlocks(this.blocks.map((b)=>b.getBlockBlobData()));
|
|
152
|
+
this.endBlobAccumulator = await accumulateBlobs(this.blobFields, startBlobAccumulator);
|
|
153
|
+
this.startBlobAccumulator = startBlobAccumulator;
|
|
154
|
+
await this.onBlobAccumulatorSet(this);
|
|
155
|
+
return this.endBlobAccumulator;
|
|
156
|
+
}
|
|
157
|
+
getEndBlobAccumulator() {
|
|
158
|
+
return this.endBlobAccumulator;
|
|
159
|
+
}
|
|
160
|
+
getParentLocation(location) {
|
|
161
|
+
return this.blockProofs.getParentLocation(location);
|
|
162
|
+
}
|
|
163
|
+
getBlockMergeRollupInputs(mergeLocation) {
|
|
164
|
+
const [left, right] = this.blockProofs.getChildren(mergeLocation).map((c)=>c?.provingOutput);
|
|
165
|
+
if (!left || !right) {
|
|
166
|
+
throw new Error('At least one child is not ready for the block merge rollup.');
|
|
167
|
+
}
|
|
168
|
+
return new BlockMergeRollupPrivateInputs([
|
|
169
|
+
toProofData(left),
|
|
170
|
+
toProofData(right)
|
|
171
|
+
]);
|
|
172
|
+
}
|
|
173
|
+
getCheckpointRootRollupType() {
|
|
174
|
+
return this.totalNumBlocks === 1 ? 'rollup-checkpoint-root-single-block' : 'rollup-checkpoint-root';
|
|
175
|
+
}
|
|
176
|
+
async getCheckpointRootRollupInputs() {
|
|
177
|
+
const proofs = this.#getChildProofsForRoot();
|
|
178
|
+
const nonEmptyProofs = proofs.filter((p)=>!!p);
|
|
179
|
+
if (proofs.length !== nonEmptyProofs.length) {
|
|
180
|
+
throw new Error('At least one child is not ready for the checkpoint root rollup.');
|
|
181
|
+
}
|
|
182
|
+
if (!this.previousOutHashHint) {
|
|
183
|
+
throw new Error('Out hash hint is not set.');
|
|
184
|
+
}
|
|
185
|
+
if (!this.startBlobAccumulator) {
|
|
186
|
+
throw new Error('Start blob accumulator is not set.');
|
|
187
|
+
}
|
|
188
|
+
// `blobFields` must've been set if `startBlobAccumulator` is set (in `accumulateBlobs`).
|
|
189
|
+
const blobFields = this.blobFields;
|
|
190
|
+
const { blobCommitments, blobsHash } = await buildBlobHints(blobFields);
|
|
191
|
+
const hints = CheckpointRootRollupHints.from({
|
|
192
|
+
previousBlockHeader: this.headerOfLastBlockInPreviousCheckpoint,
|
|
193
|
+
previousArchiveSiblingPath: this.lastArchiveSiblingPath,
|
|
194
|
+
previousOutHash: this.previousOutHashHint.treeSnapshot,
|
|
195
|
+
newOutHashSiblingPath: this.previousOutHashHint.siblingPath,
|
|
196
|
+
startBlobAccumulator: this.startBlobAccumulator.toBlobAccumulator(),
|
|
197
|
+
finalBlobChallenges: this.finalBlobBatchingChallenges,
|
|
198
|
+
blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_CHECKPOINT),
|
|
199
|
+
blobCommitments: padArrayEnd(blobCommitments, BLS12Point.ZERO, BLOBS_PER_CHECKPOINT),
|
|
200
|
+
blobsHash
|
|
201
|
+
});
|
|
202
|
+
const [left, right] = nonEmptyProofs.map((p)=>toProofData(p));
|
|
203
|
+
return !right ? new CheckpointRootSingleBlockRollupPrivateInputs(left, hints) : new CheckpointRootRollupPrivateInputs([
|
|
204
|
+
left,
|
|
205
|
+
right
|
|
206
|
+
], hints);
|
|
207
|
+
}
|
|
208
|
+
getBlockProvingStateByBlockNumber(blockNumber) {
|
|
209
|
+
const index = Number(blockNumber) - Number(this.firstBlockNumber);
|
|
210
|
+
return this.blocks[index];
|
|
211
|
+
}
|
|
212
|
+
isReadyForBlockMerge(location) {
|
|
213
|
+
return !!this.blockProofs.getSibling(location)?.provingOutput;
|
|
214
|
+
}
|
|
215
|
+
isReadyForCheckpointRoot() {
|
|
216
|
+
const allChildProofsReady = this.#getChildProofsForRoot().every((p)=>!!p);
|
|
217
|
+
return allChildProofsReady && !!this.previousOutHashHint && !!this.startBlobAccumulator;
|
|
218
|
+
}
|
|
219
|
+
verifyState() {
|
|
220
|
+
return this.parentEpoch.verifyState();
|
|
221
|
+
}
|
|
222
|
+
getError() {
|
|
223
|
+
return this.error;
|
|
224
|
+
}
|
|
225
|
+
// Attempts to reject the proving state promise with a reason of 'cancelled'
|
|
226
|
+
cancel() {
|
|
227
|
+
this.reject('Proving cancelled');
|
|
228
|
+
}
|
|
229
|
+
reject(reason) {
|
|
230
|
+
this.error = reason;
|
|
231
|
+
this.parentEpoch.reject(reason);
|
|
232
|
+
}
|
|
233
|
+
#getChildProofsForRoot() {
|
|
234
|
+
const rootLocation = {
|
|
235
|
+
level: 0,
|
|
236
|
+
index: 0
|
|
237
|
+
};
|
|
238
|
+
return this.totalNumBlocks === 1 ? [
|
|
239
|
+
this.blockProofs.getNode(rootLocation)?.provingOutput
|
|
240
|
+
] // If there's only 1 block, its proof will be stored at the root.
|
|
241
|
+
: this.blockProofs.getChildren(rootLocation).map((c)=>c?.provingOutput);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Returns the block-level proof outputs that feed into the checkpoint root rollup.
|
|
245
|
+
* Used by `CheckpointSubTreeOrchestrator` to surface its sub-tree result.
|
|
246
|
+
*/ getSubTreeOutputProofs() {
|
|
247
|
+
return this.#getChildProofsForRoot();
|
|
248
|
+
}
|
|
249
|
+
/** Sibling path of the archive tree captured before any block in this checkpoint landed. */ getLastArchiveSiblingPath() {
|
|
250
|
+
return this.lastArchiveSiblingPath;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { FinalBlobBatchingChallenges } from '@aztec/blob-lib';
|
|
2
|
+
import type { ARCHIVE_HEIGHT, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH } from '@aztec/constants';
|
|
3
|
+
import type { EpochNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
|
+
import type { LoggerBindings } from '@aztec/foundation/log';
|
|
6
|
+
import type { Tuple } from '@aztec/foundation/serialize';
|
|
7
|
+
import type { EthAddress } from '@aztec/stdlib/block';
|
|
8
|
+
import type { ForkMerkleTreeOperations, PublicInputsAndRecursiveProof, ReadonlyWorldStateAccess, ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
|
|
9
|
+
import type { BlockRollupPublicInputs, CheckpointConstantData } from '@aztec/stdlib/rollup';
|
|
10
|
+
import type { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
11
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
12
|
+
import type { BlockProvingState } from './block-proving-state.js';
|
|
13
|
+
import type { CheckpointProvingState } from './checkpoint-proving-state.js';
|
|
14
|
+
import type { EpochProvingContext } from './epoch-proving-context.js';
|
|
15
|
+
import { ProvingOrchestrator } from './orchestrator.js';
|
|
16
|
+
/**
|
|
17
|
+
* Result of proving a single checkpoint's block-level sub-tree.
|
|
18
|
+
*
|
|
19
|
+
* Contains the final block-rollup proof outputs that feed the checkpoint root rollup,
|
|
20
|
+
* plus the archive sibling path captured before any block in the checkpoint landed
|
|
21
|
+
* (the top-tree needs this to assemble the checkpoint root rollup hints).
|
|
22
|
+
*/
|
|
23
|
+
export type SubTreeResult = {
|
|
24
|
+
blockProofOutputs: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>[];
|
|
25
|
+
previousArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Orchestrates block-level proving for a single checkpoint, stopping at the boundary
|
|
29
|
+
* where checkpoint root rollup would otherwise begin.
|
|
30
|
+
*
|
|
31
|
+
* Reuses every circuit driver in `ProvingOrchestrator` (chonk verifier, base, merge,
|
|
32
|
+
* block-root, parity, block-merge) but overrides the gating method that escalates to
|
|
33
|
+
* checkpoint root rollup. Instead of escalating, the orchestrator resolves
|
|
34
|
+
* `getSubTreeResult()` once every block-level proof in the checkpoint's tree is ready.
|
|
35
|
+
*
|
|
36
|
+
* Wiring: a single-checkpoint epoch is created in the constructor (epoch number sourced
|
|
37
|
+
* from the supplied `EpochProvingContext`). The canonical way to obtain a fully-started
|
|
38
|
+
* sub-tree is the `start` static factory, which also drives the single internal
|
|
39
|
+
* `startNewCheckpoint(0, ...)` call. The sub-tree never calls `finalizeEpochStructure`;
|
|
40
|
+
* the override of `checkAndEnqueueCheckpointRootRollup` resolves `getSubTreeResult` once
|
|
41
|
+
* block-level proving completes.
|
|
42
|
+
*/
|
|
43
|
+
export declare class CheckpointSubTreeOrchestrator extends ProvingOrchestrator {
|
|
44
|
+
/**
|
|
45
|
+
* Per-epoch shared chonk-verifier proof cache. Every chonk-verifier proof started
|
|
46
|
+
* by this sub-tree lives on the context and survives the sub-tree's cancellation,
|
|
47
|
+
* so a tx whose original checkpoint is reorged out and re-appears in a replacement
|
|
48
|
+
* checkpoint reuses the cached proof. The context's `epochNumber` is the epoch
|
|
49
|
+
* this sub-tree proves into.
|
|
50
|
+
*/
|
|
51
|
+
private readonly epochContext;
|
|
52
|
+
private readonly subTreeResult;
|
|
53
|
+
constructor(dbProvider: ReadonlyWorldStateAccess & ForkMerkleTreeOperations, prover: ServerCircuitProver, proverId: EthAddress,
|
|
54
|
+
/**
|
|
55
|
+
* Per-epoch shared chonk-verifier proof cache. Every chonk-verifier proof started
|
|
56
|
+
* by this sub-tree lives on the context and survives the sub-tree's cancellation,
|
|
57
|
+
* so a tx whose original checkpoint is reorged out and re-appears in a replacement
|
|
58
|
+
* checkpoint reuses the cached proof. The context's `epochNumber` is the epoch
|
|
59
|
+
* this sub-tree proves into.
|
|
60
|
+
*/
|
|
61
|
+
epochContext: EpochProvingContext, cancelJobsOnStop: boolean | undefined, enqueueConcurrency: number, telemetryClient?: TelemetryClient, bindings?: LoggerBindings);
|
|
62
|
+
/**
|
|
63
|
+
* Constructs and starts a sub-tree for a single checkpoint. The returned sub-tree
|
|
64
|
+
* has had its single internal `startNewCheckpoint(0, ...)` driven; callers proceed
|
|
65
|
+
* directly to per-block `startNewBlock` / `addTxs` / `setBlockCompleted`.
|
|
66
|
+
*
|
|
67
|
+
* If the internal `startNewCheckpoint` rejects, the partially-constructed sub-tree
|
|
68
|
+
* is stopped before the error propagates, so no broker resources leak.
|
|
69
|
+
*/
|
|
70
|
+
static start(dbProvider: ReadonlyWorldStateAccess & ForkMerkleTreeOperations, prover: ServerCircuitProver, proverId: EthAddress, epochContext: EpochProvingContext, cancelJobsOnStop: boolean, enqueueConcurrency: number, checkpointConstants: CheckpointConstantData, l1ToL2Messages: Fr[], totalNumBlocks: number, headerOfLastBlockInPreviousCheckpoint: BlockHeader, telemetryClient?: TelemetryClient, bindings?: LoggerBindings): Promise<CheckpointSubTreeOrchestrator>;
|
|
71
|
+
/** Returns a promise that resolves when block-level proving completes for the checkpoint. */
|
|
72
|
+
getSubTreeResult(): Promise<SubTreeResult>;
|
|
73
|
+
/**
|
|
74
|
+
* The epoch is started in the constructor.
|
|
75
|
+
*/
|
|
76
|
+
startNewEpoch(_epochNumber: EpochNumber, _totalNumCheckpoints: number, _finalBlobBatchingChallenges: FinalBlobBatchingChallenges): void;
|
|
77
|
+
/**
|
|
78
|
+
* The single internal checkpoint is started by the `start` factory
|
|
79
|
+
*/
|
|
80
|
+
startNewCheckpoint(_checkpointIndex: number, _constants: CheckpointConstantData, _l1ToL2Messages: Fr[], _totalNumBlocks: number, _headerOfLastBlockInPreviousCheckpoint: BlockHeader): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Returns the archive sibling path captured at the internal `startNewCheckpoint`.
|
|
83
|
+
* Available synchronously once `start` has resolved, before block-level proving
|
|
84
|
+
* completes. The top-tree consumer uses this to assemble checkpoint root rollup hints
|
|
85
|
+
* up-front so checkpoint root proofs can pipeline against in-flight sub-tree proving.
|
|
86
|
+
*/
|
|
87
|
+
getPreviousArchiveSiblingPath(): Tuple<Fr, typeof ARCHIVE_HEIGHT>;
|
|
88
|
+
/**
|
|
89
|
+
* Override the checkpoint-root boundary: instead of escalating to checkpoint root,
|
|
90
|
+
* resolve the sub-tree promise with the block-level proof outputs once they're all ready.
|
|
91
|
+
*/
|
|
92
|
+
protected checkAndEnqueueCheckpointRootRollup(provingState: CheckpointProvingState): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Kickstart chonk-verifier circuits via the shared `EpochProvingContext`. The context
|
|
95
|
+
* owns the broker job lifecycle, so the proof survives this sub-tree's `cancel()` —
|
|
96
|
+
* a tx that ends up in a replacement checkpoint after a reorg can pick the cached
|
|
97
|
+
* promise up and skip re-proving.
|
|
98
|
+
*/
|
|
99
|
+
startChonkVerifierCircuits(txs: Tx[]): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Route the tx's chonk-verifier dependency through the per-epoch context: read the
|
|
102
|
+
* cached promise (or enqueue if missing), then `.then(handleResult)` to progress to
|
|
103
|
+
* the base rollup once the proof lands.
|
|
104
|
+
*/
|
|
105
|
+
protected getOrEnqueueChonkVerifier(provingState: BlockProvingState, txIndex: number): void;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludC1zdWItdHJlZS1vcmNoZXN0cmF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcmNoZXN0cmF0b3IvY2hlY2twb2ludC1zdWItdHJlZS1vcmNoZXN0cmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLHlDQUF5QyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEcsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxFQUNWLHdCQUF3QixFQUN4Qiw2QkFBNkIsRUFDN0Isd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNwQixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUNWLHVCQUF1QixFQUN2QixzQkFBc0IsRUFFdkIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBR25GLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEtBQUssRUFBRSxtQkFBbUIs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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-sub-tree-orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/checkpoint-sub-tree-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { FinalBlobBatchingChallenges } from '@aztec/blob-lib';
|
|
2
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
3
|
+
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
4
|
+
import { getPublicChonkVerifierPrivateInputsFromTx } from './block-building-helpers.js';
|
|
5
|
+
import { ProvingOrchestrator } from './orchestrator.js';
|
|
6
|
+
/**
|
|
7
|
+
* Orchestrates block-level proving for a single checkpoint, stopping at the boundary
|
|
8
|
+
* where checkpoint root rollup would otherwise begin.
|
|
9
|
+
*
|
|
10
|
+
* Reuses every circuit driver in `ProvingOrchestrator` (chonk verifier, base, merge,
|
|
11
|
+
* block-root, parity, block-merge) but overrides the gating method that escalates to
|
|
12
|
+
* checkpoint root rollup. Instead of escalating, the orchestrator resolves
|
|
13
|
+
* `getSubTreeResult()` once every block-level proof in the checkpoint's tree is ready.
|
|
14
|
+
*
|
|
15
|
+
* Wiring: a single-checkpoint epoch is created in the constructor (epoch number sourced
|
|
16
|
+
* from the supplied `EpochProvingContext`). The canonical way to obtain a fully-started
|
|
17
|
+
* sub-tree is the `start` static factory, which also drives the single internal
|
|
18
|
+
* `startNewCheckpoint(0, ...)` call. The sub-tree never calls `finalizeEpochStructure`;
|
|
19
|
+
* the override of `checkAndEnqueueCheckpointRootRollup` resolves `getSubTreeResult` once
|
|
20
|
+
* block-level proving completes.
|
|
21
|
+
*/ export class CheckpointSubTreeOrchestrator extends ProvingOrchestrator {
|
|
22
|
+
epochContext;
|
|
23
|
+
subTreeResult;
|
|
24
|
+
constructor(dbProvider, prover, proverId, /**
|
|
25
|
+
* Per-epoch shared chonk-verifier proof cache. Every chonk-verifier proof started
|
|
26
|
+
* by this sub-tree lives on the context and survives the sub-tree's cancellation,
|
|
27
|
+
* so a tx whose original checkpoint is reorged out and re-appears in a replacement
|
|
28
|
+
* checkpoint reuses the cached proof. The context's `epochNumber` is the epoch
|
|
29
|
+
* this sub-tree proves into.
|
|
30
|
+
*/ epochContext, cancelJobsOnStop = false, enqueueConcurrency, telemetryClient = getTelemetryClient(), bindings){
|
|
31
|
+
super(dbProvider, prover, proverId, cancelJobsOnStop, enqueueConcurrency, telemetryClient, bindings), this.epochContext = epochContext;
|
|
32
|
+
// Single-checkpoint mini-epoch by construction. The total/challenges supplied to
|
|
33
|
+
// `super.startNewEpoch` are never read, because the sub-tree overrides
|
|
34
|
+
// `checkAndEnqueueCheckpointRootRollup` to short-circuit before the parent's
|
|
35
|
+
// checkpoint-root / finalize machinery would consume them.
|
|
36
|
+
super.startNewEpoch(epochContext.epochNumber, 1, FinalBlobBatchingChallenges.empty());
|
|
37
|
+
this.subTreeResult = promiseWithResolvers();
|
|
38
|
+
// Mark the rejection branch as observed so a `cancel()` or proving failure does not
|
|
39
|
+
// surface an unhandled rejection when no consumer awaits getSubTreeResult().
|
|
40
|
+
this.subTreeResult.promise.catch(()=>{});
|
|
41
|
+
// If the parent's proving state ever rejects, surface the failure on the sub-tree promise.
|
|
42
|
+
void this.provingPromise.then((result)=>{
|
|
43
|
+
if (result.status === 'failure') {
|
|
44
|
+
this.subTreeResult.reject(new Error(result.reason));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Constructs and starts a sub-tree for a single checkpoint. The returned sub-tree
|
|
50
|
+
* has had its single internal `startNewCheckpoint(0, ...)` driven; callers proceed
|
|
51
|
+
* directly to per-block `startNewBlock` / `addTxs` / `setBlockCompleted`.
|
|
52
|
+
*
|
|
53
|
+
* If the internal `startNewCheckpoint` rejects, the partially-constructed sub-tree
|
|
54
|
+
* is stopped before the error propagates, so no broker resources leak.
|
|
55
|
+
*/ static async start(dbProvider, prover, proverId, epochContext, cancelJobsOnStop, enqueueConcurrency, checkpointConstants, l1ToL2Messages, totalNumBlocks, headerOfLastBlockInPreviousCheckpoint, telemetryClient = getTelemetryClient(), bindings) {
|
|
56
|
+
const subTree = new CheckpointSubTreeOrchestrator(dbProvider, prover, proverId, epochContext, cancelJobsOnStop, enqueueConcurrency, telemetryClient, bindings);
|
|
57
|
+
try {
|
|
58
|
+
await ProvingOrchestrator.prototype.startNewCheckpoint.call(subTree, 0, checkpointConstants, l1ToL2Messages, totalNumBlocks, headerOfLastBlockInPreviousCheckpoint);
|
|
59
|
+
return subTree;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
await subTree.stop().catch(()=>{});
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Returns a promise that resolves when block-level proving completes for the checkpoint. */ getSubTreeResult() {
|
|
66
|
+
return this.subTreeResult.promise;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The epoch is started in the constructor.
|
|
70
|
+
*/ startNewEpoch(_epochNumber, _totalNumCheckpoints, _finalBlobBatchingChallenges) {
|
|
71
|
+
throw new Error('CheckpointSubTreeOrchestrator starts its epoch in the constructor; do not call startNewEpoch.');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The single internal checkpoint is started by the `start` factory
|
|
75
|
+
*/ startNewCheckpoint(_checkpointIndex, _constants, _l1ToL2Messages, _totalNumBlocks, _headerOfLastBlockInPreviousCheckpoint) {
|
|
76
|
+
return Promise.reject(new Error('CheckpointSubTreeOrchestrator drives its single checkpoint in `start`; do not call startNewCheckpoint.'));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Returns the archive sibling path captured at the internal `startNewCheckpoint`.
|
|
80
|
+
* Available synchronously once `start` has resolved, before block-level proving
|
|
81
|
+
* completes. The top-tree consumer uses this to assemble checkpoint root rollup hints
|
|
82
|
+
* up-front so checkpoint root proofs can pipeline against in-flight sub-tree proving.
|
|
83
|
+
*/ getPreviousArchiveSiblingPath() {
|
|
84
|
+
const checkpoint = this.provingState.getCheckpointProvingState(0);
|
|
85
|
+
if (!checkpoint) {
|
|
86
|
+
throw new Error('Checkpoint not started; call CheckpointSubTreeOrchestrator.start first.');
|
|
87
|
+
}
|
|
88
|
+
return checkpoint.getLastArchiveSiblingPath();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Override the checkpoint-root boundary: instead of escalating to checkpoint root,
|
|
92
|
+
* resolve the sub-tree promise with the block-level proof outputs once they're all ready.
|
|
93
|
+
*/ // eslint-disable-next-line require-await
|
|
94
|
+
async checkAndEnqueueCheckpointRootRollup(provingState) {
|
|
95
|
+
const proofs = provingState.getSubTreeOutputProofs();
|
|
96
|
+
const nonEmpty = proofs.filter((p)=>!!p);
|
|
97
|
+
if (proofs.length !== nonEmpty.length) {
|
|
98
|
+
// Block merge tree not fully resolved yet — will be retried as more block proofs land.
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.subTreeResult.resolve({
|
|
102
|
+
blockProofOutputs: nonEmpty,
|
|
103
|
+
previousArchiveSiblingPath: provingState.getLastArchiveSiblingPath()
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Kickstart chonk-verifier circuits via the shared `EpochProvingContext`. The context
|
|
108
|
+
* owns the broker job lifecycle, so the proof survives this sub-tree's `cancel()` —
|
|
109
|
+
* a tx that ends up in a replacement checkpoint after a reorg can pick the cached
|
|
110
|
+
* promise up and skip re-proving.
|
|
111
|
+
*/ startChonkVerifierCircuits(txs) {
|
|
112
|
+
if (!this.provingState?.verifyState()) {
|
|
113
|
+
return Promise.reject(new Error('Sub-tree proving state is not active.'));
|
|
114
|
+
}
|
|
115
|
+
const publicTxs = txs.filter((tx)=>tx.data.forPublic);
|
|
116
|
+
for (const tx of publicTxs){
|
|
117
|
+
const txHash = tx.getTxHash().toString();
|
|
118
|
+
const inputs = getPublicChonkVerifierPrivateInputsFromTx(tx, this.getProverId().toField());
|
|
119
|
+
// Fire and forget — getOrEnqueueChonkVerifier later picks up the cached promise
|
|
120
|
+
// when the tx is processed inside its block.
|
|
121
|
+
void this.epochContext.enqueue(txHash, inputs);
|
|
122
|
+
}
|
|
123
|
+
return Promise.resolve();
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Route the tx's chonk-verifier dependency through the per-epoch context: read the
|
|
127
|
+
* cached promise (or enqueue if missing), then `.then(handleResult)` to progress to
|
|
128
|
+
* the base rollup once the proof lands.
|
|
129
|
+
*/ getOrEnqueueChonkVerifier(provingState, txIndex) {
|
|
130
|
+
if (!provingState.verifyState()) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
134
|
+
const txHash = txProvingState.processedTx.hash.toString();
|
|
135
|
+
const handleResult = (result)=>{
|
|
136
|
+
if (!provingState.verifyState()) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
txProvingState.setPublicChonkVerifierProof(result);
|
|
140
|
+
this.checkAndEnqueueBaseRollup(provingState, txIndex);
|
|
141
|
+
};
|
|
142
|
+
let promise = this.epochContext.getCached(txHash);
|
|
143
|
+
if (!promise) {
|
|
144
|
+
promise = this.epochContext.enqueue(txHash, txProvingState.getPublicChonkVerifierPrivateInputs());
|
|
145
|
+
}
|
|
146
|
+
void promise.then(handleResult).catch(()=>{
|
|
147
|
+
// The context self-cleans on rejection; a future call (replacement sub-tree
|
|
148
|
+
// for this tx) will see the miss and re-enqueue. No action needed here.
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|