@aztec/prover-node 3.0.0-nightly.20251202 → 3.0.0-nightly.20251204
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/epoch-proving-job-data.d.ts +6 -5
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
- package/dest/job/epoch-proving-job-data.js +23 -17
- package/dest/job/epoch-proving-job.d.ts +3 -3
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +88 -83
- package/dest/metrics.d.ts +3 -2
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +7 -1
- package/dest/monitors/epoch-monitor.d.ts +1 -1
- package/dest/monitors/epoch-monitor.d.ts.map +1 -1
- package/dest/monitors/epoch-monitor.js +2 -1
- package/dest/prover-node-publisher.d.ts +4 -4
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +24 -25
- package/dest/prover-node.d.ts +2 -2
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +29 -25
- package/package.json +22 -22
- package/src/job/epoch-proving-job-data.ts +27 -22
- package/src/job/epoch-proving-job.ts +101 -99
- package/src/metrics.ts +13 -1
- package/src/monitors/epoch-monitor.ts +2 -2
- package/src/prover-node-publisher.ts +37 -34
- package/src/prover-node.ts +35 -29
|
@@ -45,11 +45,11 @@ export class ProverNodePublisher {
|
|
|
45
45
|
return this.l1TxUtils.getSenderAddress();
|
|
46
46
|
}
|
|
47
47
|
async submitEpochProof(args) {
|
|
48
|
-
const { epochNumber,
|
|
48
|
+
const { epochNumber, fromCheckpoint, toCheckpoint } = args;
|
|
49
49
|
const ctx = {
|
|
50
50
|
epochNumber,
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
fromCheckpoint,
|
|
52
|
+
toCheckpoint
|
|
53
53
|
};
|
|
54
54
|
if (!this.interrupted) {
|
|
55
55
|
const timer = new Timer();
|
|
@@ -88,31 +88,30 @@ export class ProverNodePublisher {
|
|
|
88
88
|
this.metrics.recordFailedTx();
|
|
89
89
|
this.log.error(`Rollup.submitEpochProof tx status failed ${txReceipt.transactionHash}`, undefined, ctx);
|
|
90
90
|
}
|
|
91
|
-
this.log.verbose('
|
|
91
|
+
this.log.verbose('Checkpoint data syncing interrupted', ctx);
|
|
92
92
|
return false;
|
|
93
93
|
}
|
|
94
94
|
async validateEpochProofSubmission(args) {
|
|
95
|
-
const {
|
|
96
|
-
// Check that the
|
|
97
|
-
// TODO: These are checkpoint numbers, not block numbers. Fix when we decouple them properly.
|
|
95
|
+
const { fromCheckpoint, toCheckpoint, publicInputs, batchedBlobInputs } = args;
|
|
96
|
+
// Check that the checkpoint numbers match the expected epoch to be proven
|
|
98
97
|
const { pending, proven } = await this.rollupContract.getTips();
|
|
99
|
-
// Don't publish if proven is beyond our
|
|
100
|
-
if (proven > BigInt(
|
|
101
|
-
throw new Error(`Cannot submit epoch proof for ${
|
|
98
|
+
// Don't publish if proven is beyond our toCheckpoint, pointless to do so
|
|
99
|
+
if (proven > BigInt(toCheckpoint)) {
|
|
100
|
+
throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as proven checkpoint is ${proven}`);
|
|
102
101
|
}
|
|
103
|
-
//
|
|
104
|
-
if (
|
|
105
|
-
throw new Error(`Cannot submit epoch proof for ${
|
|
102
|
+
// toCheckpoint can't be greater than pending
|
|
103
|
+
if (toCheckpoint > pending) {
|
|
104
|
+
throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as pending checkpoint is ${pending}`);
|
|
106
105
|
}
|
|
107
|
-
// Check the archive for the immediate
|
|
108
|
-
const
|
|
109
|
-
if (publicInputs.previousArchiveRoot.toString() !==
|
|
110
|
-
throw new Error(`Previous archive root mismatch: ${publicInputs.previousArchiveRoot.toString()} !== ${
|
|
106
|
+
// Check the archive for the immediate checkpoint before the epoch
|
|
107
|
+
const checkpointLog = await this.rollupContract.getCheckpoint(CheckpointNumber(fromCheckpoint - 1));
|
|
108
|
+
if (publicInputs.previousArchiveRoot.toString() !== checkpointLog.archive) {
|
|
109
|
+
throw new Error(`Previous archive root mismatch: ${publicInputs.previousArchiveRoot.toString()} !== ${checkpointLog.archive}`);
|
|
111
110
|
}
|
|
112
|
-
// Check the archive for the last
|
|
113
|
-
const
|
|
114
|
-
if (publicInputs.endArchiveRoot.toString() !==
|
|
115
|
-
throw new Error(`End archive root mismatch: ${publicInputs.endArchiveRoot.toString()} !== ${
|
|
111
|
+
// Check the archive for the last checkpoint in the epoch
|
|
112
|
+
const endCheckpointLog = await this.rollupContract.getCheckpoint(toCheckpoint);
|
|
113
|
+
if (publicInputs.endArchiveRoot.toString() !== endCheckpointLog.archive) {
|
|
114
|
+
throw new Error(`End archive root mismatch: ${publicInputs.endArchiveRoot.toString()} !== ${endCheckpointLog.archive}`);
|
|
116
115
|
}
|
|
117
116
|
// Check the batched blob inputs from the root rollup against the batched blob computed in ts
|
|
118
117
|
const finalBlobAccumulator = batchedBlobInputs.toFinalBlobAccumulator();
|
|
@@ -135,8 +134,8 @@ export class ProverNodePublisher {
|
|
|
135
134
|
];
|
|
136
135
|
this.log.info(`Submitting epoch proof to L1 rollup contract`, {
|
|
137
136
|
proofSize: args.proof.withoutPublicInputs().length,
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
fromCheckpoint: args.fromCheckpoint,
|
|
138
|
+
toCheckpoint: args.toCheckpoint
|
|
140
139
|
});
|
|
141
140
|
const data = encodeFunctionData({
|
|
142
141
|
abi: RollupAbi,
|
|
@@ -166,8 +165,8 @@ export class ProverNodePublisher {
|
|
|
166
165
|
getEpochProofPublicInputsArgs(args) {
|
|
167
166
|
// Returns arguments for EpochProofLib.sol -> getEpochProofPublicInputs()
|
|
168
167
|
return [
|
|
169
|
-
BigInt(args.
|
|
170
|
-
BigInt(args.
|
|
168
|
+
BigInt(args.fromCheckpoint),
|
|
169
|
+
BigInt(args.toCheckpoint),
|
|
171
170
|
{
|
|
172
171
|
previousArchive: args.publicInputs.previousArchiveRoot.toString(),
|
|
173
172
|
endArchive: args.publicInputs.endArchiveRoot.toString(),
|
package/dest/prover-node.d.ts
CHANGED
|
@@ -91,7 +91,7 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
91
91
|
private createProvingJob;
|
|
92
92
|
private getL1Constants;
|
|
93
93
|
private gatherEpochData;
|
|
94
|
-
private
|
|
94
|
+
private gatherCheckpoints;
|
|
95
95
|
private gatherTxs;
|
|
96
96
|
private gatherMessages;
|
|
97
97
|
private gatherPreviousBlockHeader;
|
|
@@ -104,4 +104,4 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
104
104
|
private validateConfig;
|
|
105
105
|
}
|
|
106
106
|
export {};
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92ZXItbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQWlDLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTdGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV6RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpFLE9BQU8sRUFDTCxLQUFLLGtCQUFrQixFQUV2QixLQUFLLGFBQWEsRUFDbEIsS0FBSyxPQUFPLEVBQ1osS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxzQkFBc0IsRUFFNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXZELE9BQU8sRUFFTCxTQUFTLEVBQ1QsS0FBSyxlQUFlLEVBQ3BCLEtBQUssU0FBUyxFQUNkLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRixPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUUsS0FBSyxpQkFBaUIsR0FBRyx3QkFBd0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM5RSxLQUFLLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUM7QUFFbEg7Ozs7R0FJRztBQUNILHFCQUFhLFVBQVcsWUFBVyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsU0FBUztJQWM1RSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxrQkFBa0I7SUFDN0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0I7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDbEUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUI7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0I7SUFDekQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCO0lBQ3JELFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDdkcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsWUFBWTtJQUM5QyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxjQUFjO0lBQ2pELFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVM7SUFFdkMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsZUFBZTtJQXhCckQsT0FBTyxDQUFDLEdBQUcsQ0FBK0I7SUFDMUMsT0FBTyxDQUFDLFlBQVksQ0FBc0I7SUFFMUMsT0FBTyxDQUFDLElBQUksQ0FBMkM7SUFDdkQsT0FBTyxDQUFDLE1BQU0sQ0FBb0I7SUFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBdUI7SUFDekMsT0FBTyxDQUFDLGNBQWMsQ0FBMkI7SUFFakQsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixTQUFTLENBQUMsU0FBUyxFQUFFLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztJQUVyRCxZQUNxQixNQUFNLEVBQUUsa0JBQWtCLEVBQzFCLGdCQUFnQixFQUFFLHNCQUFzQixFQUN4QyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDL0MsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQ3hDLGtCQUFrQixFQUFFLGtCQUFrQixFQUN0QyxVQUFVLEVBQUUsc0JBQXNCLEVBQ2xDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxlQUFlLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQ3BGLGFBQWEsRUFBRSxZQUFZLEVBQzNCLGNBQWMsRUFBRSxjQUFjLEVBQzlCLFNBQVMsRUFBRSxTQUFTLEVBQ3ZDLE1BQU0sR0FBRSxPQUFPLENBQUMsaUJBQWlCLENBQU0sRUFDcEIsZUFBZSxHQUFFLGVBQXNDLEVBdUIzRTtJQUVNLFdBQVcsNkNBRWpCO0lBRU0sTUFBTSw4RUFFWjtJQUVEOzs7O09BSUc7SUFDRyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FzQnhFO0lBRUQ7OztPQUdHO0lBQ0csS0FBSyxrQkFPVjtJQUVEOztPQUVHO0lBQ0csSUFBSSxrQkFjVDtJQUVELGtDQUFrQztJQUNyQix1QkFBdUIsSUFBSSxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FHcEU7SUFFRCwrQkFBK0I7SUFDeEIsU0FBUyxrREFFZjtJQUVEOztPQUVHO0lBQ1UsVUFBVSxDQUFDLFdBQVcsRUFBRSxXQUFXLGlCQUcvQztZQUVhLE1BQU07SUF5QnBCLFVBQWdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxlQUFlLCtCQVl6RDtJQUVEOztPQUVHO0lBQ0ksU0FBUyx1QkFFZjtJQUVEOztPQUVHO0lBQ0ksT0FBTyxJQUFJLE9BQU8sQ0FBQztRQUFFLElBQUksRUFBRSxNQUFNLENBQUM7UUFBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUM7UUFBQyxXQUFXLEVBQUUsV0FBVyxDQUFBO0tBQUUsRUFBRSxDQUFDLENBUXBHO0lBRUQsVUFBZ0IscUJBQXFCLENBQ25DLFdBQVcsRUFBRSxXQUFXLEdBQ3ZCLE9BQU8sQ0FBQztRQUFFLElBQUksRUFBRSxNQUFNLENBQUM7UUFBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUE7S0FBRSxFQUFFLENBQUMsQ0FHM0Q7SUFFRCxPQUFPLENBQUMsdUJBQXVCO1lBUWpCLGdCQUFnQjtJQWtDOUIsT0FBTyxDQUFDLGNBQWM7WUFLUixlQUFlO1lBYWYsaUJBQWlCO1lBUWpCLFNBQVM7WUFnQlQsY0FBYztZQWFkLHlCQUF5QjtJQWF2QyxzQ0FBc0M7SUFDdEMsU0FBUyxDQUFDLHVCQUF1QixDQUMvQixJQUFJLEVBQUUsbUJBQW1CLEVBQ3pCLFFBQVEsRUFBRSxJQUFJLEdBQUcsU0FBUyxFQUMxQixzQkFBc0IsRUFBRSxzQkFBc0IsRUFDOUMsU0FBUyxFQUFFLG1CQUFtQixFQUM5QixJQUFJLEdBQUU7UUFBRSxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUE7S0FBTyxtQkFjeEM7SUFFRCxzQ0FBc0M7SUFDdEMsVUFBZ0IsZUFBZSxrQkFFOUI7SUFFRCxPQUFPLENBQUMsY0FBYztDQWN2QiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"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"}
|
package/dest/prover-node.js
CHANGED
|
@@ -4,6 +4,7 @@ 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 { BlockNumber } from '@aztec/foundation/branded-types';
|
|
7
8
|
import { assertRequired, compact, pick, sum } from '@aztec/foundation/collection';
|
|
8
9
|
import { memoize } from '@aztec/foundation/decorators';
|
|
9
10
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -208,9 +209,11 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
208
209
|
this.publisher = await this.publisherFactory.create();
|
|
209
210
|
// Gather all data for this epoch
|
|
210
211
|
const epochData = await this.gatherEpochData(epochNumber);
|
|
211
|
-
const
|
|
212
|
-
const
|
|
213
|
-
|
|
212
|
+
const fromCheckpoint = epochData.checkpoints[0].number;
|
|
213
|
+
const toCheckpoint = epochData.checkpoints.at(-1).number;
|
|
214
|
+
const fromBlock = epochData.checkpoints[0].blocks[0].number;
|
|
215
|
+
const toBlock = epochData.checkpoints.at(-1).blocks.at(-1).number;
|
|
216
|
+
this.log.verbose(`Creating proving job for epoch ${epochNumber} for checkpoint range ${fromCheckpoint} to ${toCheckpoint} and block range ${fromBlock} to ${toBlock}`);
|
|
214
217
|
// Fast forward world state to right before the target block and get a fork
|
|
215
218
|
await this.worldState.syncImmediate(toBlock);
|
|
216
219
|
// Create a processor factory
|
|
@@ -226,18 +229,19 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
226
229
|
return this.l2BlockSource.getL1Constants();
|
|
227
230
|
}
|
|
228
231
|
async gatherEpochData(epochNumber) {
|
|
229
|
-
const
|
|
230
|
-
const txArray = await this.gatherTxs(epochNumber,
|
|
232
|
+
const checkpoints = await this.gatherCheckpoints(epochNumber);
|
|
233
|
+
const txArray = await this.gatherTxs(epochNumber, checkpoints);
|
|
231
234
|
const txs = new Map(txArray.map((tx)=>[
|
|
232
235
|
tx.getTxHash().toString(),
|
|
233
236
|
tx
|
|
234
237
|
]));
|
|
235
|
-
const l1ToL2Messages = await this.gatherMessages(epochNumber,
|
|
236
|
-
const
|
|
237
|
-
const
|
|
238
|
-
const
|
|
238
|
+
const l1ToL2Messages = await this.gatherMessages(epochNumber, checkpoints);
|
|
239
|
+
const [firstBlock] = checkpoints[0].blocks;
|
|
240
|
+
const previousBlockHeader = await this.gatherPreviousBlockHeader(epochNumber, firstBlock.number - 1);
|
|
241
|
+
const [lastPublishedCheckpoint] = await this.l2BlockSource.getPublishedCheckpoints(checkpoints.at(-1).number, 1);
|
|
242
|
+
const attestations = lastPublishedCheckpoint?.attestations ?? [];
|
|
239
243
|
return {
|
|
240
|
-
|
|
244
|
+
checkpoints,
|
|
241
245
|
txs,
|
|
242
246
|
l1ToL2Messages,
|
|
243
247
|
epochNumber,
|
|
@@ -245,16 +249,17 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
245
249
|
attestations
|
|
246
250
|
};
|
|
247
251
|
}
|
|
248
|
-
async
|
|
249
|
-
const
|
|
250
|
-
if (
|
|
252
|
+
async gatherCheckpoints(epochNumber) {
|
|
253
|
+
const checkpoints = await this.l2BlockSource.getCheckpointsForEpoch(epochNumber);
|
|
254
|
+
if (checkpoints.length === 0) {
|
|
251
255
|
throw new EmptyEpochError(epochNumber);
|
|
252
256
|
}
|
|
253
|
-
return
|
|
257
|
+
return checkpoints;
|
|
254
258
|
}
|
|
255
|
-
async gatherTxs(epochNumber,
|
|
259
|
+
async gatherTxs(epochNumber, checkpoints) {
|
|
256
260
|
const deadline = new Date(this.dateProvider.now() + this.config.txGatheringTimeoutMs);
|
|
257
261
|
const txProvider = this.p2pClient.getTxProvider();
|
|
262
|
+
const blocks = checkpoints.flatMap((checkpoint)=>checkpoint.blocks);
|
|
258
263
|
const txsByBlock = await Promise.all(blocks.map((block)=>txProvider.getTxsForBlock(block, {
|
|
259
264
|
deadline
|
|
260
265
|
})));
|
|
@@ -268,23 +273,22 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
268
273
|
}
|
|
269
274
|
throw new Error(`Txs not found for epoch ${epochNumber}: ${missingTxs.map((hash)=>hash.toString()).join(', ')}`);
|
|
270
275
|
}
|
|
271
|
-
async gatherMessages(epochNumber,
|
|
272
|
-
const messages = await Promise.all(
|
|
276
|
+
async gatherMessages(epochNumber, checkpoints) {
|
|
277
|
+
const messages = await Promise.all(checkpoints.map((c)=>this.l1ToL2MessageSource.getL1ToL2MessagesForCheckpoint(c.number)));
|
|
273
278
|
const messageCount = sum(messages.map((m)=>m.length));
|
|
274
279
|
this.log.verbose(`Gathered all ${messageCount} messages for epoch ${epochNumber}`, {
|
|
275
280
|
epochNumber
|
|
276
281
|
});
|
|
277
|
-
const
|
|
278
|
-
for(let i = 0; i <
|
|
279
|
-
|
|
282
|
+
const messagesByCheckpoint = {};
|
|
283
|
+
for(let i = 0; i < checkpoints.length; i++){
|
|
284
|
+
messagesByCheckpoint[checkpoints[i].number] = messages[i];
|
|
280
285
|
}
|
|
281
|
-
return
|
|
286
|
+
return messagesByCheckpoint;
|
|
282
287
|
}
|
|
283
|
-
async gatherPreviousBlockHeader(epochNumber,
|
|
284
|
-
const
|
|
285
|
-
const header = await (previousBlockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.l2BlockSource.getBlockHeader(previousBlockNumber));
|
|
288
|
+
async gatherPreviousBlockHeader(epochNumber, previousBlockNumber) {
|
|
289
|
+
const header = await (previousBlockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.l2BlockSource.getBlockHeader(BlockNumber(previousBlockNumber)));
|
|
286
290
|
if (!header) {
|
|
287
|
-
throw new Error(`Previous block header ${
|
|
291
|
+
throw new Error(`Previous block header ${previousBlockNumber} not found for proving epoch ${epochNumber}`);
|
|
288
292
|
}
|
|
289
293
|
this.log.verbose(`Gathered previous block header ${header.getBlockNumber()} for epoch ${epochNumber}`);
|
|
290
294
|
return header;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "3.0.0-nightly.
|
|
3
|
+
"version": "3.0.0-nightly.20251204",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,27 +56,27 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/archiver": "3.0.0-nightly.
|
|
60
|
-
"@aztec/bb-prover": "3.0.0-nightly.
|
|
61
|
-
"@aztec/blob-lib": "3.0.0-nightly.
|
|
62
|
-
"@aztec/blob-sink": "3.0.0-nightly.
|
|
63
|
-
"@aztec/constants": "3.0.0-nightly.
|
|
64
|
-
"@aztec/epoch-cache": "3.0.0-nightly.
|
|
65
|
-
"@aztec/ethereum": "3.0.0-nightly.
|
|
66
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
67
|
-
"@aztec/kv-store": "3.0.0-nightly.
|
|
68
|
-
"@aztec/l1-artifacts": "3.0.0-nightly.
|
|
69
|
-
"@aztec/node-keystore": "3.0.0-nightly.
|
|
70
|
-
"@aztec/node-lib": "3.0.0-nightly.
|
|
71
|
-
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.
|
|
72
|
-
"@aztec/p2p": "3.0.0-nightly.
|
|
73
|
-
"@aztec/protocol-contracts": "3.0.0-nightly.
|
|
74
|
-
"@aztec/prover-client": "3.0.0-nightly.
|
|
75
|
-
"@aztec/sequencer-client": "3.0.0-nightly.
|
|
76
|
-
"@aztec/simulator": "3.0.0-nightly.
|
|
77
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
78
|
-
"@aztec/telemetry-client": "3.0.0-nightly.
|
|
79
|
-
"@aztec/world-state": "3.0.0-nightly.
|
|
59
|
+
"@aztec/archiver": "3.0.0-nightly.20251204",
|
|
60
|
+
"@aztec/bb-prover": "3.0.0-nightly.20251204",
|
|
61
|
+
"@aztec/blob-lib": "3.0.0-nightly.20251204",
|
|
62
|
+
"@aztec/blob-sink": "3.0.0-nightly.20251204",
|
|
63
|
+
"@aztec/constants": "3.0.0-nightly.20251204",
|
|
64
|
+
"@aztec/epoch-cache": "3.0.0-nightly.20251204",
|
|
65
|
+
"@aztec/ethereum": "3.0.0-nightly.20251204",
|
|
66
|
+
"@aztec/foundation": "3.0.0-nightly.20251204",
|
|
67
|
+
"@aztec/kv-store": "3.0.0-nightly.20251204",
|
|
68
|
+
"@aztec/l1-artifacts": "3.0.0-nightly.20251204",
|
|
69
|
+
"@aztec/node-keystore": "3.0.0-nightly.20251204",
|
|
70
|
+
"@aztec/node-lib": "3.0.0-nightly.20251204",
|
|
71
|
+
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251204",
|
|
72
|
+
"@aztec/p2p": "3.0.0-nightly.20251204",
|
|
73
|
+
"@aztec/protocol-contracts": "3.0.0-nightly.20251204",
|
|
74
|
+
"@aztec/prover-client": "3.0.0-nightly.20251204",
|
|
75
|
+
"@aztec/sequencer-client": "3.0.0-nightly.20251204",
|
|
76
|
+
"@aztec/simulator": "3.0.0-nightly.20251204",
|
|
77
|
+
"@aztec/stdlib": "3.0.0-nightly.20251204",
|
|
78
|
+
"@aztec/telemetry-client": "3.0.0-nightly.20251204",
|
|
79
|
+
"@aztec/world-state": "3.0.0-nightly.20251204",
|
|
80
80
|
"source-map-support": "^0.5.21",
|
|
81
81
|
"tslib": "^2.4.0",
|
|
82
82
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
@@ -1,40 +1,45 @@
|
|
|
1
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
3
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
4
|
-
import { CommitteeAttestation
|
|
4
|
+
import { CommitteeAttestation } from '@aztec/stdlib/block';
|
|
5
|
+
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
5
6
|
import { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
6
7
|
|
|
7
8
|
/** All data from an epoch used in proving. */
|
|
8
9
|
export type EpochProvingJobData = {
|
|
9
10
|
epochNumber: EpochNumber;
|
|
10
|
-
|
|
11
|
+
checkpoints: Checkpoint[];
|
|
11
12
|
txs: Map<string, Tx>;
|
|
12
|
-
l1ToL2Messages: Record<
|
|
13
|
+
l1ToL2Messages: Record<CheckpointNumber, Fr[]>;
|
|
13
14
|
previousBlockHeader: BlockHeader;
|
|
14
15
|
attestations: CommitteeAttestation[];
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
export function validateEpochProvingJobData(data: EpochProvingJobData) {
|
|
18
|
-
if (data.
|
|
19
|
+
if (data.checkpoints.length === 0) {
|
|
20
|
+
throw new Error('No checkpoints to prove');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const firstBlockNumber = data.checkpoints[0].blocks[0].number;
|
|
24
|
+
const previousBlockNumber = data.previousBlockHeader.getBlockNumber();
|
|
25
|
+
if (previousBlockNumber + 1 !== firstBlockNumber) {
|
|
19
26
|
throw new Error(
|
|
20
|
-
`Initial block number ${
|
|
21
|
-
data.blocks[0].number
|
|
22
|
-
} does not match previous block header ${data.previousBlockHeader.getBlockNumber()}`,
|
|
27
|
+
`Initial block number ${firstBlockNumber} does not match previous block header ${previousBlockNumber}`,
|
|
23
28
|
);
|
|
24
29
|
}
|
|
25
30
|
|
|
26
|
-
for (const
|
|
27
|
-
if (!(
|
|
28
|
-
throw new Error(`Missing L1 to L2 messages for
|
|
31
|
+
for (const checkpoint of data.checkpoints) {
|
|
32
|
+
if (!(checkpoint.number in data.l1ToL2Messages)) {
|
|
33
|
+
throw new Error(`Missing L1 to L2 messages for checkpoint number ${checkpoint.number}`);
|
|
29
34
|
}
|
|
30
35
|
}
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
export function serializeEpochProvingJobData(data: EpochProvingJobData): Buffer {
|
|
34
|
-
const
|
|
39
|
+
const checkpoints = data.checkpoints.map(checkpoint => checkpoint.toBuffer());
|
|
35
40
|
const txs = Array.from(data.txs.values()).map(tx => tx.toBuffer());
|
|
36
|
-
const l1ToL2Messages = Object.entries(data.l1ToL2Messages).map(([
|
|
37
|
-
Number(
|
|
41
|
+
const l1ToL2Messages = Object.entries(data.l1ToL2Messages).map(([checkpointNumber, messages]) => [
|
|
42
|
+
Number(checkpointNumber),
|
|
38
43
|
messages.length,
|
|
39
44
|
...messages,
|
|
40
45
|
]);
|
|
@@ -43,8 +48,8 @@ export function serializeEpochProvingJobData(data: EpochProvingJobData): Buffer
|
|
|
43
48
|
return serializeToBuffer(
|
|
44
49
|
data.epochNumber,
|
|
45
50
|
data.previousBlockHeader,
|
|
46
|
-
|
|
47
|
-
...
|
|
51
|
+
checkpoints.length,
|
|
52
|
+
...checkpoints,
|
|
48
53
|
txs.length,
|
|
49
54
|
...txs,
|
|
50
55
|
l1ToL2Messages.length,
|
|
@@ -58,20 +63,20 @@ export function deserializeEpochProvingJobData(buf: Buffer): EpochProvingJobData
|
|
|
58
63
|
const reader = BufferReader.asReader(buf);
|
|
59
64
|
const epochNumber = EpochNumber(reader.readNumber());
|
|
60
65
|
const previousBlockHeader = reader.readObject(BlockHeader);
|
|
61
|
-
const
|
|
66
|
+
const checkpoints = reader.readVector(Checkpoint);
|
|
62
67
|
const txArray = reader.readVector(Tx);
|
|
63
68
|
|
|
64
|
-
const
|
|
69
|
+
const l1ToL2MessageCheckpointCount = reader.readNumber();
|
|
65
70
|
const l1ToL2Messages: Record<number, Fr[]> = {};
|
|
66
|
-
for (let i = 0; i <
|
|
67
|
-
const
|
|
71
|
+
for (let i = 0; i < l1ToL2MessageCheckpointCount; i++) {
|
|
72
|
+
const checkpointNumber = CheckpointNumber(reader.readNumber());
|
|
68
73
|
const messages = reader.readVector(Fr);
|
|
69
|
-
l1ToL2Messages[
|
|
74
|
+
l1ToL2Messages[checkpointNumber] = messages;
|
|
70
75
|
}
|
|
71
76
|
|
|
72
77
|
const attestations = reader.readVector(CommitteeAttestation);
|
|
73
78
|
|
|
74
79
|
const txs = new Map<string, Tx>(txArray.map(tx => [tx.getTxHash().toString(), tx]));
|
|
75
80
|
|
|
76
|
-
return { epochNumber, previousBlockHeader,
|
|
81
|
+
return { epochNumber, previousBlockHeader, checkpoints, txs, l1ToL2Messages, attestations };
|
|
77
82
|
}
|