@aztec/prover-node 6.0.0-nightly.20260812 → 6.0.0-nightly.20260822
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/actions/rerun-epoch-proving-job.d.ts +3 -2
- package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
- package/dest/actions/rerun-epoch-proving-job.js +5 -3
- package/dest/job/checkpoint-prover.d.ts +15 -11
- package/dest/job/checkpoint-prover.d.ts.map +1 -1
- package/dest/job/checkpoint-prover.js +46 -38
- package/dest/job/epoch-proving-job-data.d.ts +3 -1
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
- package/dest/job/epoch-proving-job-data.js +3 -1
- package/dest/job/top-tree-job.d.ts +1 -1
- package/dest/job/top-tree-job.js +2 -2
- package/dest/prover-node-publisher.d.ts +1 -1
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +21 -12
- package/dest/prover-node.d.ts +2 -1
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +23 -1
- package/dest/session-manager.d.ts +1 -1
- package/dest/session-manager.d.ts.map +1 -1
- package/dest/session-manager.js +1 -0
- package/package.json +20 -24
- package/src/actions/rerun-epoch-proving-job.ts +8 -5
- package/src/job/checkpoint-prover.ts +62 -49
- package/src/job/epoch-proving-job-data.ts +13 -1
- package/src/job/top-tree-job.ts +2 -2
- package/src/prover-node-publisher.ts +21 -12
- package/src/prover-node.ts +26 -1
- package/src/session-manager.ts +1 -0
|
@@ -2,6 +2,7 @@ import type { L1ContractsConfig } from '@aztec/ethereum/config';
|
|
|
2
2
|
import type { Logger } from '@aztec/foundation/log';
|
|
3
3
|
import { type ProverClientConfig } from '@aztec/prover-client';
|
|
4
4
|
import { ProverBrokerConfig } from '@aztec/prover-client/broker';
|
|
5
|
+
import { type CheckpointSubTreeProofs } from '@aztec/prover-client/orchestrator';
|
|
5
6
|
import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
|
|
6
7
|
import type { GenesisData } from '@aztec/stdlib/world-state';
|
|
7
8
|
type RerunConfig = DataStoreConfig & ProverBrokerConfig & ProverClientConfig & Pick<L1ContractsConfig, 'aztecEpochDuration'>;
|
|
@@ -17,6 +18,6 @@ export declare function rerunEpochProvingJob(localPath: string, log: Logger, con
|
|
|
17
18
|
* epoch top-tree, no L1 submission — so a checkpoint-level failure can be reproduced offline in isolation.
|
|
18
19
|
* Returns the block-rollup proof outputs on success; throws if the checkpoint fails to prove again.
|
|
19
20
|
*/
|
|
20
|
-
export declare function rerunCheckpointProvingJob(localPath: string, log: Logger, config: RerunConfig, genesis?: GenesisData): Promise<
|
|
21
|
+
export declare function rerunCheckpointProvingJob(localPath: string, log: Logger, config: RerunConfig, genesis?: GenesisData): Promise<CheckpointSubTreeProofs['blockProofOutputs']>;
|
|
21
22
|
export {};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVydW4tZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3JlcnVuLWVwb2NoLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXNCLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGtCQUFrQixFQUErQixNQUFNLDZCQUE2QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxLQUFLLHVCQUF1QixFQUFjLE1BQU0sbUNBQW1DLENBQUM7QUFLN0YsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFXN0QsS0FBSyxXQUFXLEdBQUcsZUFBZSxHQUNoQyxrQkFBa0IsR0FDbEIsa0JBQWtCLEdBQ2xCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhEOzs7O0dBSUc7QUFDSCx3QkFBc0Isb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsV0FBVyxtTUFzQ3BIO0FBRUQ7Ozs7O0dBS0c7QUFDSCx3QkFBc0IseUJBQXlCLENBQzdDLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLEdBQUcsRUFBRSxNQUFNLEVBQ1gsTUFBTSxFQUFFLFdBQVcsRUFDbkIsT0FBTyxDQUFDLEVBQUUsV0FBVyxHQUNwQixPQUFPLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQWdCdkQifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rerun-epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/actions/rerun-epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"rerun-epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/actions/rerun-epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,6BAA6B,CAAC;AAE9F,OAAO,EAAE,KAAK,uBAAuB,EAAc,MAAM,mCAAmC,CAAC;AAK7F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAW7D,KAAK,WAAW,GAAG,eAAe,GAChC,kBAAkB,GAClB,kBAAkB,GAClB,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAEhD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,WAAW,mMAsCpH;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,CAAC,CAgBvD"}
|
|
@@ -155,9 +155,9 @@ import { ProverNodeJobMetrics } from '../metrics.js';
|
|
|
155
155
|
log.info(`Rerunning checkpoint proving for checkpoint ${checkpointNumber} (epoch ${jobData.epochNumber})`);
|
|
156
156
|
const prover = await buildCheckpointProver(ctx, 0, log);
|
|
157
157
|
try {
|
|
158
|
-
const
|
|
159
|
-
log.info(`Completed proving for checkpoint ${checkpointNumber} with ${
|
|
160
|
-
return
|
|
158
|
+
const { blockProofOutputs } = await prover.whenSubTreeProofsReady();
|
|
159
|
+
log.info(`Completed proving for checkpoint ${checkpointNumber} with ${blockProofOutputs.length} block proof(s)`);
|
|
160
|
+
return blockProofOutputs;
|
|
161
161
|
} finally{
|
|
162
162
|
prover.cancel({
|
|
163
163
|
routine: true
|
|
@@ -209,6 +209,7 @@ import { ProverNodeJobMetrics } from '../metrics.js';
|
|
|
209
209
|
const { jobData, worldState, prover, chonkCache, publicProcessorFactory, txProvider, metrics } = ctx;
|
|
210
210
|
const checkpoint = jobData.checkpoints[index];
|
|
211
211
|
const previousBlockHeader = index === 0 ? jobData.previousBlockHeader : jobData.checkpoints[index - 1].blocks.at(-1).header;
|
|
212
|
+
const previousInboxRollingHash = index === 0 ? jobData.previousInboxRollingHash : jobData.checkpoints[index - 1].header.inboxRollingHash;
|
|
212
213
|
const l1ToL2Messages = jobData.l1ToL2Messages[checkpoint.number] ?? [];
|
|
213
214
|
const previousArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, worldState.getSnapshot(BlockNumber(checkpoint.blocks[0].number - 1)));
|
|
214
215
|
const attestations = checkpoint.number === jobData.checkpoints.at(-1).number ? jobData.attestations : [];
|
|
@@ -218,6 +219,7 @@ import { ProverNodeJobMetrics } from '../metrics.js';
|
|
|
218
219
|
attestations,
|
|
219
220
|
previousBlockHeader,
|
|
220
221
|
l1ToL2Messages,
|
|
222
|
+
previousInboxRollingHash,
|
|
221
223
|
previousArchiveSiblingPath
|
|
222
224
|
}, {
|
|
223
225
|
proverFactory: prover,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ARCHIVE_HEIGHT } from '@aztec/constants';
|
|
2
2
|
import { type EpochNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
@@ -6,7 +6,7 @@ import type { Logger } from '@aztec/foundation/log';
|
|
|
6
6
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
7
7
|
import { type DateProvider } from '@aztec/foundation/timer';
|
|
8
8
|
import type { EpochProverFactory } from '@aztec/prover-client';
|
|
9
|
-
import type {
|
|
9
|
+
import type { CheckpointSubTreeProofs, ChonkCache } from '@aztec/prover-client/orchestrator';
|
|
10
10
|
import type { PublicProcessorFactory } from '@aztec/simulator/server';
|
|
11
11
|
import type { CommitteeAttestation } from '@aztec/stdlib/block';
|
|
12
12
|
import type { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
@@ -54,6 +54,8 @@ export type CheckpointProverArgs = {
|
|
|
54
54
|
attestations: CommitteeAttestation[];
|
|
55
55
|
previousBlockHeader: BlockHeader;
|
|
56
56
|
l1ToL2Messages: Fr[];
|
|
57
|
+
/** Inbox rolling hash of the previous checkpoint (this checkpoint's chain start); genesis is zero. */
|
|
58
|
+
previousInboxRollingHash: Fr;
|
|
57
59
|
previousArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>;
|
|
58
60
|
};
|
|
59
61
|
/**
|
|
@@ -66,8 +68,8 @@ export type CheckpointProverArgs = {
|
|
|
66
68
|
* predecessor but with different content, keys to a distinct prover.
|
|
67
69
|
*
|
|
68
70
|
* The prover eagerly starts its own tx gather and sub-tree work in the constructor, so
|
|
69
|
-
* callers only need to call `
|
|
70
|
-
* proofs.
|
|
71
|
+
* callers only need to call `whenSubTreeProofsReady()` to obtain the resulting block-rollup
|
|
72
|
+
* and InboxParity proofs.
|
|
71
73
|
*
|
|
72
74
|
* A CheckpointProver does not survive a prune: its sub-tree work forks world-state per
|
|
73
75
|
* block, and an L1 prune of a base block faults those reads. The store therefore cancels and
|
|
@@ -86,9 +88,11 @@ export declare class CheckpointProver {
|
|
|
86
88
|
readonly attestations: CommitteeAttestation[];
|
|
87
89
|
readonly previousBlockHeader: BlockHeader;
|
|
88
90
|
readonly l1ToL2Messages: Fr[];
|
|
91
|
+
readonly previousInboxRollingHash: Fr;
|
|
89
92
|
readonly previousArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>;
|
|
90
|
-
/** Resolved by the sub-tree on success, rejected on cancel/failure.
|
|
91
|
-
|
|
93
|
+
/** Resolved by the sub-tree on success, rejected on cancel/failure. Carries the block proofs plus the checkpoint's
|
|
94
|
+
* InboxParity proof (which feeds the checkpoint root in the top tree). */
|
|
95
|
+
private readonly subTreeProofs;
|
|
92
96
|
/** Block-level proving was fully *enqueued* (a progress marker; the sub-tree may still be proving). */
|
|
93
97
|
private completed;
|
|
94
98
|
/** Block proofs rejected for a genuine (non-cancel) reason — a sub-tree or prune-induced fork fault. */
|
|
@@ -120,17 +124,17 @@ export declare class CheckpointProver {
|
|
|
120
124
|
isFailed(): boolean;
|
|
121
125
|
/** AbortSignal that fires on cancel — for callers that want to wire their own tasks. */
|
|
122
126
|
getAbortSignal(): AbortSignal;
|
|
123
|
-
/** Promise that resolves with the block-rollup proofs for this checkpoint (or rejects
|
|
124
|
-
|
|
127
|
+
/** Promise that resolves with the block-rollup proofs and InboxParity proof for this checkpoint (or rejects). */
|
|
128
|
+
whenSubTreeProofsReady(): Promise<CheckpointSubTreeProofs>;
|
|
125
129
|
/** Resolves when all in-flight work for this prover has fully unwound. */
|
|
126
130
|
whenDone(): Promise<void>;
|
|
127
131
|
private gatherAndExecute;
|
|
128
132
|
/**
|
|
129
|
-
* Rejects the
|
|
133
|
+
* Rejects the sub-tree proof promise and, unless this is a cancellation, records the prover as failed so
|
|
130
134
|
* the reconciler won't build an EpochSession over it. First rejection wins, so a later duplicate reject
|
|
131
135
|
* (e.g. the executeCheckpoint `finally`) is a harmless no-op.
|
|
132
136
|
*/
|
|
133
|
-
private
|
|
137
|
+
private failSubTreeProofs;
|
|
134
138
|
private fetchTxs;
|
|
135
139
|
private gatherTxs;
|
|
136
140
|
/**
|
|
@@ -162,4 +166,4 @@ export declare class CheckpointProver {
|
|
|
162
166
|
private processTxs;
|
|
163
167
|
private createFork;
|
|
164
168
|
}
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludC1wcm92ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qb2IvY2hlY2twb2ludC1wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFlLEtBQUssV0FBVyxFQUFFLEtBQUssVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakcsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBR25FLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBRVYsdUJBQXVCLEVBQ3ZCLFVBQVUsRUFDWCxNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFtQixzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHN0YsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFlLEVBQUUsRUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBRTdFLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-prover.d.ts","sourceRoot":"","sources":["../../src/job/checkpoint-prover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"checkpoint-prover.d.ts","sourceRoot":"","sources":["../../src/job/checkpoint-prover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
2
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
-
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
-
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
2
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
6
3
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
4
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
@@ -19,8 +16,8 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
19
16
|
* predecessor but with different content, keys to a distinct prover.
|
|
20
17
|
*
|
|
21
18
|
* The prover eagerly starts its own tx gather and sub-tree work in the constructor, so
|
|
22
|
-
* callers only need to call `
|
|
23
|
-
* proofs.
|
|
19
|
+
* callers only need to call `whenSubTreeProofsReady()` to obtain the resulting block-rollup
|
|
20
|
+
* and InboxParity proofs.
|
|
24
21
|
*
|
|
25
22
|
* A CheckpointProver does not survive a prune: its sub-tree work forks world-state per
|
|
26
23
|
* block, and an L1 prune of a base block faults those reads. The store therefore cancels and
|
|
@@ -38,13 +35,15 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
38
35
|
attestations;
|
|
39
36
|
previousBlockHeader;
|
|
40
37
|
l1ToL2Messages;
|
|
38
|
+
previousInboxRollingHash;
|
|
41
39
|
previousArchiveSiblingPath;
|
|
42
|
-
/** Resolved by the sub-tree on success, rejected on cancel/failure.
|
|
40
|
+
/** Resolved by the sub-tree on success, rejected on cancel/failure. Carries the block proofs plus the checkpoint's
|
|
41
|
+
* InboxParity proof (which feeds the checkpoint root in the top tree). */ subTreeProofs;
|
|
43
42
|
// Three independent lifecycle facts — deliberately not collapsed into one status enum, because several
|
|
44
43
|
// combinations are legal and relied on: a prover can be `completed` and then `cancelled` (routine
|
|
45
44
|
// teardown of an already-proven checkpoint), or `completed` and then `failed` (block proving was
|
|
46
45
|
// enqueued, but the sub-tree subsequently faulted). Only `failed` + `cancelled` is excluded — a cancel
|
|
47
|
-
// is not a failure (enforced in `
|
|
46
|
+
// is not a failure (enforced in `failSubTreeProofs`).
|
|
48
47
|
/** Block-level proving was fully *enqueued* (a progress marker; the sub-tree may still be proving). */ completed;
|
|
49
48
|
/** Block proofs rejected for a genuine (non-cancel) reason — a sub-tree or prune-induced fork fault. */ failed;
|
|
50
49
|
/** The prover was torn down (prune / reap / shutdown). */ cancelled;
|
|
@@ -55,7 +54,7 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
55
54
|
/** Tracks the success-driven sub-tree teardown (once block proofs are captured) so `whenDone()` can await it. */ teardownPromise;
|
|
56
55
|
constructor(args, deps){
|
|
57
56
|
this.deps = deps;
|
|
58
|
-
this.
|
|
57
|
+
this.subTreeProofs = promiseWithResolvers();
|
|
59
58
|
this.completed = false;
|
|
60
59
|
this.failed = false;
|
|
61
60
|
this.cancelled = false;
|
|
@@ -66,11 +65,12 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
66
65
|
this.attestations = args.attestations;
|
|
67
66
|
this.previousBlockHeader = args.previousBlockHeader;
|
|
68
67
|
this.l1ToL2Messages = args.l1ToL2Messages;
|
|
68
|
+
this.previousInboxRollingHash = args.previousInboxRollingHash;
|
|
69
69
|
this.previousArchiveSiblingPath = args.previousArchiveSiblingPath;
|
|
70
70
|
this.id = CheckpointProver.idFor(args.checkpoint);
|
|
71
|
-
// Mark
|
|
71
|
+
// Mark subTreeProofs as observed so a cancel that lands before any consumer awaits
|
|
72
72
|
// does not surface as an unhandled rejection.
|
|
73
|
-
this.
|
|
73
|
+
this.subTreeProofs.promise.catch(()=>{});
|
|
74
74
|
deps.log.info(`Created CheckpointProver ${this.id}`, {
|
|
75
75
|
checkpointNumber: this.checkpoint.number,
|
|
76
76
|
epochNumber: this.epochNumber,
|
|
@@ -103,18 +103,18 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
103
103
|
/** AbortSignal that fires on cancel — for callers that want to wire their own tasks. */ getAbortSignal() {
|
|
104
104
|
return this.abortController.signal;
|
|
105
105
|
}
|
|
106
|
-
/** Promise that resolves with the block-rollup proofs for this checkpoint (or rejects
|
|
107
|
-
return this.
|
|
106
|
+
/** Promise that resolves with the block-rollup proofs and InboxParity proof for this checkpoint (or rejects). */ whenSubTreeProofsReady() {
|
|
107
|
+
return this.subTreeProofs.promise;
|
|
108
108
|
}
|
|
109
109
|
/** Resolves when all in-flight work for this prover has fully unwound. */ async whenDone() {
|
|
110
110
|
await this.runPromise.catch(()=>{});
|
|
111
111
|
// `runPromise` resolves once block-level proving is *enqueued*, but the sub-tree's proofs (and the
|
|
112
112
|
// success-driven teardown they trigger) land later, on the `getSubTreeResult()` callback. Awaiting
|
|
113
|
-
// `
|
|
113
|
+
// `subTreeProofs` here bridges that gap: on success the callback resolves `subTreeProofs` and then
|
|
114
114
|
// synchronously sets `teardownPromise` before this await resumes, so the teardown is observable
|
|
115
|
-
// below; on failure/cancel `
|
|
115
|
+
// below; on failure/cancel `subTreeProofs` rejects and teardown is driven by the `finally`/cancel
|
|
116
116
|
// paths already awaited via `runPromise`/`cancelPromise`.
|
|
117
|
-
await this.
|
|
117
|
+
await this.subTreeProofs.promise.catch(()=>{});
|
|
118
118
|
if (this.cancelPromise) {
|
|
119
119
|
await this.cancelPromise;
|
|
120
120
|
}
|
|
@@ -139,14 +139,14 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
139
139
|
this.deps.log.error(`Error in CheckpointProver ${this.id}`, err, {
|
|
140
140
|
checkpointNumber: this.checkpoint.number
|
|
141
141
|
});
|
|
142
|
-
this.
|
|
142
|
+
this.failSubTreeProofs(err instanceof Error ? err : new Error(String(err)));
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
/**
|
|
146
|
-
* Rejects the
|
|
146
|
+
* Rejects the sub-tree proof promise and, unless this is a cancellation, records the prover as failed so
|
|
147
147
|
* the reconciler won't build an EpochSession over it. First rejection wins, so a later duplicate reject
|
|
148
148
|
* (e.g. the executeCheckpoint `finally`) is a harmless no-op.
|
|
149
|
-
*/
|
|
149
|
+
*/ failSubTreeProofs(err) {
|
|
150
150
|
if (!this.cancelled && !this.failed) {
|
|
151
151
|
this.failed = true;
|
|
152
152
|
// Notify the owner so it can upload a post-mortem for this checkpoint. Fire-and-forget: the
|
|
@@ -157,7 +157,7 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
157
157
|
this.deps.log.error(`Error in CheckpointProver onFailed callback for ${this.id}`, err);
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
-
this.
|
|
160
|
+
this.subTreeProofs.reject(err);
|
|
161
161
|
}
|
|
162
162
|
/** Fetches every tx in this checkpoint from the tx pool (by hash, via the block tx effects). */ async fetchTxs() {
|
|
163
163
|
const deadline = new Date(this.deps.dateProvider.now() + this.deps.txGatheringTimeoutMs);
|
|
@@ -228,9 +228,9 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
228
228
|
checkpointHash: this.checkpoint.hash().toString(),
|
|
229
229
|
blockCount: this.checkpoint.blocks.length
|
|
230
230
|
});
|
|
231
|
-
this.subTree = await this.deps.proverFactory.createCheckpointSubTreeOrchestrator(this.deps.chonkCache, this.epochNumber, checkpointConstants, this.l1ToL2Messages, this.checkpoint.blocks.length, this.previousBlockHeader);
|
|
231
|
+
this.subTree = await this.deps.proverFactory.createCheckpointSubTreeOrchestrator(this.deps.chonkCache, this.epochNumber, checkpointConstants, this.l1ToL2Messages, this.previousInboxRollingHash, this.checkpoint.blocks.length, this.previousBlockHeader);
|
|
232
232
|
subTreeStarted = true;
|
|
233
|
-
// Bridge the sub-tree's result onto
|
|
233
|
+
// Bridge the sub-tree's result onto subTreeProofs.
|
|
234
234
|
void this.subTree.getSubTreeResult().then((result)=>{
|
|
235
235
|
this.deps.log.info(`Sub-tree block proofs ready for checkpoint ${this.checkpoint.number}`, {
|
|
236
236
|
checkpointNumber: this.checkpoint.number,
|
|
@@ -238,16 +238,19 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
238
238
|
});
|
|
239
239
|
// Spans processing + proving (from executeCheckpoint start, after tx gathering) to proofs ready.
|
|
240
240
|
this.deps.metrics.recordCheckpointProving(checkpointTimer.ms());
|
|
241
|
-
this.
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
//
|
|
248
|
-
//
|
|
241
|
+
this.subTreeProofs.resolve({
|
|
242
|
+
blockProofOutputs: result.blockProofOutputs,
|
|
243
|
+
inboxParityProof: result.inboxParityProof
|
|
244
|
+
});
|
|
245
|
+
// Release the sub-tree orchestrator now that its output is captured. The block-proof and
|
|
246
|
+
// InboxParity proofs survive via the resolved promise; everything else the sub-tree held — per-tx
|
|
247
|
+
// AVM inputs, and the base/merge/parity proof trees — is dead once proving completes, yet the
|
|
248
|
+
// prover is retained for the whole proof-submission window. Dropping it here is what stops that
|
|
249
|
+
// retention from accumulating across every proven checkpoint. Post-completion consumers (the
|
|
250
|
+
// top-tree job, a rebuilt EpochSession, failure upload) read only `whenSubTreeProofsReady()` and
|
|
251
|
+
// this prover's own fields (`checkpoint`, `txs`, headers, sibling paths), never the sub-tree.
|
|
249
252
|
this.teardownPromise = this.teardownSubTree();
|
|
250
|
-
}, (err)=>this.
|
|
253
|
+
}, (err)=>this.failSubTreeProofs(err instanceof Error ? err : new Error(String(err))));
|
|
251
254
|
if (signal.aborted) {
|
|
252
255
|
return;
|
|
253
256
|
}
|
|
@@ -259,16 +262,23 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
259
262
|
return;
|
|
260
263
|
}
|
|
261
264
|
}
|
|
265
|
+
// Streaming Inbox: the checkpoint's messages are consumed contiguously across its blocks;
|
|
266
|
+
// each block's slice runs from its parent block's L1-to-L2 leaf count to its own (compact indices make leaf
|
|
267
|
+
// count equal cumulative message count).
|
|
268
|
+
const l1ToL2LeafCount = (block)=>Number(block.header.state.l1ToL2MessageTree.nextAvailableLeafIndex);
|
|
269
|
+
const checkpointStartLeafCount = l1ToL2LeafCount(this.checkpoint.blocks.at(-1)) - this.l1ToL2Messages.length;
|
|
262
270
|
for(let blockIndex = 0; blockIndex < this.checkpoint.blocks.length; blockIndex++){
|
|
263
271
|
const blockTimer = new Timer();
|
|
264
272
|
const block = this.checkpoint.blocks[blockIndex];
|
|
265
273
|
const globalVariables = block.header.globalVariables;
|
|
266
274
|
const blockTxs = this.getTxsForBlock(block, txs);
|
|
267
|
-
|
|
275
|
+
const prevLeafCount = blockIndex === 0 ? checkpointStartLeafCount : l1ToL2LeafCount(this.checkpoint.blocks[blockIndex - 1]);
|
|
276
|
+
const blockMessages = this.l1ToL2Messages.slice(prevLeafCount - checkpointStartLeafCount, l1ToL2LeafCount(block) - checkpointStartLeafCount);
|
|
277
|
+
await this.subTree.startNewBlock(block.number, globalVariables.timestamp, blockTxs.length, blockMessages);
|
|
268
278
|
if (signal.aborted) {
|
|
269
279
|
return;
|
|
270
280
|
}
|
|
271
|
-
const db = await this.createFork(BlockNumber(block.number - 1),
|
|
281
|
+
const db = await this.createFork(BlockNumber(block.number - 1), blockMessages);
|
|
272
282
|
try {
|
|
273
283
|
if (signal.aborted) {
|
|
274
284
|
return;
|
|
@@ -312,7 +322,7 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
312
322
|
if (subTreeStarted) {
|
|
313
323
|
await this.teardownSubTree();
|
|
314
324
|
}
|
|
315
|
-
this.
|
|
325
|
+
this.failSubTreeProofs(new Error(`Checkpoint ${this.id} did not complete block processing`));
|
|
316
326
|
}
|
|
317
327
|
}
|
|
318
328
|
}
|
|
@@ -343,7 +353,7 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
343
353
|
});
|
|
344
354
|
}
|
|
345
355
|
this.abortController.abort();
|
|
346
|
-
this.
|
|
356
|
+
this.subTreeProofs.reject(new Error(`Checkpoint ${this.id} cancelled`));
|
|
347
357
|
this.cancelPromise = this.runCancel().catch(()=>{});
|
|
348
358
|
}
|
|
349
359
|
async runCancel() {
|
|
@@ -396,10 +406,8 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
396
406
|
}
|
|
397
407
|
async createFork(blockNumber, l1ToL2Messages) {
|
|
398
408
|
const db = await this.deps.dbProvider.fork(blockNumber);
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
402
|
-
}
|
|
409
|
+
// Append the block's real message leaves unpadded at compact indices.
|
|
410
|
+
await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2Messages);
|
|
403
411
|
return db;
|
|
404
412
|
}
|
|
405
413
|
}
|
|
@@ -10,9 +10,11 @@ export type EpochProvingJobData = {
|
|
|
10
10
|
txs: Map<string, Tx>;
|
|
11
11
|
l1ToL2Messages: Record<CheckpointNumber, Fr[]>;
|
|
12
12
|
previousBlockHeader: BlockHeader;
|
|
13
|
+
/** Inbox rolling hash of the checkpoint before the epoch's first checkpoint (its chain start); genesis is zero. */
|
|
14
|
+
previousInboxRollingHash: Fr;
|
|
13
15
|
attestations: CommitteeAttestation[];
|
|
14
16
|
};
|
|
15
17
|
export declare function validateEpochProvingJobData(data: EpochProvingJobData): void;
|
|
16
18
|
export declare function serializeEpochProvingJobData(data: EpochProvingJobData): Buffer;
|
|
17
19
|
export declare function deserializeEpochProvingJobData(buf: Buffer): EpochProvingJobData;
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2ItZGF0YS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2pvYi9lcG9jaC1wcm92aW5nLWpvYi1kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsOENBQThDO0FBQzlDLE1BQU0sTUFBTSxtQkFBbUIsR0FBRztJQUNoQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0lBQ3pCLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUMxQixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyQixjQUFjLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO0lBQ2pDLG1IQUFtSDtJQUNuSCx3QkFBd0IsRUFBRSxFQUFFLENBQUM7SUFDN0IsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUM7Q0FDdEMsQ0FBQztBQUVGLHdCQUFnQiwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLFFBa0JwRTtBQUVELHdCQUFnQiw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEdBQUcsTUFBTSxDQXVCOUU7QUFFRCx3QkFBZ0IsOEJBQThCLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxtQkFBbUIsQ0E2Qi9FIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch-proving-job-data.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEnD,8CAA8C;AAC9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,mBAAmB,EAAE,WAAW,CAAC;IACjC,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,mBAAmB,QAkBpE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"epoch-proving-job-data.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEnD,8CAA8C;AAC9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,mBAAmB,EAAE,WAAW,CAAC;IACjC,mHAAmH;IACnH,wBAAwB,EAAE,EAAE,CAAC;IAC7B,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,mBAAmB,QAkBpE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAuB9E;AAED,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CA6B/E"}
|
|
@@ -28,12 +28,13 @@ export function serializeEpochProvingJobData(data) {
|
|
|
28
28
|
...messages
|
|
29
29
|
]);
|
|
30
30
|
const attestations = data.attestations.map((attestation)=>attestation.toBuffer());
|
|
31
|
-
return serializeToBuffer(data.epochNumber, data.previousBlockHeader, checkpoints.length, ...checkpoints, txs.length, ...txs, l1ToL2Messages.length, ...l1ToL2Messages, attestations.length, ...attestations);
|
|
31
|
+
return serializeToBuffer(data.epochNumber, data.previousBlockHeader, data.previousInboxRollingHash, checkpoints.length, ...checkpoints, txs.length, ...txs, l1ToL2Messages.length, ...l1ToL2Messages, attestations.length, ...attestations);
|
|
32
32
|
}
|
|
33
33
|
export function deserializeEpochProvingJobData(buf) {
|
|
34
34
|
const reader = BufferReader.asReader(buf);
|
|
35
35
|
const epochNumber = EpochNumber(reader.readNumber());
|
|
36
36
|
const previousBlockHeader = reader.readObject(BlockHeader);
|
|
37
|
+
const previousInboxRollingHash = Fr.fromBuffer(reader);
|
|
37
38
|
const checkpoints = reader.readVector(Checkpoint);
|
|
38
39
|
const txArray = reader.readVector(Tx);
|
|
39
40
|
const l1ToL2MessageCheckpointCount = reader.readNumber();
|
|
@@ -51,6 +52,7 @@ export function deserializeEpochProvingJobData(buf) {
|
|
|
51
52
|
return {
|
|
52
53
|
epochNumber,
|
|
53
54
|
previousBlockHeader,
|
|
55
|
+
previousInboxRollingHash,
|
|
54
56
|
checkpoints,
|
|
55
57
|
txs,
|
|
56
58
|
l1ToL2Messages,
|
|
@@ -31,7 +31,7 @@ export type TopTreeJobHooks = {
|
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
33
|
* Self-contained top-tree job. Constructed from a snapshot of `CheckpointProver`s; runs
|
|
34
|
-
* `topTree.prove(...)` against their pending `
|
|
34
|
+
* `topTree.prove(...)` against their pending `subTreeProofs` promises and exposes the
|
|
35
35
|
* final epoch proof via `result`.
|
|
36
36
|
*
|
|
37
37
|
*/
|
package/dest/job/top-tree-job.js
CHANGED
|
@@ -4,7 +4,7 @@ import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
|
|
|
4
4
|
import { TopTreeCancelledError } from '@aztec/prover-client/orchestrator';
|
|
5
5
|
/**
|
|
6
6
|
* Self-contained top-tree job. Constructed from a snapshot of `CheckpointProver`s; runs
|
|
7
|
-
* `topTree.prove(...)` against their pending `
|
|
7
|
+
* `topTree.prove(...)` against their pending `subTreeProofs` promises and exposes the
|
|
8
8
|
* final epoch proof via `result`.
|
|
9
9
|
*
|
|
10
10
|
*/ export class TopTreeJob {
|
|
@@ -119,7 +119,7 @@ import { TopTreeCancelledError } from '@aztec/prover-client/orchestrator';
|
|
|
119
119
|
durationMs: blobTimer.ms()
|
|
120
120
|
});
|
|
121
121
|
const checkpointData = this.snapshot.map((j)=>({
|
|
122
|
-
|
|
122
|
+
subTreeProofs: j.whenSubTreeProofsReady(),
|
|
123
123
|
l2ToL1MsgsPerBlock: j.checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs)),
|
|
124
124
|
blobFields: j.checkpoint.toBlobFields(),
|
|
125
125
|
previousBlockHeader: j.previousBlockHeader,
|
|
@@ -68,4 +68,4 @@ export declare class ProverNodePublisher {
|
|
|
68
68
|
private getEpochProofPublicInputsArgs;
|
|
69
69
|
private getSubmitEpochProofArgs;
|
|
70
70
|
}
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUtcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFFMUUsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR3ZGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJGLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUduRixPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQXdFLE1BQU0sTUFBTSxDQUFDO0FBSXRHLHNFQUFzRTtBQUN0RSxNQUFNLE1BQU0sc0JBQXNCLEdBQUc7SUFDbkMsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixlQUFlLEVBQUUsRUFBRSxDQUFDO0lBQ3BCLFVBQVUsRUFBRSxFQUFFLENBQUM7SUFDZixZQUFZLEVBQUUsRUFBRSxDQUFDO0lBQ2pCLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDWixRQUFRLEVBQUUsRUFBRSxDQUFDO0lBQ2IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsS0FBSyxFQUFFLEtBQUssQ0FBQztDQUNkLENBQUM7QUFFRixxQkFBYSxtQkFBbUI7SUFDOUIsT0FBTyxDQUFDLE9BQU8sQ0FBNkI7SUFFNUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7SUFFdEIsU0FBUyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUM7SUFFekMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQztJQUVyQyxTQUFnQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBRXJDLFlBQ0UsTUFBTSxFQUFFLGNBQWMsR0FBRyxlQUFlLEVBQ3hDLElBQUksRUFBRTtRQUNKLGNBQWMsRUFBRSxjQUFjLENBQUM7UUFDL0IsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNyQixxQkFBcUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQztRQUNuQyxTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7S0FDN0IsRUFDRCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBVTFCO0lBRU0saUJBQWlCLG1CQUV2QjtJQUVNLGdCQUFnQixlQUV0QjtJQUVZLGdCQUFnQixDQUFDLElBQUksRUFBRTtRQUNsQyxXQUFXLEVBQUUsV0FBVyxDQUFDO1FBQ3pCLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQztRQUNqQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0IsWUFBWSxFQUFFLHNCQUFzQixDQUFDO1FBQ3JDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDYixpQkFBaUIsRUFBRSxXQUFXLENBQUM7UUFDL0IsWUFBWSxFQUFFLHdCQUF3QixFQUFFLENBQUM7UUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsbUdBQW1HO1FBQ25HLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQztLQUNqQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0E2Q25CO1lBRWEsNEJBQTRCO0lBb0UxQzs7OztPQUlHO0lBQ1UsMkJBQTJCLENBQUMsSUFBSSxFQUFFO1FBQzdDLFdBQVcsRUFBRSxXQUFXLENBQUM7UUFDekIsY0FBYyxFQUFFLGdCQUFnQixDQUFDO1FBQ2pDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQztRQUMvQixZQUFZLEVBQUUsc0JBQXNCLENBQUM7UUFDckMsS0FBSyxFQUFFLEtBQUssQ0FBQztRQUNiLGlCQUFpQixFQUFFLFdBQVcsQ0FBQztRQUMvQixZQUFZLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztRQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztLQUM3QixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FzQ2hCO0lBRUQsT0FBTyxDQUFDLDhCQUE4QjtZQWdCeEIsc0JBQXNCO0lBaURwQyxPQUFPLENBQUMsNkJBQTZCO0lBeUJyQyxPQUFPLENBQUMsdUJBQXVCO0NBd0JoQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,iBAAiB,CAAC;AAE1E,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAGvF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAErF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,EAAE,KAAK,GAAG,EAAwE,MAAM,MAAM,CAAC;AAItG,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAS,CAAC,qBAAqB,EAAE,GAAG,CAAC;IAErC,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,YACE,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACJ,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,SAAS,CAAC;QACrB,qBAAqB,CAAC,EAAE,UAAU,CAAC;QACnC,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B,EACD,QAAQ,CAAC,EAAE,cAAc,EAU1B;IAEM,iBAAiB,mBAEvB;IAEM,gBAAgB,eAEtB;IAEY,gBAAgB,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,EAAE,gBAAgB,CAAC;QACjC,YAAY,EAAE,gBAAgB,CAAC;QAC/B,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;QACzC,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC5B,mGAAmG;QACnG,QAAQ,CAAC,EAAE,IAAI,CAAC;KACjB,GAAG,OAAO,CAAC,OAAO,CAAC,CA6CnB;YAEa,4BAA4B;IAoE1C;;;;OAIG;IACU,2BAA2B,CAAC,IAAI,EAAE;QAC7C,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,EAAE,gBAAgB,CAAC;QACjC,YAAY,EAAE,gBAAgB,CAAC;QAC/B,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;QACzC,OAAO,EAAE,gBAAgB,EAAE,CAAC;KAC7B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsChB;IAED,OAAO,CAAC,8BAA8B;YAgBxB,sBAAsB;IAiDpC,OAAO,CAAC,6BAA6B;
|
|
1
|
+
{"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -129,18 +129,18 @@ export class ProverNodePublisher {
|
|
|
129
129
|
await this.validateEpochProofSubmission(args);
|
|
130
130
|
const data = this.encodeSubmitEpochProofCalldata(args);
|
|
131
131
|
const senderAddress = this.l1TxUtils.getSenderAddress();
|
|
132
|
-
const [gasLimit,
|
|
132
|
+
const [gasLimit, feesPerGas, latestBlock] = await Promise.all([
|
|
133
133
|
this.l1TxUtils.estimateGas(senderAddress.toString(), {
|
|
134
134
|
to: this.proofSubmissionTarget,
|
|
135
135
|
data
|
|
136
136
|
}),
|
|
137
|
-
this.l1TxUtils.
|
|
137
|
+
this.l1TxUtils.getFeesPerGas(),
|
|
138
138
|
this.l1TxUtils.client.getBlock({
|
|
139
139
|
blockTag: 'latest'
|
|
140
140
|
})
|
|
141
141
|
]);
|
|
142
142
|
const baseFeePerGas = latestBlock.baseFeePerGas ?? 0n;
|
|
143
|
-
const { maxPriorityFeePerGas } =
|
|
143
|
+
const { maxPriorityFeePerGas } = feesPerGas;
|
|
144
144
|
const effectiveFeePerGas = baseFeePerGas + maxPriorityFeePerGas;
|
|
145
145
|
const estimatedTotalFee = gasLimit * effectiveFeePerGas;
|
|
146
146
|
const stats = {
|
|
@@ -217,6 +217,8 @@ export class ProverNodePublisher {
|
|
|
217
217
|
previousArchive: args.publicInputs.previousArchiveRoot.toString(),
|
|
218
218
|
endArchive: args.publicInputs.endArchiveRoot.toString(),
|
|
219
219
|
outHash: args.publicInputs.outHash.toString(),
|
|
220
|
+
previousInboxRollingHash: args.publicInputs.previousInboxRollingHash.toString(),
|
|
221
|
+
endInboxRollingHash: args.publicInputs.endInboxRollingHash.toString(),
|
|
220
222
|
proverId: EthAddress.fromField(args.publicInputs.constants.proverId).toString()
|
|
221
223
|
} /*_args*/ ,
|
|
222
224
|
args.headers.map((header)=>header.toViem()),
|
|
@@ -247,14 +249,17 @@ export class ProverNodePublisher {
|
|
|
247
249
|
* [0] previousArchiveRoot
|
|
248
250
|
* [1] endArchiveRoot
|
|
249
251
|
* [2] outHash
|
|
250
|
-
* [3
|
|
251
|
-
* [
|
|
252
|
-
* [
|
|
253
|
-
* [
|
|
252
|
+
* [3] previousInboxRollingHash
|
|
253
|
+
* [4] endInboxRollingHash
|
|
254
|
+
* [5 .. 5+N-1] checkpointHeaderHashes[i] for i in 0..N-1 (N = MAX_CHECKPOINTS_PER_EPOCH)
|
|
255
|
+
* [5+N .. 5+3N-1] fees[i] = (recipient, value) for i in 0..N-1
|
|
256
|
+
* [5+3N .. 5+3N+4] EpochConstantData (chainId, version, vkTreeRoot, protocolContractsHash, proverId)
|
|
257
|
+
* [5+3N+5 ..] blobPublicInputs (FinalBlobAccumulator)
|
|
254
258
|
*/ async function reportPublicInputsMismatch(input) {
|
|
255
259
|
const { rollupPublicInputs, argsPublicInputs, fromCheckpoint, toCheckpoint, rollupContract, log } = input;
|
|
256
260
|
const N = MAX_CHECKPOINTS_PER_EPOCH;
|
|
257
|
-
const
|
|
261
|
+
const headerHashesStart = 5;
|
|
262
|
+
const constantsStart = headerHashesStart + 3 * N;
|
|
258
263
|
const blobStart = constantsStart + 5;
|
|
259
264
|
const constantLabels = [
|
|
260
265
|
'chainId',
|
|
@@ -279,11 +284,15 @@ export class ProverNodePublisher {
|
|
|
279
284
|
label = 'endArchiveRoot';
|
|
280
285
|
} else if (i === 2) {
|
|
281
286
|
label = 'outHash';
|
|
282
|
-
} else if (i
|
|
283
|
-
|
|
287
|
+
} else if (i === 3) {
|
|
288
|
+
label = 'previousInboxRollingHash';
|
|
289
|
+
} else if (i === 4) {
|
|
290
|
+
label = 'endInboxRollingHash';
|
|
291
|
+
} else if (i < headerHashesStart + N) {
|
|
292
|
+
checkpointIndex = i - headerHashesStart;
|
|
284
293
|
label = `checkpointHeaderHashes[${checkpointIndex}]`;
|
|
285
|
-
} else if (i <
|
|
286
|
-
const feePairIndex = i - (
|
|
294
|
+
} else if (i < headerHashesStart + 3 * N) {
|
|
295
|
+
const feePairIndex = i - (headerHashesStart + N);
|
|
287
296
|
const feeIndex = Math.floor(feePairIndex / 2);
|
|
288
297
|
const sub = feePairIndex % 2 === 0 ? 'recipient' : 'value';
|
|
289
298
|
label = `fees[${feeIndex}].${sub}`;
|
package/dest/prover-node.d.ts
CHANGED
|
@@ -105,6 +105,7 @@ export declare class ProverNode implements L2BlockStreamEventHandler, ProverNode
|
|
|
105
105
|
private processCheckpointJump;
|
|
106
106
|
private registerCheckpoint;
|
|
107
107
|
private collectRegisterData;
|
|
108
|
+
private gatherPreviousInboxRollingHash;
|
|
108
109
|
private handlePruneEvent;
|
|
109
110
|
private isEpochPastProofSubmissionWindow;
|
|
110
111
|
private checkEpochExpiry;
|
|
@@ -181,4 +182,4 @@ export declare class ProverNode implements L2BlockStreamEventHandler, ProverNode
|
|
|
181
182
|
private validateConfig;
|
|
182
183
|
}
|
|
183
184
|
export { EpochProvingJobTerminalState };
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92ZXItbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTdGLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFDdkUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDL0QsT0FBTyxFQUFFLEtBQUssWUFBWSxFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFHTCxLQUFLLGFBQWEsRUFDbEIsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyx5QkFBeUIsRUFFL0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQXVCLE1BQU0sMEJBQTBCLENBQUM7QUFDaEYsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBbUQsTUFBTSw2QkFBNkIsQ0FBQztBQUN0SCxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyxvQkFBb0IsRUFDekIsNEJBQTRCLEVBQzVCLEtBQUssV0FBVyxFQUNoQixLQUFLLGFBQWEsRUFDbEIsS0FBSyxPQUFPLEVBQ1osS0FBSyxzQkFBc0IsRUFFNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFP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
|