@aztec/prover-client 0.0.0-test.1 → 0.0.1-fake-ceab37513c
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/bin/get-proof-inputs.js +1 -1
- package/dest/block-factory/index.d.ts +2 -0
- package/dest/block-factory/index.d.ts.map +1 -0
- package/dest/block-factory/light.d.ts +36 -0
- package/dest/block-factory/light.d.ts.map +1 -0
- package/dest/{block_builder → block-factory}/light.js +35 -30
- package/dest/config.d.ts +6 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +11 -1
- package/dest/mocks/fixtures.d.ts +3 -3
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +2 -2
- package/dest/mocks/test_context.d.ts +18 -13
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +44 -38
- package/dest/orchestrator/block-building-helpers.d.ts +18 -11
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +80 -63
- package/dest/orchestrator/block-proving-state.d.ts +19 -10
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +63 -46
- package/dest/orchestrator/epoch-proving-state.d.ts +13 -6
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +40 -14
- package/dest/orchestrator/orchestrator.d.ts +7 -5
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +78 -52
- package/dest/orchestrator/orchestrator_metrics.d.ts +2 -0
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +9 -0
- package/dest/orchestrator/tx-proving-state.d.ts +2 -2
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +9 -20
- package/dest/prover-client/prover-client.d.ts +3 -3
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +5 -4
- package/dest/prover-client/server-epoch-prover.d.ts +6 -4
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +4 -4
- package/dest/proving_broker/broker_prover_facade.d.ts +5 -3
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +31 -21
- package/dest/proving_broker/config.d.ts +9 -4
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +15 -4
- package/dest/proving_broker/factory.d.ts +1 -1
- package/dest/proving_broker/factory.d.ts.map +1 -1
- package/dest/proving_broker/factory.js +5 -1
- package/dest/proving_broker/proof_store/factory.js +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
- package/dest/proving_broker/proving_agent.d.ts +3 -3
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +83 -47
- package/dest/proving_broker/proving_broker.d.ts +11 -2
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +6 -5
- package/dest/proving_broker/proving_broker_database/memory.js +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +9 -8
- package/dest/proving_broker/proving_job_controller.d.ts +7 -8
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +53 -45
- package/dest/proving_broker/rpc.d.ts +3 -5
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +1 -4
- 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 +7 -5
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +6 -3
- package/package.json +28 -27
- package/src/bin/get-proof-inputs.ts +1 -1
- package/src/block-factory/index.ts +1 -0
- package/src/{block_builder → block-factory}/light.ts +42 -29
- package/src/config.ts +24 -8
- package/src/mocks/fixtures.ts +5 -5
- package/src/mocks/test_context.ts +79 -59
- package/src/orchestrator/block-building-helpers.ts +96 -92
- package/src/orchestrator/block-proving-state.ts +78 -52
- package/src/orchestrator/epoch-proving-state.ts +51 -20
- package/src/orchestrator/orchestrator.ts +119 -60
- package/src/orchestrator/orchestrator_metrics.ts +20 -1
- package/src/orchestrator/tx-proving-state.ts +17 -24
- package/src/prover-client/prover-client.ts +16 -14
- package/src/prover-client/server-epoch-prover.ts +16 -7
- package/src/proving_broker/broker_prover_facade.ts +52 -36
- package/src/proving_broker/config.ts +17 -6
- package/src/proving_broker/factory.ts +2 -1
- package/src/proving_broker/proof_store/factory.ts +1 -1
- package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
- package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
- package/src/proving_broker/proving_agent.ts +89 -47
- package/src/proving_broker/proving_broker.ts +16 -15
- package/src/proving_broker/proving_broker_database/memory.ts +1 -1
- package/src/proving_broker/proving_broker_database/persisted.ts +9 -8
- package/src/proving_broker/proving_job_controller.ts +56 -65
- package/src/proving_broker/rpc.ts +1 -6
- package/src/test/mock_proof_store.ts +14 -0
- package/src/test/mock_prover.ts +27 -5
- package/dest/block_builder/index.d.ts +0 -6
- package/dest/block_builder/index.d.ts.map +0 -1
- package/dest/block_builder/light.d.ts +0 -33
- package/dest/block_builder/light.d.ts.map +0 -1
- package/src/block_builder/index.ts +0 -6
- /package/dest/{block_builder → block-factory}/index.js +0 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BatchedBlob, type FinalBlobBatchingChallenges } from '@aztec/blob-lib';
|
|
2
|
+
import type { ARCHIVE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH } from '@aztec/constants';
|
|
3
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
4
|
import type { Fr } from '@aztec/foundation/fields';
|
|
3
5
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
4
6
|
import { type TreeNodeLocation } from '@aztec/foundation/trees';
|
|
@@ -26,30 +28,35 @@ export declare class EpochProvingState {
|
|
|
26
28
|
readonly epochNumber: number;
|
|
27
29
|
readonly firstBlockNumber: number;
|
|
28
30
|
readonly totalNumBlocks: number;
|
|
31
|
+
readonly finalBlobBatchingChallenges: FinalBlobBatchingChallenges;
|
|
29
32
|
private completionCallback;
|
|
30
33
|
private rejectionCallback;
|
|
31
34
|
private blockRootOrMergeProvingOutputs;
|
|
32
35
|
private paddingBlockRootProvingOutput;
|
|
33
36
|
private rootRollupProvingOutput;
|
|
37
|
+
private finalBatchedBlob;
|
|
34
38
|
private provingStateLifecycle;
|
|
35
|
-
readonly cachedTubeProofs: Map<string, Promise<ProofAndVerificationKey<
|
|
39
|
+
readonly cachedTubeProofs: Map<string, Promise<ProofAndVerificationKey<535>>>;
|
|
36
40
|
blocks: (BlockProvingState | undefined)[];
|
|
37
|
-
constructor(epochNumber: number, firstBlockNumber: number, totalNumBlocks: number, completionCallback: (result: ProvingResult) => void, rejectionCallback: (reason: string) => void);
|
|
38
|
-
startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[], l1ToL2MessageSubtreeSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH>, l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot, lastArchiveSnapshot: AppendOnlyTreeSnapshot, newArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, previousBlockHeader: BlockHeader): BlockProvingState;
|
|
41
|
+
constructor(epochNumber: number, firstBlockNumber: number, totalNumBlocks: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges, completionCallback: (result: ProvingResult) => void, rejectionCallback: (reason: string) => void);
|
|
42
|
+
startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: 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): BlockProvingState;
|
|
39
43
|
verifyState(): boolean;
|
|
40
44
|
isAcceptingBlocks(): boolean;
|
|
41
45
|
setBlockRootRollupProof(blockIndex: number, proof: PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
|
|
42
46
|
setBlockMergeRollupProof(location: TreeNodeLocation, proof: PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
|
|
43
47
|
setRootRollupProof(proof: PublicInputsAndRecursiveProof<RootRollupPublicInputs>): void;
|
|
44
48
|
setPaddingBlockRootProof(proof: PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
|
|
49
|
+
setFinalBatchedBlob(batchedBlob: BatchedBlob): void;
|
|
50
|
+
setBlobAccumulators(toBlock?: number): Promise<void>;
|
|
45
51
|
getParentLocation(location: TreeNodeLocation): TreeNodeLocation;
|
|
46
52
|
getBlockMergeRollupInputs(mergeLocation: TreeNodeLocation): BlockMergeRollupInputs;
|
|
47
|
-
getRootRollupInputs(
|
|
48
|
-
getPaddingBlockRootInputs(
|
|
53
|
+
getRootRollupInputs(): RootRollupInputs;
|
|
54
|
+
getPaddingBlockRootInputs(): import("@aztec/stdlib/rollup").PaddingBlockRootRollupInputs;
|
|
49
55
|
getBlockProvingStateByBlockNumber(blockNumber: number): BlockProvingState | undefined;
|
|
50
56
|
getEpochProofResult(): {
|
|
51
57
|
proof: Proof;
|
|
52
58
|
publicInputs: RootRollupPublicInputs;
|
|
59
|
+
batchedBlobInputs: BatchedBlob;
|
|
53
60
|
};
|
|
54
61
|
isReadyForBlockMerge(location: TreeNodeLocation): boolean;
|
|
55
62
|
isReadyForRootRollup(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/epoch-proving-state.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"epoch-proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/epoch-proving-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { MembershipWitness, UnbalancedTreeStore } from '@aztec/foundation/trees';
|
|
1
|
+
import { UnbalancedTreeStore } from '@aztec/foundation/trees';
|
|
3
2
|
import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
4
3
|
import { BlockMergeRollupInputs, PreviousRollupBlockData, RootRollupInputs } from '@aztec/stdlib/rollup';
|
|
4
|
+
import { VkData } from '@aztec/stdlib/vks';
|
|
5
5
|
import { BlockProvingState } from './block-proving-state.js';
|
|
6
6
|
var PROVING_STATE_LIFECYCLE = /*#__PURE__*/ function(PROVING_STATE_LIFECYCLE) {
|
|
7
7
|
PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_CREATED"] = 0] = "PROVING_STATE_CREATED";
|
|
@@ -19,19 +19,22 @@ var PROVING_STATE_LIFECYCLE = /*#__PURE__*/ function(PROVING_STATE_LIFECYCLE) {
|
|
|
19
19
|
epochNumber;
|
|
20
20
|
firstBlockNumber;
|
|
21
21
|
totalNumBlocks;
|
|
22
|
+
finalBlobBatchingChallenges;
|
|
22
23
|
completionCallback;
|
|
23
24
|
rejectionCallback;
|
|
24
25
|
blockRootOrMergeProvingOutputs;
|
|
25
26
|
paddingBlockRootProvingOutput;
|
|
26
27
|
rootRollupProvingOutput;
|
|
28
|
+
finalBatchedBlob;
|
|
27
29
|
provingStateLifecycle;
|
|
28
30
|
// Map from tx hash to tube proof promise. Used when kickstarting tube proofs before tx processing.
|
|
29
31
|
cachedTubeProofs;
|
|
30
32
|
blocks;
|
|
31
|
-
constructor(epochNumber, firstBlockNumber, totalNumBlocks, completionCallback, rejectionCallback){
|
|
33
|
+
constructor(epochNumber, firstBlockNumber, totalNumBlocks, finalBlobBatchingChallenges, completionCallback, rejectionCallback){
|
|
32
34
|
this.epochNumber = epochNumber;
|
|
33
35
|
this.firstBlockNumber = firstBlockNumber;
|
|
34
36
|
this.totalNumBlocks = totalNumBlocks;
|
|
37
|
+
this.finalBlobBatchingChallenges = finalBlobBatchingChallenges;
|
|
35
38
|
this.completionCallback = completionCallback;
|
|
36
39
|
this.rejectionCallback = rejectionCallback;
|
|
37
40
|
this.provingStateLifecycle = 0;
|
|
@@ -41,9 +44,9 @@ var PROVING_STATE_LIFECYCLE = /*#__PURE__*/ function(PROVING_STATE_LIFECYCLE) {
|
|
|
41
44
|
}
|
|
42
45
|
// Adds a block to the proving state, returns its index
|
|
43
46
|
// Will update the proving life cycle if this is the last block
|
|
44
|
-
startNewBlock(globalVariables, l1ToL2Messages, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, newArchiveSiblingPath, previousBlockHeader) {
|
|
45
|
-
const index = globalVariables.blockNumber
|
|
46
|
-
const block = new BlockProvingState(index, globalVariables, l1ToL2Messages, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, newArchiveSiblingPath, previousBlockHeader, this);
|
|
47
|
+
startNewBlock(globalVariables, l1ToL2Messages, l1ToL2MessageTreeSnapshot, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, lastArchiveSiblingPath, newArchiveSiblingPath, previousBlockHeader, proverId) {
|
|
48
|
+
const index = globalVariables.blockNumber - this.firstBlockNumber;
|
|
49
|
+
const block = new BlockProvingState(index, globalVariables, l1ToL2Messages, l1ToL2MessageTreeSnapshot, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, lastArchiveSiblingPath, newArchiveSiblingPath, previousBlockHeader, proverId, this);
|
|
47
50
|
this.blocks[index] = block;
|
|
48
51
|
if (this.blocks.filter((b)=>!!b).length === this.totalNumBlocks) {
|
|
49
52
|
this.provingStateLifecycle = 1;
|
|
@@ -70,6 +73,28 @@ var PROVING_STATE_LIFECYCLE = /*#__PURE__*/ function(PROVING_STATE_LIFECYCLE) {
|
|
|
70
73
|
setPaddingBlockRootProof(proof) {
|
|
71
74
|
this.paddingBlockRootProvingOutput = proof;
|
|
72
75
|
}
|
|
76
|
+
setFinalBatchedBlob(batchedBlob) {
|
|
77
|
+
this.finalBatchedBlob = batchedBlob;
|
|
78
|
+
}
|
|
79
|
+
async setBlobAccumulators(toBlock) {
|
|
80
|
+
let previousAccumulator;
|
|
81
|
+
const end = toBlock ? toBlock - this.firstBlockNumber : this.blocks.length;
|
|
82
|
+
// Accumulate blobs as far as we can for this epoch.
|
|
83
|
+
for(let i = 0; i <= end; i++){
|
|
84
|
+
const block = this.blocks[i];
|
|
85
|
+
if (!block || !block.block) {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (!block.startBlobAccumulator) {
|
|
89
|
+
// startBlobAccumulator always exists for firstBlockNumber, so the below should never assign an undefined:
|
|
90
|
+
block.setStartBlobAccumulator(previousAccumulator);
|
|
91
|
+
}
|
|
92
|
+
if (block.startBlobAccumulator && !block.endBlobAccumulator) {
|
|
93
|
+
await block.accumulateBlobs();
|
|
94
|
+
}
|
|
95
|
+
previousAccumulator = block.endBlobAccumulator;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
73
98
|
getParentLocation(location) {
|
|
74
99
|
return this.blockRootOrMergeProvingOutputs.getParentLocation(location);
|
|
75
100
|
}
|
|
@@ -83,7 +108,7 @@ var PROVING_STATE_LIFECYCLE = /*#__PURE__*/ function(PROVING_STATE_LIFECYCLE) {
|
|
|
83
108
|
this.#getPreviousRollupData(right)
|
|
84
109
|
]);
|
|
85
110
|
}
|
|
86
|
-
getRootRollupInputs(
|
|
111
|
+
getRootRollupInputs() {
|
|
87
112
|
const [left, right] = this.#getChildProofsForRoot();
|
|
88
113
|
if (!left || !right) {
|
|
89
114
|
throw new Error('At lease one child is not ready.');
|
|
@@ -92,27 +117,27 @@ var PROVING_STATE_LIFECYCLE = /*#__PURE__*/ function(PROVING_STATE_LIFECYCLE) {
|
|
|
92
117
|
previousRollupData: [
|
|
93
118
|
this.#getPreviousRollupData(left),
|
|
94
119
|
this.#getPreviousRollupData(right)
|
|
95
|
-
]
|
|
96
|
-
proverId
|
|
120
|
+
]
|
|
97
121
|
});
|
|
98
122
|
}
|
|
99
|
-
getPaddingBlockRootInputs(
|
|
123
|
+
getPaddingBlockRootInputs() {
|
|
100
124
|
if (!this.blocks[0]?.isComplete()) {
|
|
101
125
|
throw new Error('Epoch needs one completed block in order to be padded.');
|
|
102
126
|
}
|
|
103
|
-
return this.blocks[0].getPaddingBlockRootInputs(
|
|
127
|
+
return this.blocks[0].getPaddingBlockRootInputs();
|
|
104
128
|
}
|
|
105
129
|
// Returns a specific transaction proving state
|
|
106
130
|
getBlockProvingStateByBlockNumber(blockNumber) {
|
|
107
131
|
return this.blocks.find((block)=>block?.blockNumber === blockNumber);
|
|
108
132
|
}
|
|
109
133
|
getEpochProofResult() {
|
|
110
|
-
if (!this.rootRollupProvingOutput) {
|
|
134
|
+
if (!this.rootRollupProvingOutput || !this.finalBatchedBlob) {
|
|
111
135
|
throw new Error('Unable to get epoch proof result. Root rollup is not ready.');
|
|
112
136
|
}
|
|
113
137
|
return {
|
|
114
138
|
proof: this.rootRollupProvingOutput.proof.binaryProof,
|
|
115
|
-
publicInputs: this.rootRollupProvingOutput.inputs
|
|
139
|
+
publicInputs: this.rootRollupProvingOutput.inputs,
|
|
140
|
+
batchedBlobInputs: this.finalBatchedBlob
|
|
116
141
|
};
|
|
117
142
|
}
|
|
118
143
|
isReadyForBlockMerge(location) {
|
|
@@ -158,6 +183,7 @@ var PROVING_STATE_LIFECYCLE = /*#__PURE__*/ function(PROVING_STATE_LIFECYCLE) {
|
|
|
158
183
|
}
|
|
159
184
|
#getPreviousRollupData({ inputs, proof, verificationKey }) {
|
|
160
185
|
const leafIndex = getVKIndex(verificationKey.keyAsFields);
|
|
161
|
-
|
|
186
|
+
const vkData = new VkData(verificationKey, leafIndex, getVKSiblingPath(leafIndex));
|
|
187
|
+
return new PreviousRollupBlockData(inputs, proof, vkData);
|
|
162
188
|
}
|
|
163
189
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { FinalBlobBatchingChallenges } from '@aztec/blob-lib';
|
|
1
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import { L2Block } from '@aztec/stdlib/block';
|
|
3
|
+
import { EthAddress, L2Block } from '@aztec/stdlib/block';
|
|
3
4
|
import type { EpochProver, ForkMerkleTreeOperations, ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
|
|
4
5
|
import { type AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
5
6
|
import { type BlockHeader, type GlobalVariables, type ProcessedTx, type Tx } from '@aztec/stdlib/tx';
|
|
@@ -26,11 +27,11 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
26
27
|
private provingPromise;
|
|
27
28
|
private metrics;
|
|
28
29
|
private dbs;
|
|
29
|
-
constructor(dbProvider: ForkMerkleTreeOperations, prover: ServerCircuitProver, proverId
|
|
30
|
+
constructor(dbProvider: ForkMerkleTreeOperations, prover: ServerCircuitProver, proverId: EthAddress, telemetryClient?: TelemetryClient);
|
|
30
31
|
get tracer(): Tracer;
|
|
31
|
-
getProverId():
|
|
32
|
+
getProverId(): EthAddress;
|
|
32
33
|
stop(): Promise<void>;
|
|
33
|
-
startNewEpoch(epochNumber: number, firstBlockNumber: number, totalNumBlocks: number): void;
|
|
34
|
+
startNewEpoch(epochNumber: number, firstBlockNumber: number, totalNumBlocks: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges): void;
|
|
34
35
|
/**
|
|
35
36
|
* Starts off a new block
|
|
36
37
|
* @param globalVariables - The global variables for the block
|
|
@@ -64,9 +65,10 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
64
65
|
/**
|
|
65
66
|
* Returns the proof for the current epoch.
|
|
66
67
|
*/
|
|
67
|
-
|
|
68
|
+
finalizeEpoch(): Promise<{
|
|
68
69
|
proof: import("@aztec/stdlib/proofs").Proof;
|
|
69
70
|
publicInputs: import("@aztec/stdlib/rollup").RootRollupPublicInputs;
|
|
71
|
+
batchedBlobInputs: import("@aztec/blob-lib").BatchedBlob;
|
|
70
72
|
}>;
|
|
71
73
|
/**
|
|
72
74
|
* Starts the proving process for the given transaction and adds it to our state
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAU3F,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAS9C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EACV,WAAW,EACX,wBAAwB,EAGxB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AAUzC,OAAO,EAAE,KAAK,sBAAsB,EAAgB,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAmB,MAAM,kBAAkB,CAAC;AACtH,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EAIZ,MAAM,yBAAyB,CAAC;AAqBjC;;;;;;;;;GASG;AAEH;;GAEG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IASnD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAV3B,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,kBAAkB,CAAyB;IAEnD,OAAO,CAAC,cAAc,CAAiD;IACvE,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,GAAG,CAAqD;gBAGtD,UAAU,EAAE,wBAAwB,EACpC,MAAM,EAAE,mBAAmB,EAClB,QAAQ,EAAE,UAAU,EACrC,eAAe,GAAE,eAAsC;IAKzD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAEM,WAAW,IAAI,UAAU;IAIzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,aAAa,CAClB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,2BAA2B,EAAE,2BAA2B;IAmB1D;;;;;OAKG;IAIU,aAAa,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,WAAW;IA+CnH;;;OAGG;IAIU,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDtD;;;OAGG;IAEI,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE;IAelC;;;OAGG;IAIU,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BnG,oDAAoD;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;YAQzB,UAAU;cAqCR,kCAAkC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,sBAAsB;IAWvG;;OAEG;IACI,MAAM;IAQb;;OAEG;IACU,aAAa;;;;;IA6B1B;;;;OAIG;YACW,kBAAkB;IAShC;;;;;OAKG;IACH,OAAO,CAAC,eAAe;YAwDT,uBAAuB;YAkCvB,uBAAuB;IAyCrC,OAAO,CAAC,iBAAiB;IA8CzB,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,kBAAkB;YA0BZ,sBAAsB;IAgFpC,OAAO,CAAC,wBAAwB;IAuBhC,OAAO,CAAC,gCAAgC;IAUxC,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,iBAAiB;YA4BX,8BAA8B;YAa9B,8BAA8B;IA2B5C,OAAO,CAAC,mCAAmC;IAa3C,OAAO,CAAC,yBAAyB;IASjC;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAoDjB,OAAO,CAAC,4BAA4B;CAWrC"}
|
|
@@ -4,7 +4,8 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
4
4
|
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
}
|
|
7
|
-
import {
|
|
7
|
+
import { BlobAccumulatorPublicInputs } from '@aztec/blob-lib';
|
|
8
|
+
import { L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
|
|
8
9
|
import { padArrayEnd, times } from '@aztec/foundation/collection';
|
|
9
10
|
import { AbortError } from '@aztec/foundation/error';
|
|
10
11
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -14,16 +15,15 @@ import { assertLength } from '@aztec/foundation/serialize';
|
|
|
14
15
|
import { pushTestData } from '@aztec/foundation/testing';
|
|
15
16
|
import { elapsed } from '@aztec/foundation/timer';
|
|
16
17
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
18
|
+
import { readAvmMinimalPublicTxInputsFromFile } from '@aztec/simulator/public/fixtures';
|
|
17
19
|
import { L2Block } from '@aztec/stdlib/block';
|
|
18
20
|
import { BaseParityInputs } from '@aztec/stdlib/parity';
|
|
19
|
-
import { makeEmptyRecursiveProof } from '@aztec/stdlib/proofs';
|
|
20
21
|
import { EmptyBlockRootRollupInputs, PrivateBaseRollupInputs, SingleTxBlockRootRollupInputs, TubeInputs } from '@aztec/stdlib/rollup';
|
|
21
22
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
22
23
|
import { toNumBlobFields } from '@aztec/stdlib/tx';
|
|
23
|
-
import { VerificationKeyData } from '@aztec/stdlib/vks';
|
|
24
24
|
import { Attributes, getTelemetryClient, trackSpan, wrapCallbackInSpan } from '@aztec/telemetry-client';
|
|
25
25
|
import { inspect } from 'util';
|
|
26
|
-
import {
|
|
26
|
+
import { buildHeaderAndBodyFromTxs, getLastSiblingPath, getRootTreeSiblingPath, getSubtreeSiblingPath, getTreeSnapshot, insertSideEffectsAndBuildBaseRollupHints, validatePartialState, validateTx } from './block-building-helpers.js';
|
|
27
27
|
import { EpochProvingState } from './epoch-proving-state.js';
|
|
28
28
|
import { ProvingOrchestratorMetrics } from './orchestrator_metrics.js';
|
|
29
29
|
import { TxProvingState } from './tx-proving-state.js';
|
|
@@ -48,7 +48,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
48
48
|
provingPromise;
|
|
49
49
|
metrics;
|
|
50
50
|
dbs;
|
|
51
|
-
constructor(dbProvider, prover, proverId
|
|
51
|
+
constructor(dbProvider, prover, proverId, telemetryClient = getTelemetryClient()){
|
|
52
52
|
this.dbProvider = dbProvider;
|
|
53
53
|
this.prover = prover;
|
|
54
54
|
this.proverId = proverId;
|
|
@@ -68,7 +68,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
68
68
|
this.cancel();
|
|
69
69
|
return Promise.resolve();
|
|
70
70
|
}
|
|
71
|
-
startNewEpoch(epochNumber, firstBlockNumber, totalNumBlocks) {
|
|
71
|
+
startNewEpoch(epochNumber, firstBlockNumber, totalNumBlocks, finalBlobBatchingChallenges) {
|
|
72
72
|
const { promise: _promise, resolve, reject } = promiseWithResolvers();
|
|
73
73
|
const promise = _promise.catch((reason)=>({
|
|
74
74
|
status: 'failure',
|
|
@@ -78,7 +78,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
78
78
|
throw new Error(`Invalid number of blocks for epoch (got ${totalNumBlocks})`);
|
|
79
79
|
}
|
|
80
80
|
logger.info(`Starting epoch ${epochNumber} with ${totalNumBlocks} blocks`);
|
|
81
|
-
this.provingState = new EpochProvingState(epochNumber, firstBlockNumber, totalNumBlocks, resolve, reject);
|
|
81
|
+
this.provingState = new EpochProvingState(epochNumber, firstBlockNumber, totalNumBlocks, finalBlobBatchingChallenges, resolve, reject);
|
|
82
82
|
this.provingPromise = promise;
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
@@ -93,16 +93,17 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
93
93
|
if (!this.provingState?.isAcceptingBlocks()) {
|
|
94
94
|
throw new Error(`Epoch not accepting further blocks`);
|
|
95
95
|
}
|
|
96
|
-
logger.info(`Starting block ${globalVariables.blockNumber
|
|
96
|
+
logger.info(`Starting block ${globalVariables.blockNumber} for slot ${globalVariables.slotNumber.toNumber()}`);
|
|
97
97
|
// Fork world state at the end of the immediately previous block
|
|
98
|
-
const db = await this.dbProvider.fork(globalVariables.blockNumber
|
|
99
|
-
this.dbs.set(globalVariables.blockNumber
|
|
98
|
+
const db = await this.dbProvider.fork(globalVariables.blockNumber - 1);
|
|
99
|
+
this.dbs.set(globalVariables.blockNumber, db);
|
|
100
100
|
// we start the block by enqueueing all of the base parity circuits
|
|
101
|
-
const { l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, baseParityInputs } = await this.prepareBaseParityInputs(l1ToL2Messages, db);
|
|
101
|
+
const { l1ToL2MessageTreeSnapshot, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, baseParityInputs } = await this.prepareBaseParityInputs(l1ToL2Messages, db);
|
|
102
102
|
// Get archive snapshot before this block lands
|
|
103
103
|
const lastArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
104
|
+
const lastArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
104
105
|
const newArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
105
|
-
const blockProvingState = this.provingState.startNewBlock(globalVariables, l1ToL2Messages, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchive, newArchiveSiblingPath, previousBlockHeader);
|
|
106
|
+
const blockProvingState = this.provingState.startNewBlock(globalVariables, l1ToL2Messages, l1ToL2MessageTreeSnapshot, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchive, lastArchiveSiblingPath, newArchiveSiblingPath, previousBlockHeader, this.proverId);
|
|
106
107
|
// Enqueue base parity circuits for the block
|
|
107
108
|
for(let i = 0; i < baseParityInputs.length; i++){
|
|
108
109
|
this.enqueueBaseParityCircuit(blockProvingState, baseParityInputs[i], i);
|
|
@@ -118,7 +119,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
118
119
|
logger.warn(`Provided no txs to orchestrator addTxs.`);
|
|
119
120
|
return;
|
|
120
121
|
}
|
|
121
|
-
const blockNumber = txs[0].
|
|
122
|
+
const blockNumber = txs[0].globalVariables.blockNumber;
|
|
122
123
|
const provingState = this.provingState?.getBlockProvingStateByBlockNumber(blockNumber);
|
|
123
124
|
if (!provingState) {
|
|
124
125
|
throw new Error(`Block proving state for ${blockNumber} not found`);
|
|
@@ -154,18 +155,19 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
154
155
|
/**
|
|
155
156
|
* Kickstarts tube circuits for the specified txs. These will be used during epoch proving.
|
|
156
157
|
* Note that if the tube circuits are not started this way, they will be started nontheless after processing.
|
|
157
|
-
*/
|
|
158
|
+
*/ startTubeCircuits(txs) {
|
|
158
159
|
if (!this.provingState?.verifyState()) {
|
|
159
160
|
throw new Error(`Invalid proving state, call startNewEpoch before starting tube circuits`);
|
|
160
161
|
}
|
|
161
162
|
for (const tx of txs){
|
|
162
|
-
const txHash =
|
|
163
|
-
const tubeInputs = new TubeInputs(tx.clientIvcProof);
|
|
163
|
+
const txHash = tx.getTxHash().toString();
|
|
164
|
+
const tubeInputs = new TubeInputs(!!tx.data.forPublic, tx.clientIvcProof);
|
|
164
165
|
const tubeProof = promiseWithResolvers();
|
|
165
166
|
logger.debug(`Starting tube circuit for tx ${txHash}`);
|
|
166
167
|
this.doEnqueueTube(txHash, tubeInputs, (proof)=>tubeProof.resolve(proof));
|
|
167
168
|
this.provingState?.cachedTubeProofs.set(txHash, tubeProof.promise);
|
|
168
169
|
}
|
|
170
|
+
return Promise.resolve();
|
|
169
171
|
}
|
|
170
172
|
/**
|
|
171
173
|
* Marks the block as completed.
|
|
@@ -176,7 +178,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
176
178
|
throw new Error(`Block proving state for ${blockNumber} not found`);
|
|
177
179
|
}
|
|
178
180
|
if (!provingState.spongeBlobState) {
|
|
179
|
-
// If we are completing an empty block,
|
|
181
|
+
// If we are completing an empty block, initialize the provingState.
|
|
180
182
|
// We will have 0 txs and no blob fields.
|
|
181
183
|
provingState.startNewBlock(0, 0);
|
|
182
184
|
}
|
|
@@ -186,6 +188,8 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
186
188
|
// And build the block header
|
|
187
189
|
logger.verbose(`Block ${blockNumber} completed. Assembling header.`);
|
|
188
190
|
await this.buildBlock(provingState, expectedHeader);
|
|
191
|
+
logger.debug(`Accumulating blobs for ${blockNumber}`);
|
|
192
|
+
await this.provingState?.setBlobAccumulators(blockNumber);
|
|
189
193
|
// If the proofs were faster than the block building, then we need to try the block root rollup again here
|
|
190
194
|
await this.checkAndEnqueueBlockRootRollup(provingState);
|
|
191
195
|
return provingState.block;
|
|
@@ -215,8 +219,8 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
215
219
|
const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
216
220
|
const l2Block = new L2Block(newArchive, header, body);
|
|
217
221
|
await this.verifyBuiltBlockAgainstSyncedState(l2Block, newArchive);
|
|
218
|
-
logger.verbose(`Orchestrator
|
|
219
|
-
provingState.
|
|
222
|
+
logger.verbose(`Orchestrator finalized block ${l2Block.number}`);
|
|
223
|
+
provingState.setBlock(l2Block);
|
|
220
224
|
}
|
|
221
225
|
// Flagged as protected to disable in certain unit tests
|
|
222
226
|
async verifyBuiltBlockAgainstSyncedState(l2Block, newArchive) {
|
|
@@ -235,14 +239,22 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
235
239
|
}
|
|
236
240
|
/**
|
|
237
241
|
* Returns the proof for the current epoch.
|
|
238
|
-
*/ async
|
|
242
|
+
*/ async finalizeEpoch() {
|
|
239
243
|
if (!this.provingState || !this.provingPromise) {
|
|
240
|
-
throw new Error(`Invalid proving state, an epoch must be proven before it can be
|
|
244
|
+
throw new Error(`Invalid proving state, an epoch must be proven before it can be finalized`);
|
|
241
245
|
}
|
|
242
246
|
const result = await this.provingPromise;
|
|
243
247
|
if (result.status === 'failure') {
|
|
244
248
|
throw new Error(`Epoch proving failed: ${result.reason}`);
|
|
245
249
|
}
|
|
250
|
+
// TODO(MW): Move this? Requires async and don't want to force root methods to be async
|
|
251
|
+
// TODO(MW): EpochProvingState uses this.blocks.filter(b => !!b).length as total blocks, use this below:
|
|
252
|
+
const finalBlock = this.provingState.blocks[this.provingState.totalNumBlocks - 1];
|
|
253
|
+
if (!finalBlock || !finalBlock.endBlobAccumulator) {
|
|
254
|
+
throw new Error(`Epoch's final block not ready for finalize`);
|
|
255
|
+
}
|
|
256
|
+
const finalBatchedBlob = await finalBlock.endBlobAccumulator.finalize();
|
|
257
|
+
this.provingState.setFinalBatchedBlob(finalBatchedBlob);
|
|
246
258
|
const epochProofResult = this.provingState.getEpochProofResult();
|
|
247
259
|
pushTestData('epochProofResult', {
|
|
248
260
|
proof: epochProofResult.proof.toString(),
|
|
@@ -314,11 +326,13 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
314
326
|
async prepareBaseParityInputs(l1ToL2Messages, db) {
|
|
315
327
|
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 'Too many L1 to L2 messages');
|
|
316
328
|
const baseParityInputs = times(NUM_BASE_PARITY_PER_ROOT_PARITY, (i)=>BaseParityInputs.fromSlice(l1ToL2MessagesPadded, i, getVKTreeRoot()));
|
|
329
|
+
const l1ToL2MessageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
|
|
317
330
|
const l1ToL2MessageSubtreeSiblingPath = assertLength(await getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT, db), L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH);
|
|
318
331
|
// Update the local trees to include the new l1 to l2 messages
|
|
319
332
|
await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
320
333
|
const l1ToL2MessageTreeSnapshotAfterInsertion = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
|
|
321
334
|
return {
|
|
335
|
+
l1ToL2MessageTreeSnapshot,
|
|
322
336
|
l1ToL2MessageSubtreeSiblingPath,
|
|
323
337
|
l1ToL2MessageTreeSnapshotAfterInsertion,
|
|
324
338
|
baseParityInputs
|
|
@@ -333,7 +347,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
333
347
|
const db = this.dbs.get(provingState.blockNumber);
|
|
334
348
|
// We build the base rollup inputs using a mock proof and verification key.
|
|
335
349
|
// These will be overwritten later once we have proven the tube circuit and any public kernels
|
|
336
|
-
const [ms, hints] = await elapsed(
|
|
350
|
+
const [ms, hints] = await elapsed(insertSideEffectsAndBuildBaseRollupHints(tx, provingState.globalVariables, provingState.l1ToL2MessageTreeSnapshotAfterInsertion, db, provingState.spongeBlobState));
|
|
337
351
|
this.metrics.recordBaseRollupInputs(ms);
|
|
338
352
|
const promises = [
|
|
339
353
|
MerkleTreeId.NOTE_HASH_TREE,
|
|
@@ -371,7 +385,6 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
371
385
|
logger.debug(`Enqueuing deferred proving base rollup for ${processedTx.hash.toString()}`);
|
|
372
386
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, `ProvingOrchestrator.prover.${inputs instanceof PrivateBaseRollupInputs ? 'getPrivateBaseRollupProof' : 'getPublicBaseRollupProof'}`, {
|
|
373
387
|
[Attributes.TX_HASH]: processedTx.hash.toString(),
|
|
374
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
375
388
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
376
389
|
}, (signal)=>{
|
|
377
390
|
if (inputs instanceof PrivateBaseRollupInputs) {
|
|
@@ -424,7 +437,6 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
424
437
|
}
|
|
425
438
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getTubeProof', {
|
|
426
439
|
[Attributes.TX_HASH]: txHash,
|
|
427
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
428
440
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'tube-circuit'
|
|
429
441
|
}, (signal)=>this.prover.getTubeProof(inputs, signal, this.provingState.epochNumber)), handler);
|
|
430
442
|
}
|
|
@@ -437,7 +449,6 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
437
449
|
}
|
|
438
450
|
const inputs = provingState.getMergeRollupInputs(location);
|
|
439
451
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getMergeRollupProof', {
|
|
440
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
441
452
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'merge-rollup'
|
|
442
453
|
}, (signal)=>this.prover.getMergeRollupProof(inputs, signal, provingState.epochNumber)), async (result)=>{
|
|
443
454
|
provingState.setMergeRollupProof(location, result);
|
|
@@ -451,10 +462,9 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
451
462
|
return;
|
|
452
463
|
}
|
|
453
464
|
provingState.blockRootRollupStarted = true;
|
|
454
|
-
const { rollupType, inputs } = await provingState.getBlockRootRollupTypeAndInputs(
|
|
465
|
+
const { rollupType, inputs } = await provingState.getBlockRootRollupTypeAndInputs();
|
|
455
466
|
logger.debug(`Enqueuing ${rollupType} for block ${provingState.blockNumber} with ${provingState.newL1ToL2Messages.length} l1 to l2 msgs.`);
|
|
456
467
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockRootRollupProof', {
|
|
457
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
458
468
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
459
469
|
}, (signal)=>{
|
|
460
470
|
if (inputs instanceof EmptyBlockRootRollupInputs) {
|
|
@@ -466,17 +476,29 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
466
476
|
}
|
|
467
477
|
}), async (result)=>{
|
|
468
478
|
provingState.setBlockRootRollupProof(result);
|
|
469
|
-
const header = await provingState.buildHeaderFromProvingOutputs(
|
|
479
|
+
const header = await provingState.buildHeaderFromProvingOutputs();
|
|
470
480
|
if (!(await header.hash()).equals(await provingState.block.header.hash())) {
|
|
471
|
-
logger.error(`Block header mismatch
|
|
472
|
-
provingState.reject(`Block header hash mismatch
|
|
481
|
+
logger.error(`Block header mismatch.\nCircuit: ${inspect(header)}\nComputed: ${inspect(provingState.block.header)}`);
|
|
482
|
+
provingState.reject(`Block header hash mismatch.`);
|
|
483
|
+
}
|
|
484
|
+
const dbArchiveRoot = provingState.block.archive.root;
|
|
485
|
+
const circuitArchiveRoot = result.inputs.newArchive.root;
|
|
486
|
+
if (!dbArchiveRoot.equals(circuitArchiveRoot)) {
|
|
487
|
+
logger.error(`New archive root mismatch.\nCircuit: ${result.inputs.newArchive.root}\nComputed: ${dbArchiveRoot}`);
|
|
488
|
+
provingState.reject(`New archive root mismatch.`);
|
|
489
|
+
}
|
|
490
|
+
const endBlobAccumulatorPublicInputs = BlobAccumulatorPublicInputs.fromBatchedBlobAccumulator(provingState.endBlobAccumulator);
|
|
491
|
+
const circuitEndBlobAccumulatorState = result.inputs.blobPublicInputs.endBlobAccumulator;
|
|
492
|
+
if (!circuitEndBlobAccumulatorState.equals(endBlobAccumulatorPublicInputs)) {
|
|
493
|
+
logger.error(`Blob accumulator state mismatch.\nCircuit: ${inspect(circuitEndBlobAccumulatorState)}\nComputed: ${inspect(endBlobAccumulatorPublicInputs)}`);
|
|
494
|
+
provingState.reject(`Blob accumulator state mismatch.`);
|
|
473
495
|
}
|
|
474
496
|
logger.debug(`Completed ${rollupType} proof for block ${provingState.block.number}`);
|
|
475
497
|
// validatePartialState(result.inputs.end, tx.treeSnapshots); // TODO(palla/prover)
|
|
476
498
|
const epochProvingState = this.provingState;
|
|
477
499
|
const leafLocation = epochProvingState.setBlockRootRollupProof(provingState.index, result);
|
|
478
500
|
if (epochProvingState.totalNumBlocks === 1) {
|
|
479
|
-
|
|
501
|
+
this.enqueueEpochPadding(epochProvingState);
|
|
480
502
|
} else {
|
|
481
503
|
this.checkAndEnqueueNextBlockMergeRollup(epochProvingState, leafLocation);
|
|
482
504
|
}
|
|
@@ -490,7 +512,6 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
490
512
|
return;
|
|
491
513
|
}
|
|
492
514
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBaseParityProof', {
|
|
493
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
494
515
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'base-parity'
|
|
495
516
|
}, (signal)=>this.prover.getBaseParityProof(inputs, signal, provingState.epochNumber)), (provingOutput)=>{
|
|
496
517
|
provingState.setBaseParityProof(index, provingOutput);
|
|
@@ -512,7 +533,6 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
512
533
|
}
|
|
513
534
|
const inputs = provingState.getRootParityInputs();
|
|
514
535
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootParityProof', {
|
|
515
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
516
536
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'root-parity'
|
|
517
537
|
}, (signal)=>this.prover.getRootParityProof(inputs, signal, provingState.epochNumber)), async (result)=>{
|
|
518
538
|
provingState.setRootParityProof(result);
|
|
@@ -528,24 +548,22 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
528
548
|
}
|
|
529
549
|
const inputs = provingState.getBlockMergeRollupInputs(location);
|
|
530
550
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockMergeRollupProof', {
|
|
531
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
532
551
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'block-merge-rollup'
|
|
533
552
|
}, (signal)=>this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
534
553
|
provingState.setBlockMergeRollupProof(location, result);
|
|
535
554
|
this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
536
555
|
});
|
|
537
556
|
}
|
|
538
|
-
|
|
557
|
+
enqueueEpochPadding(provingState) {
|
|
539
558
|
if (!provingState.verifyState()) {
|
|
540
559
|
logger.debug('Not running epoch padding. State no longer valid.');
|
|
541
560
|
return;
|
|
542
561
|
}
|
|
543
|
-
logger.debug('Padding epoch proof with
|
|
544
|
-
const inputs =
|
|
545
|
-
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.
|
|
546
|
-
[Attributes.
|
|
547
|
-
|
|
548
|
-
}, (signal)=>this.prover.getEmptyBlockRootRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
562
|
+
logger.debug('Padding epoch proof with a padding block root proof.');
|
|
563
|
+
const inputs = provingState.getPaddingBlockRootInputs();
|
|
564
|
+
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getPaddingBlockRootRollupProof', {
|
|
565
|
+
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'padding-block-root-rollup'
|
|
566
|
+
}, (signal)=>this.prover.getPaddingBlockRootRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
549
567
|
logger.debug('Completed proof for padding block root.');
|
|
550
568
|
provingState.setPaddingBlockRootProof(result);
|
|
551
569
|
this.checkAndEnqueueRootRollup(provingState);
|
|
@@ -558,9 +576,8 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
558
576
|
return;
|
|
559
577
|
}
|
|
560
578
|
logger.debug(`Preparing root rollup`);
|
|
561
|
-
const inputs = provingState.getRootRollupInputs(
|
|
579
|
+
const inputs = provingState.getRootRollupInputs();
|
|
562
580
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootRollupProof', {
|
|
563
|
-
[Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server',
|
|
564
581
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'root-rollup'
|
|
565
582
|
}, (signal)=>this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
566
583
|
logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
|
|
@@ -582,15 +599,17 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
582
599
|
}
|
|
583
600
|
}
|
|
584
601
|
async checkAndEnqueueBlockRootRollup(provingState) {
|
|
602
|
+
const blockNumber = provingState.blockNumber;
|
|
603
|
+
// Accumulate as far as we can, in case blocks came in out of order and we are behind:
|
|
604
|
+
await this.provingState?.setBlobAccumulators(blockNumber);
|
|
585
605
|
if (!provingState.isReadyForBlockRootRollup()) {
|
|
586
|
-
logger.debug('Not ready for root rollup');
|
|
606
|
+
logger.debug('Not ready for block root rollup');
|
|
587
607
|
return;
|
|
588
608
|
}
|
|
589
609
|
if (provingState.blockRootRollupStarted) {
|
|
590
610
|
logger.debug('Block root rollup already started');
|
|
591
611
|
return;
|
|
592
612
|
}
|
|
593
|
-
const blockNumber = provingState.blockNumber;
|
|
594
613
|
// TODO(palla/prover): This closes the fork only on the happy path. If this epoch orchestrator
|
|
595
614
|
// is aborted and never reaches this point, it will leak the fork. We need to add a global cleanup,
|
|
596
615
|
// but have to make sure it only runs once all operations are completed, otherwise some function here
|
|
@@ -635,17 +654,24 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
635
654
|
}, async (signal)=>{
|
|
636
655
|
const inputs = txProvingState.getAvmInputs();
|
|
637
656
|
try {
|
|
638
|
-
|
|
657
|
+
// TODO(#14234)[Unconditional PIs validation]: Remove the whole try-catch logic and
|
|
658
|
+
// just keep the next line but removing the second argument (false).
|
|
659
|
+
return await this.prover.getAvmProof(inputs, false, signal, provingState.epochNumber);
|
|
639
660
|
} catch (err) {
|
|
640
661
|
if (process.env.AVM_PROVING_STRICT) {
|
|
641
662
|
logger.error(`Error thrown when proving AVM circuit with AVM_PROVING_STRICT on`, err);
|
|
642
663
|
throw err;
|
|
643
664
|
} else {
|
|
644
|
-
logger.warn(`Error thrown when proving AVM circuit but AVM_PROVING_STRICT is off.
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
665
|
+
logger.warn(`Error thrown when proving AVM circuit but AVM_PROVING_STRICT is off. Use snapshotted
|
|
666
|
+
AVM inputs and carrying on. ${inspect(err)}.`);
|
|
667
|
+
try {
|
|
668
|
+
this.metrics.incAvmFallback();
|
|
669
|
+
const snapshotAvmPrivateInputs = readAvmMinimalPublicTxInputsFromFile();
|
|
670
|
+
return await this.prover.getAvmProof(snapshotAvmPrivateInputs, true, signal, provingState.epochNumber);
|
|
671
|
+
} catch (err) {
|
|
672
|
+
logger.error(`Error thrown when proving snapshotted AVM inputs.`, err);
|
|
673
|
+
throw err;
|
|
674
|
+
}
|
|
649
675
|
}
|
|
650
676
|
}
|
|
651
677
|
});
|
|
@@ -667,7 +693,7 @@ const logger = createLogger('prover-client:orchestrator');
|
|
|
667
693
|
}
|
|
668
694
|
_ts_decorate([
|
|
669
695
|
trackSpan('ProvingOrchestrator.startNewBlock', (globalVariables)=>({
|
|
670
|
-
[Attributes.BLOCK_NUMBER]: globalVariables.blockNumber
|
|
696
|
+
[Attributes.BLOCK_NUMBER]: globalVariables.blockNumber
|
|
671
697
|
}))
|
|
672
698
|
], ProvingOrchestrator.prototype, "startNewBlock", null);
|
|
673
699
|
_ts_decorate([
|
|
@@ -2,7 +2,9 @@ import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
|
2
2
|
export declare class ProvingOrchestratorMetrics {
|
|
3
3
|
readonly tracer: Tracer;
|
|
4
4
|
private baseRollupInputsDuration;
|
|
5
|
+
private avmFallbackCount;
|
|
5
6
|
constructor(client: TelemetryClient, name?: string);
|
|
6
7
|
recordBaseRollupInputs(durationMs: number): void;
|
|
8
|
+
incAvmFallback(): void;
|
|
7
9
|
}
|
|
8
10
|
//# sourceMappingURL=orchestrator_metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator_metrics.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"orchestrator_metrics.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,0BAA0B;IACrC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,wBAAwB,CAAY;IAC5C,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,MAAM,EAAE,eAAe,EAAE,IAAI,SAAwB;IAkBjE,sBAAsB,CAAC,UAAU,EAAE,MAAM;IAIzC,cAAc;CAGf"}
|