@aztec/prover-node 6.0.0-nightly.20260728 → 6.0.0-nightly.20260730
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/job/checkpoint-prover.d.ts +14 -3
- package/dest/job/checkpoint-prover.d.ts.map +1 -1
- package/dest/job/checkpoint-prover.js +54 -12
- package/dest/prover-node.js +2 -2
- package/dest/session-manager.d.ts +2 -2
- package/dest/session-manager.d.ts.map +1 -1
- package/dest/session-manager.js +9 -3
- package/package.json +24 -24
- package/src/job/checkpoint-prover.ts +53 -11
- package/src/prover-node.ts +2 -2
- package/src/session-manager.ts +6 -3
|
@@ -87,8 +87,6 @@ export declare class CheckpointProver {
|
|
|
87
87
|
readonly previousBlockHeader: BlockHeader;
|
|
88
88
|
readonly l1ToL2Messages: Fr[];
|
|
89
89
|
readonly previousArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>;
|
|
90
|
-
/** Per-prover tx map — populated by the internal gather. Empty until then. */
|
|
91
|
-
readonly txs: Map<string, Tx>;
|
|
92
90
|
/** Resolved by the sub-tree on success, rejected on cancel/failure. */
|
|
93
91
|
private readonly blockProofs;
|
|
94
92
|
/** Block-level proving was fully *enqueued* (a progress marker; the sub-tree may still be proving). */
|
|
@@ -103,6 +101,8 @@ export declare class CheckpointProver {
|
|
|
103
101
|
private readonly runPromise;
|
|
104
102
|
/** Tracks the cancel-driven teardown so `whenDone()` can await it. */
|
|
105
103
|
private cancelPromise?;
|
|
104
|
+
/** Tracks the success-driven sub-tree teardown (once block proofs are captured) so `whenDone()` can await it. */
|
|
105
|
+
private teardownPromise?;
|
|
106
106
|
constructor(args: CheckpointProverArgs, deps: CheckpointProverDeps);
|
|
107
107
|
/**
|
|
108
108
|
* Stable content-addressed identifier: `${checkpoint number}:${slot}:${archive root}`.
|
|
@@ -131,7 +131,18 @@ export declare class CheckpointProver {
|
|
|
131
131
|
* (e.g. the executeCheckpoint `finally`) is a harmless no-op.
|
|
132
132
|
*/
|
|
133
133
|
private failBlockProofs;
|
|
134
|
+
private fetchTxs;
|
|
134
135
|
private gatherTxs;
|
|
136
|
+
/**
|
|
137
|
+
* Re-fetches this checkpoint's txs from the tx pool for a post-mortem failure upload.
|
|
138
|
+
*
|
|
139
|
+
* The prover does not cache txs on the heap — they are consumed during proving and dropped — so the
|
|
140
|
+
* durable pool (which keeps a mined tx until L1 finality, with A-1274's retention margin covering a
|
|
141
|
+
* lagging prover) is the source of truth, read back by hash here. Best-effort: any tx the pool can
|
|
142
|
+
* no longer supply is logged and omitted rather than failing the upload, since a partial post-mortem
|
|
143
|
+
* snapshot is still useful for diagnosis.
|
|
144
|
+
*/
|
|
145
|
+
getTxsForUpload(): Promise<Map<string, Tx>>;
|
|
135
146
|
private executeCheckpoint;
|
|
136
147
|
/**
|
|
137
148
|
* Mark cancelled. Idempotent. Aborts in-flight work, rejects the block-proof promise,
|
|
@@ -151,4 +162,4 @@ export declare class CheckpointProver {
|
|
|
151
162
|
private processTxs;
|
|
152
163
|
private createFork;
|
|
153
164
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludC1wcm92ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qb2IvY2hlY2twb2ludC1wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUF1QyxNQUFNLGtCQUFrQixDQUFDO0FBQzVGLE9BQU8sRUFBZSxLQUFLLFdBQVcsRUFBRSxLQUFLLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWpHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVMsTUFBTSx5QkFBeUIsQ0FBQztBQUduRSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFpQyxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEgsT0FBTyxLQUFLLEVBQW1CLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkYsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQVcsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUc3RixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQWUsRUFBRSxFQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFFN0UsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENB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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,KAAK,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEjG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAGnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAiC,UAAU,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClH,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAE,oBAAoB,EAAW,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG7F,OAAO,KAAK,EAAE,WAAW,EAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"checkpoint-prover.d.ts","sourceRoot":"","sources":["../../src/job/checkpoint-prover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEjG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAGnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAiC,UAAU,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClH,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAE,oBAAoB,EAAW,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG7F,OAAO,KAAK,EAAE,WAAW,EAAe,EAAE,EAAU,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,+DAA+D;AAC/D,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,kBAAkB,CAAC;IAClC,0EAA0E;IAC1E,UAAU,EAAE,UAAU,CAAC;IACvB,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;IACnD,UAAU,EAAE,WAAW,CAAC;IACxB,6FAA2F;IAC3F,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,6BAA6B;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iCAAiC;IACjC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/C,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qFAAqF;AACrF,MAAM,MAAM,yBAAyB,GAAG;IACtC,qGAAqG;IACrG,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;CAChD,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,qGAAqG;IACrG,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,mBAAmB,EAAE,WAAW,CAAC;IACjC,cAAc,EAAE,EAAE,EAAE,CAAC;IACrB,0BAA0B,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,cAAc,CAAC,CAAC;CAC9D,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,gBAAgB;IAoCzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAnCvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,EAAE,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC;IAC9B,QAAQ,CAAC,0BAA0B,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,cAAc,CAAC,CAAC;IAEtE,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoF;IAOhH,uGAAuG;IACvG,OAAO,CAAC,SAAS,CAAS;IAC1B,0GAAwG;IACxG,OAAO,CAAC,MAAM,CAAS;IACvB,0DAA0D;IAC1D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAgC;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,sEAAsE;IACtE,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,iHAAiH;IACjH,OAAO,CAAC,eAAe,CAAC,CAAgB;IAExC,YACE,IAAI,EAAE,oBAAoB,EACT,IAAI,EAAE,oBAAoB,EAuB5C;IAED;;;;OAIG;IACH,OAAc,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAElD;IAEM,WAAW,IAAI,OAAO,CAE5B;IAED;;;;;OAKG;IACI,QAAQ,IAAI,OAAO,CAEzB;IAED,0FAAwF;IACjF,cAAc,IAAI,WAAW,CAEnC;IAED,6GAA6G;IACtG,oBAAoB,IAAI,OAAO,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAEzE;IAED,0EAA0E;IAC7D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAerC;YAEa,gBAAgB;IAqB9B;;;;OAIG;IACH,OAAO,CAAC,eAAe;YAeT,QAAQ;YAUR,SAAS;IAUvB;;;;;;;;OAQG;IACU,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CASvD;YAEa,iBAAiB;IAmJ/B;;;;;;;;OAQG;IACI,MAAM,CAAC,EAAE,OAAe,EAAE,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI,CAqBnE;YAEa,SAAS;YAcT,eAAe;IAe7B,OAAO,CAAC,cAAc;YAIR,UAAU;YA0BV,UAAU;CAezB"}
|
|
@@ -39,7 +39,6 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
39
39
|
previousBlockHeader;
|
|
40
40
|
l1ToL2Messages;
|
|
41
41
|
previousArchiveSiblingPath;
|
|
42
|
-
/** Per-prover tx map — populated by the internal gather. Empty until then. */ txs;
|
|
43
42
|
/** Resolved by the sub-tree on success, rejected on cancel/failure. */ blockProofs;
|
|
44
43
|
// Three independent lifecycle facts — deliberately not collapsed into one status enum, because several
|
|
45
44
|
// combinations are legal and relied on: a prover can be `completed` and then `cancelled` (routine
|
|
@@ -53,9 +52,9 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
53
52
|
abortController;
|
|
54
53
|
/** Tracks the eager gather+execute task so `cancel()` and `whenDone()` can await its unwind. */ runPromise;
|
|
55
54
|
/** Tracks the cancel-driven teardown so `whenDone()` can await it. */ cancelPromise;
|
|
55
|
+
/** Tracks the success-driven sub-tree teardown (once block proofs are captured) so `whenDone()` can await it. */ teardownPromise;
|
|
56
56
|
constructor(args, deps){
|
|
57
57
|
this.deps = deps;
|
|
58
|
-
this.txs = new Map();
|
|
59
58
|
this.blockProofs = promiseWithResolvers();
|
|
60
59
|
this.completed = false;
|
|
61
60
|
this.failed = false;
|
|
@@ -109,9 +108,19 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
109
108
|
}
|
|
110
109
|
/** Resolves when all in-flight work for this prover has fully unwound. */ async whenDone() {
|
|
111
110
|
await this.runPromise.catch(()=>{});
|
|
111
|
+
// `runPromise` resolves once block-level proving is *enqueued*, but the sub-tree's proofs (and the
|
|
112
|
+
// success-driven teardown they trigger) land later, on the `getSubTreeResult()` callback. Awaiting
|
|
113
|
+
// `blockProofs` here bridges that gap: on success the callback resolves `blockProofs` and then
|
|
114
|
+
// synchronously sets `teardownPromise` before this await resumes, so the teardown is observable
|
|
115
|
+
// below; on failure/cancel `blockProofs` rejects and teardown is driven by the `finally`/cancel
|
|
116
|
+
// paths already awaited via `runPromise`/`cancelPromise`.
|
|
117
|
+
await this.blockProofs.promise.catch(()=>{});
|
|
112
118
|
if (this.cancelPromise) {
|
|
113
119
|
await this.cancelPromise;
|
|
114
120
|
}
|
|
121
|
+
if (this.teardownPromise) {
|
|
122
|
+
await this.teardownPromise;
|
|
123
|
+
}
|
|
115
124
|
}
|
|
116
125
|
async gatherAndExecute() {
|
|
117
126
|
try {
|
|
@@ -150,20 +159,45 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
150
159
|
}
|
|
151
160
|
this.blockProofs.reject(err);
|
|
152
161
|
}
|
|
153
|
-
async
|
|
162
|
+
/** Fetches every tx in this checkpoint from the tx pool (by hash, via the block tx effects). */ async fetchTxs() {
|
|
154
163
|
const deadline = new Date(this.deps.dateProvider.now() + this.deps.txGatheringTimeoutMs);
|
|
155
164
|
const txsByBlock = await Promise.all(this.checkpoint.blocks.map((block)=>this.deps.txProvider.getTxsForBlock(block, {
|
|
156
165
|
deadline
|
|
157
166
|
})));
|
|
158
|
-
const txs = txsByBlock.
|
|
159
|
-
const missingTxs = txsByBlock.
|
|
167
|
+
const txs = txsByBlock.flatMap(({ txs })=>txs);
|
|
168
|
+
const missingTxs = txsByBlock.flatMap(({ missingTxs })=>missingTxs);
|
|
169
|
+
return {
|
|
170
|
+
txs: new Map(txs.map((tx)=>[
|
|
171
|
+
tx.getTxHash().toString(),
|
|
172
|
+
tx
|
|
173
|
+
])),
|
|
174
|
+
missingTxs
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
async gatherTxs() {
|
|
178
|
+
const { txs, missingTxs } = await this.fetchTxs();
|
|
160
179
|
if (missingTxs.length > 0) {
|
|
161
180
|
throw new Error(`Txs not found for checkpoint ${this.checkpoint.number}: ${missingTxs.map((hash)=>hash.toString()).join(', ')}`);
|
|
162
181
|
}
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
182
|
+
return txs;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Re-fetches this checkpoint's txs from the tx pool for a post-mortem failure upload.
|
|
186
|
+
*
|
|
187
|
+
* The prover does not cache txs on the heap — they are consumed during proving and dropped — so the
|
|
188
|
+
* durable pool (which keeps a mined tx until L1 finality, with A-1274's retention margin covering a
|
|
189
|
+
* lagging prover) is the source of truth, read back by hash here. Best-effort: any tx the pool can
|
|
190
|
+
* no longer supply is logged and omitted rather than failing the upload, since a partial post-mortem
|
|
191
|
+
* snapshot is still useful for diagnosis.
|
|
192
|
+
*/ async getTxsForUpload() {
|
|
193
|
+
const { txs, missingTxs } = await this.fetchTxs();
|
|
194
|
+
if (missingTxs.length > 0) {
|
|
195
|
+
this.deps.log.warn(`Missing ${missingTxs.length} tx(s) re-fetching checkpoint ${this.checkpoint.number} for failure upload`, {
|
|
196
|
+
checkpointNumber: this.checkpoint.number,
|
|
197
|
+
missingTxCount: missingTxs.length
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return txs;
|
|
167
201
|
}
|
|
168
202
|
async executeCheckpoint(txs) {
|
|
169
203
|
const signal = this.abortController.signal;
|
|
@@ -174,9 +208,9 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
174
208
|
if (this.deps.checkpointProveOverride) {
|
|
175
209
|
await this.deps.checkpointProveOverride();
|
|
176
210
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
211
|
+
// The gathered txs are consumed locally below (public processing + sub-tree) and then dropped.
|
|
212
|
+
// They are deliberately not retained on the instance: the tx pool is the durable source and
|
|
213
|
+
// `getTxsForUpload` re-fetches them by hash if a post-mortem upload needs them.
|
|
180
214
|
const { chainId, version } = this.checkpoint.blocks[0].header.globalVariables;
|
|
181
215
|
const checkpointConstants = CheckpointConstantData.from({
|
|
182
216
|
chainId,
|
|
@@ -205,6 +239,14 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
205
239
|
// Spans processing + proving (from executeCheckpoint start, after tx gathering) to proofs ready.
|
|
206
240
|
this.deps.metrics.recordCheckpointProving(checkpointTimer.ms());
|
|
207
241
|
this.blockProofs.resolve(result.blockProofOutputs);
|
|
242
|
+
// Release the sub-tree orchestrator now that its output is captured. The block-proof outputs
|
|
243
|
+
// survive via the resolved promise; everything else the sub-tree held — per-tx AVM inputs, and
|
|
244
|
+
// the base/merge/parity proof trees — is dead once proving completes, yet the prover is retained
|
|
245
|
+
// for the whole proof-submission window. Dropping it here is what stops that retention from
|
|
246
|
+
// accumulating across every proven checkpoint. Post-completion consumers (the top-tree job, a
|
|
247
|
+
// rebuilt EpochSession, failure upload) read only `whenBlockProofsReady()` and this prover's own
|
|
248
|
+
// fields (`checkpoint`, `txs`, headers, sibling paths), never the sub-tree.
|
|
249
|
+
this.teardownPromise = this.teardownSubTree();
|
|
208
250
|
}, (err)=>this.failBlockProofs(err instanceof Error ? err : new Error(String(err))));
|
|
209
251
|
if (signal.aborted) {
|
|
210
252
|
return;
|
package/dest/prover-node.js
CHANGED
|
@@ -879,7 +879,7 @@ import { SessionManager } from './session-manager.js';
|
|
|
879
879
|
if (!this.config.proverNodeFailedEpochStore || checkpoints.length === 0) {
|
|
880
880
|
return undefined;
|
|
881
881
|
}
|
|
882
|
-
const data = SessionManager.buildProvingData(checkpoints);
|
|
882
|
+
const data = await SessionManager.buildProvingData(checkpoints);
|
|
883
883
|
return await uploadEpochProofFailure(this.config.proverNodeFailedEpochStore, // The session's own id; `uploadEpochProofFailure` already prefixes the path with the epoch number.
|
|
884
884
|
id, data, this.l2BlockSource, this.worldState, assertRequired(pick(this.config, 'l1ChainId', 'rollupVersion', 'dataDirectory')), this.log);
|
|
885
885
|
}
|
|
@@ -905,7 +905,7 @@ import { SessionManager } from './session-manager.js';
|
|
|
905
905
|
});
|
|
906
906
|
return undefined;
|
|
907
907
|
}
|
|
908
|
-
const data = SessionManager.buildProvingData([
|
|
908
|
+
const data = await SessionManager.buildProvingData([
|
|
909
909
|
prover
|
|
910
910
|
]);
|
|
911
911
|
return await uploadEpochProofFailure(this.config.proverNodeFailedEpochStore, // The prover's content-addressed id; the epoch number is already in the upload path.
|
|
@@ -138,7 +138,7 @@ export declare class SessionManager {
|
|
|
138
138
|
* checkpoint provers. Includes every checkpoint regardless of whether sub-tree proving
|
|
139
139
|
* completed — partial state is still useful for post-mortem analysis.
|
|
140
140
|
*/
|
|
141
|
-
static buildProvingData(checkpoints: readonly CheckpointProver[]): EpochProvingJobData
|
|
141
|
+
static buildProvingData(checkpoints: readonly CheckpointProver[]): Promise<EpochProvingJobData>;
|
|
142
142
|
private atMaxSessionLimit;
|
|
143
143
|
private epochsForTrigger;
|
|
144
144
|
private nextUnprovenEpoch;
|
|
@@ -155,4 +155,4 @@ export declare class SessionManager {
|
|
|
155
155
|
private isProvenChainEncompassing;
|
|
156
156
|
private getL1Constants;
|
|
157
157
|
}
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2Vzc2lvbi1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxLQUFLLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUd2RixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBUXpELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFNUUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsWUFBWSxFQUNaLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUssaUJBQWlCLEVBRXRCLEtBQUssV0FBVyxFQUVqQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUUsdUNBQXVDO0FBQ3ZDLE1BQU0sTUFBTSxnQkFBZ0IsR0FDeEI7SUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDO0lBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQTtDQUFFLEdBQzFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAGvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,uCAAuC;AACvC,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,WAAW,EAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE/C,kDAAkD;AAClD,MAAM,MAAM,oBAAoB,GAAG;IACjC,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,IAAI,CACjB,aAAa,EACb,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,CAC5F,CAAC;IACF,aAAa,EAAE,kBAAkB,CAAC;IAClC,QAAQ,EAAE,UAAU,CAAC;IACrB,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,OAAO,EAAE,oBAAoB,CAAC;IAC9B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC;IAC7B;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,cAAc;IAkBb,OAAO,CAAC,QAAQ,CAAC,IAAI;IAjBjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAC1E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IACxE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,oDAAoD;IACpD,OAAO,CAAC,iBAAiB,CAAgC;IACzD,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAAgC;IACpD,kGAAkG;IAClG,OAAO,CAAC,WAAW,CAA6B;IAEhD,YAA6B,IAAI,EAAE,kBAAkB,EAGpD;IAED;;;OAGG;IACI,KAAK,IAAI,IAAI,CAMnB;IAED;;;;OAIG;IACI,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAErD;IAID,yCAAyC;IAClC,WAAW,IAAI,YAAY,EAAE,CAEnC;IAED,oDAAoD;IAC7C,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAElE;IAED,sDAAsD;IAC/C,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAEpE;IAED,yDAAyD;IAClD,OAAO,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAC;QAAC,WAAW,EAAE,WAAW,CAAA;KAAE,EAAE,CAM3F;IAID,yFAAyF;IAClF,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;IAED,2FAA2F;IACpF,OAAO,CAAC,cAAc,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAED;;;;OAIG;IACI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;IAID;;;;;;OAMG;IACU,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC3D;IAED,kFAAkF;IACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAOjC;IAID,OAAO,CAAC,iBAAiB;YAIX,SAAS;IAevB,OAAO,CAAC,uBAAuB;IAkD/B,4GAA4G;IAC5G,OAAO,CAAC,YAAY;YAIN,sBAAsB;IAyCpC,OAAO,CAAC,kBAAkB;IA2B1B,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,YAAY,CAEpG;IAED,mCAAmC;IACnC,SAAS,CAAC,kBAAkB,CAC1B,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,SAAS,gBAAgB,EAAE,EACxC,WAAW,EAAE,gBAAgB,EAC7B,KAAK,CAAC,EAAE,iBAAiB,GACxB,YAAY,CAEd;IAED,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,eAAe;YAQT,UAAU;IAwBxB;;;;OAIG;IACH,OAAoB,gBAAgB,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuB3G;IAID,OAAO,CAAC,iBAAiB;YAmBX,gBAAgB;YAqBhB,iBAAiB;IAU/B,OAAO,CAAC,kBAAkB;IAI1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,oBAAoB;YAkBd,yBAAyB;YAUzB,cAAc;CAM7B"}
|
package/dest/session-manager.js
CHANGED
|
@@ -341,14 +341,20 @@ import { EpochSession, specKey } from './job/epoch-session.js';
|
|
|
341
341
|
* Builds the EpochProvingJobData snapshot for a post-mortem failure upload from a set of
|
|
342
342
|
* checkpoint provers. Includes every checkpoint regardless of whether sub-tree proving
|
|
343
343
|
* completed — partial state is still useful for post-mortem analysis.
|
|
344
|
-
*/ static buildProvingData(checkpoints) {
|
|
344
|
+
*/ static async buildProvingData(checkpoints) {
|
|
345
345
|
if (checkpoints.length === 0) {
|
|
346
346
|
throw new Error('Cannot build proving data from an empty checkpoint set');
|
|
347
347
|
}
|
|
348
|
+
// Provers no longer cache their txs; re-fetch each checkpoint's txs from the tx pool (concurrently)
|
|
349
|
+
// for the snapshot. The pool retains them past the proving window (A-1274), so this is durable.
|
|
350
|
+
const perCheckpoint = await Promise.all(checkpoints.map(async (c)=>({
|
|
351
|
+
c,
|
|
352
|
+
txs: await c.getTxsForUpload()
|
|
353
|
+
})));
|
|
348
354
|
const txs = new Map();
|
|
349
355
|
const l1ToL2Messages = {};
|
|
350
|
-
for (const c of
|
|
351
|
-
for (const [hash, tx] of
|
|
356
|
+
for (const { c, txs: checkpointTxs } of perCheckpoint){
|
|
357
|
+
for (const [hash, tx] of checkpointTxs){
|
|
352
358
|
txs.set(hash, tx);
|
|
353
359
|
}
|
|
354
360
|
l1ToL2Messages[c.checkpoint.number] = c.l1ToL2Messages;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "6.0.0-nightly.
|
|
3
|
+
"version": "6.0.0-nightly.20260730",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,29 +56,29 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/archiver": "6.0.0-nightly.
|
|
60
|
-
"@aztec/bb-prover": "6.0.0-nightly.
|
|
61
|
-
"@aztec/bb.js": "6.0.0-nightly.
|
|
62
|
-
"@aztec/blob-client": "6.0.0-nightly.
|
|
63
|
-
"@aztec/blob-lib": "6.0.0-nightly.
|
|
64
|
-
"@aztec/constants": "6.0.0-nightly.
|
|
65
|
-
"@aztec/epoch-cache": "6.0.0-nightly.
|
|
66
|
-
"@aztec/ethereum": "6.0.0-nightly.
|
|
67
|
-
"@aztec/foundation": "6.0.0-nightly.
|
|
68
|
-
"@aztec/kv-store": "6.0.0-nightly.
|
|
69
|
-
"@aztec/l1-artifacts": "6.0.0-nightly.
|
|
70
|
-
"@aztec/native": "6.0.0-nightly.
|
|
71
|
-
"@aztec/node-keystore": "6.0.0-nightly.
|
|
72
|
-
"@aztec/node-lib": "6.0.0-nightly.
|
|
73
|
-
"@aztec/noir-protocol-circuits-types": "6.0.0-nightly.
|
|
74
|
-
"@aztec/p2p": "6.0.0-nightly.
|
|
75
|
-
"@aztec/protocol-contracts": "6.0.0-nightly.
|
|
76
|
-
"@aztec/prover-client": "6.0.0-nightly.
|
|
77
|
-
"@aztec/sequencer-client": "6.0.0-nightly.
|
|
78
|
-
"@aztec/simulator": "6.0.0-nightly.
|
|
79
|
-
"@aztec/stdlib": "6.0.0-nightly.
|
|
80
|
-
"@aztec/telemetry-client": "6.0.0-nightly.
|
|
81
|
-
"@aztec/world-state": "6.0.0-nightly.
|
|
59
|
+
"@aztec/archiver": "6.0.0-nightly.20260730",
|
|
60
|
+
"@aztec/bb-prover": "6.0.0-nightly.20260730",
|
|
61
|
+
"@aztec/bb.js": "6.0.0-nightly.20260730",
|
|
62
|
+
"@aztec/blob-client": "6.0.0-nightly.20260730",
|
|
63
|
+
"@aztec/blob-lib": "6.0.0-nightly.20260730",
|
|
64
|
+
"@aztec/constants": "6.0.0-nightly.20260730",
|
|
65
|
+
"@aztec/epoch-cache": "6.0.0-nightly.20260730",
|
|
66
|
+
"@aztec/ethereum": "6.0.0-nightly.20260730",
|
|
67
|
+
"@aztec/foundation": "6.0.0-nightly.20260730",
|
|
68
|
+
"@aztec/kv-store": "6.0.0-nightly.20260730",
|
|
69
|
+
"@aztec/l1-artifacts": "6.0.0-nightly.20260730",
|
|
70
|
+
"@aztec/native": "6.0.0-nightly.20260730",
|
|
71
|
+
"@aztec/node-keystore": "6.0.0-nightly.20260730",
|
|
72
|
+
"@aztec/node-lib": "6.0.0-nightly.20260730",
|
|
73
|
+
"@aztec/noir-protocol-circuits-types": "6.0.0-nightly.20260730",
|
|
74
|
+
"@aztec/p2p": "6.0.0-nightly.20260730",
|
|
75
|
+
"@aztec/protocol-contracts": "6.0.0-nightly.20260730",
|
|
76
|
+
"@aztec/prover-client": "6.0.0-nightly.20260730",
|
|
77
|
+
"@aztec/sequencer-client": "6.0.0-nightly.20260730",
|
|
78
|
+
"@aztec/simulator": "6.0.0-nightly.20260730",
|
|
79
|
+
"@aztec/stdlib": "6.0.0-nightly.20260730",
|
|
80
|
+
"@aztec/telemetry-client": "6.0.0-nightly.20260730",
|
|
81
|
+
"@aztec/world-state": "6.0.0-nightly.20260730",
|
|
82
82
|
"source-map-support": "^0.5.21",
|
|
83
83
|
"tslib": "^2.4.0",
|
|
84
84
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
@@ -18,7 +18,7 @@ import type { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
|
18
18
|
import type { ForkMerkleTreeOperations, ITxProvider } from '@aztec/stdlib/interfaces/server';
|
|
19
19
|
import { CheckpointConstantData } from '@aztec/stdlib/rollup';
|
|
20
20
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
21
|
-
import type { BlockHeader, ProcessedTx, Tx } from '@aztec/stdlib/tx';
|
|
21
|
+
import type { BlockHeader, ProcessedTx, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
22
22
|
|
|
23
23
|
import type { ProverNodeJobMetrics } from '../metrics.js';
|
|
24
24
|
|
|
@@ -99,9 +99,6 @@ export class CheckpointProver {
|
|
|
99
99
|
readonly l1ToL2Messages: Fr[];
|
|
100
100
|
readonly previousArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>;
|
|
101
101
|
|
|
102
|
-
/** Per-prover tx map — populated by the internal gather. Empty until then. */
|
|
103
|
-
readonly txs: Map<string, Tx> = new Map();
|
|
104
|
-
|
|
105
102
|
/** Resolved by the sub-tree on success, rejected on cancel/failure. */
|
|
106
103
|
private readonly blockProofs: PromiseWithResolvers<SubTreeResult['blockProofOutputs']> = promiseWithResolvers();
|
|
107
104
|
|
|
@@ -123,6 +120,8 @@ export class CheckpointProver {
|
|
|
123
120
|
private readonly runPromise: Promise<void>;
|
|
124
121
|
/** Tracks the cancel-driven teardown so `whenDone()` can await it. */
|
|
125
122
|
private cancelPromise?: Promise<void>;
|
|
123
|
+
/** Tracks the success-driven sub-tree teardown (once block proofs are captured) so `whenDone()` can await it. */
|
|
124
|
+
private teardownPromise?: Promise<void>;
|
|
126
125
|
|
|
127
126
|
constructor(
|
|
128
127
|
args: CheckpointProverArgs,
|
|
@@ -187,9 +186,19 @@ export class CheckpointProver {
|
|
|
187
186
|
/** Resolves when all in-flight work for this prover has fully unwound. */
|
|
188
187
|
public async whenDone(): Promise<void> {
|
|
189
188
|
await this.runPromise.catch(() => {});
|
|
189
|
+
// `runPromise` resolves once block-level proving is *enqueued*, but the sub-tree's proofs (and the
|
|
190
|
+
// success-driven teardown they trigger) land later, on the `getSubTreeResult()` callback. Awaiting
|
|
191
|
+
// `blockProofs` here bridges that gap: on success the callback resolves `blockProofs` and then
|
|
192
|
+
// synchronously sets `teardownPromise` before this await resumes, so the teardown is observable
|
|
193
|
+
// below; on failure/cancel `blockProofs` rejects and teardown is driven by the `finally`/cancel
|
|
194
|
+
// paths already awaited via `runPromise`/`cancelPromise`.
|
|
195
|
+
await this.blockProofs.promise.catch(() => {});
|
|
190
196
|
if (this.cancelPromise) {
|
|
191
197
|
await this.cancelPromise;
|
|
192
198
|
}
|
|
199
|
+
if (this.teardownPromise) {
|
|
200
|
+
await this.teardownPromise;
|
|
201
|
+
}
|
|
193
202
|
}
|
|
194
203
|
|
|
195
204
|
private async gatherAndExecute(): Promise<void> {
|
|
@@ -232,20 +241,45 @@ export class CheckpointProver {
|
|
|
232
241
|
this.blockProofs.reject(err);
|
|
233
242
|
}
|
|
234
243
|
|
|
235
|
-
|
|
244
|
+
/** Fetches every tx in this checkpoint from the tx pool (by hash, via the block tx effects). */
|
|
245
|
+
private async fetchTxs(): Promise<{ txs: Map<string, Tx>; missingTxs: TxHash[] }> {
|
|
236
246
|
const deadline = new Date(this.deps.dateProvider.now() + this.deps.txGatheringTimeoutMs);
|
|
237
247
|
const txsByBlock = await Promise.all(
|
|
238
248
|
this.checkpoint.blocks.map(block => this.deps.txProvider.getTxsForBlock(block, { deadline })),
|
|
239
249
|
);
|
|
240
|
-
const txs = txsByBlock.
|
|
241
|
-
const missingTxs = txsByBlock.
|
|
250
|
+
const txs = txsByBlock.flatMap(({ txs }) => txs);
|
|
251
|
+
const missingTxs = txsByBlock.flatMap(({ missingTxs }) => missingTxs);
|
|
252
|
+
return { txs: new Map<string, Tx>(txs.map(tx => [tx.getTxHash().toString(), tx])), missingTxs };
|
|
253
|
+
}
|
|
242
254
|
|
|
255
|
+
private async gatherTxs(): Promise<Map<string, Tx>> {
|
|
256
|
+
const { txs, missingTxs } = await this.fetchTxs();
|
|
243
257
|
if (missingTxs.length > 0) {
|
|
244
258
|
throw new Error(
|
|
245
259
|
`Txs not found for checkpoint ${this.checkpoint.number}: ${missingTxs.map(hash => hash.toString()).join(', ')}`,
|
|
246
260
|
);
|
|
247
261
|
}
|
|
248
|
-
return
|
|
262
|
+
return txs;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Re-fetches this checkpoint's txs from the tx pool for a post-mortem failure upload.
|
|
267
|
+
*
|
|
268
|
+
* The prover does not cache txs on the heap — they are consumed during proving and dropped — so the
|
|
269
|
+
* durable pool (which keeps a mined tx until L1 finality, with A-1274's retention margin covering a
|
|
270
|
+
* lagging prover) is the source of truth, read back by hash here. Best-effort: any tx the pool can
|
|
271
|
+
* no longer supply is logged and omitted rather than failing the upload, since a partial post-mortem
|
|
272
|
+
* snapshot is still useful for diagnosis.
|
|
273
|
+
*/
|
|
274
|
+
public async getTxsForUpload(): Promise<Map<string, Tx>> {
|
|
275
|
+
const { txs, missingTxs } = await this.fetchTxs();
|
|
276
|
+
if (missingTxs.length > 0) {
|
|
277
|
+
this.deps.log.warn(
|
|
278
|
+
`Missing ${missingTxs.length} tx(s) re-fetching checkpoint ${this.checkpoint.number} for failure upload`,
|
|
279
|
+
{ checkpointNumber: this.checkpoint.number, missingTxCount: missingTxs.length },
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
return txs;
|
|
249
283
|
}
|
|
250
284
|
|
|
251
285
|
private async executeCheckpoint(txs: Map<string, Tx>): Promise<void> {
|
|
@@ -259,9 +293,9 @@ export class CheckpointProver {
|
|
|
259
293
|
await this.deps.checkpointProveOverride();
|
|
260
294
|
}
|
|
261
295
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
296
|
+
// The gathered txs are consumed locally below (public processing + sub-tree) and then dropped.
|
|
297
|
+
// They are deliberately not retained on the instance: the tx pool is the durable source and
|
|
298
|
+
// `getTxsForUpload` re-fetches them by hash if a post-mortem upload needs them.
|
|
265
299
|
|
|
266
300
|
const { chainId, version } = this.checkpoint.blocks[0].header.globalVariables;
|
|
267
301
|
const checkpointConstants = CheckpointConstantData.from({
|
|
@@ -301,6 +335,14 @@ export class CheckpointProver {
|
|
|
301
335
|
// Spans processing + proving (from executeCheckpoint start, after tx gathering) to proofs ready.
|
|
302
336
|
this.deps.metrics.recordCheckpointProving(checkpointTimer.ms());
|
|
303
337
|
this.blockProofs.resolve(result.blockProofOutputs);
|
|
338
|
+
// Release the sub-tree orchestrator now that its output is captured. The block-proof outputs
|
|
339
|
+
// survive via the resolved promise; everything else the sub-tree held — per-tx AVM inputs, and
|
|
340
|
+
// the base/merge/parity proof trees — is dead once proving completes, yet the prover is retained
|
|
341
|
+
// for the whole proof-submission window. Dropping it here is what stops that retention from
|
|
342
|
+
// accumulating across every proven checkpoint. Post-completion consumers (the top-tree job, a
|
|
343
|
+
// rebuilt EpochSession, failure upload) read only `whenBlockProofsReady()` and this prover's own
|
|
344
|
+
// fields (`checkpoint`, `txs`, headers, sibling paths), never the sub-tree.
|
|
345
|
+
this.teardownPromise = this.teardownSubTree();
|
|
304
346
|
},
|
|
305
347
|
err => this.failBlockProofs(err instanceof Error ? err : new Error(String(err))),
|
|
306
348
|
);
|
package/src/prover-node.ts
CHANGED
|
@@ -623,7 +623,7 @@ export class ProverNode implements L2BlockStreamEventHandler, ProverNodeApi, Tra
|
|
|
623
623
|
if (!this.config.proverNodeFailedEpochStore || checkpoints.length === 0) {
|
|
624
624
|
return undefined;
|
|
625
625
|
}
|
|
626
|
-
const data = SessionManager.buildProvingData(checkpoints);
|
|
626
|
+
const data = await SessionManager.buildProvingData(checkpoints);
|
|
627
627
|
return await uploadEpochProofFailure(
|
|
628
628
|
this.config.proverNodeFailedEpochStore,
|
|
629
629
|
// The session's own id; `uploadEpochProofFailure` already prefixes the path with the epoch number.
|
|
@@ -659,7 +659,7 @@ export class ProverNode implements L2BlockStreamEventHandler, ProverNodeApi, Tra
|
|
|
659
659
|
});
|
|
660
660
|
return undefined;
|
|
661
661
|
}
|
|
662
|
-
const data = SessionManager.buildProvingData([prover]);
|
|
662
|
+
const data = await SessionManager.buildProvingData([prover]);
|
|
663
663
|
return await uploadEpochProofFailure(
|
|
664
664
|
this.config.proverNodeFailedEpochStore,
|
|
665
665
|
// The prover's content-addressed id; the epoch number is already in the upload path.
|
package/src/session-manager.ts
CHANGED
|
@@ -435,14 +435,17 @@ export class SessionManager {
|
|
|
435
435
|
* checkpoint provers. Includes every checkpoint regardless of whether sub-tree proving
|
|
436
436
|
* completed — partial state is still useful for post-mortem analysis.
|
|
437
437
|
*/
|
|
438
|
-
public static buildProvingData(checkpoints: readonly CheckpointProver[]): EpochProvingJobData {
|
|
438
|
+
public static async buildProvingData(checkpoints: readonly CheckpointProver[]): Promise<EpochProvingJobData> {
|
|
439
439
|
if (checkpoints.length === 0) {
|
|
440
440
|
throw new Error('Cannot build proving data from an empty checkpoint set');
|
|
441
441
|
}
|
|
442
|
+
// Provers no longer cache their txs; re-fetch each checkpoint's txs from the tx pool (concurrently)
|
|
443
|
+
// for the snapshot. The pool retains them past the proving window (A-1274), so this is durable.
|
|
444
|
+
const perCheckpoint = await Promise.all(checkpoints.map(async c => ({ c, txs: await c.getTxsForUpload() })));
|
|
442
445
|
const txs = new Map();
|
|
443
446
|
const l1ToL2Messages: Record<number, Fr[]> = {};
|
|
444
|
-
for (const c of
|
|
445
|
-
for (const [hash, tx] of
|
|
447
|
+
for (const { c, txs: checkpointTxs } of perCheckpoint) {
|
|
448
|
+
for (const [hash, tx] of checkpointTxs) {
|
|
446
449
|
txs.set(hash, tx);
|
|
447
450
|
}
|
|
448
451
|
l1ToL2Messages[c.checkpoint.number] = c.l1ToL2Messages;
|