@aztec/prover-node 0.0.0-test.0 → 0.0.1-commit.21caa21
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/download-epoch-proving-job.d.ts +18 -0
- package/dest/actions/download-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/download-epoch-proving-job.js +37 -0
- package/dest/actions/index.d.ts +3 -0
- package/dest/actions/index.d.ts.map +1 -0
- package/dest/actions/index.js +2 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts +11 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/rerun-epoch-proving-job.js +40 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts +15 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -0
- package/dest/actions/upload-epoch-proof-failure.js +78 -0
- package/dest/bin/run-failed-epoch.d.ts +2 -0
- package/dest/bin/run-failed-epoch.d.ts.map +1 -0
- package/dest/bin/run-failed-epoch.js +67 -0
- package/dest/config.d.ts +13 -10
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +81 -14
- package/dest/factory.d.ts +13 -9
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +95 -31
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/job/epoch-proving-job-data.d.ts +17 -0
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -0
- package/dest/job/epoch-proving-job-data.js +53 -0
- package/dest/job/epoch-proving-job.d.ts +25 -17
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +155 -51
- package/dest/metrics.d.ts +29 -5
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +141 -35
- package/dest/monitors/epoch-monitor.d.ts +5 -2
- package/dest/monitors/epoch-monitor.d.ts.map +1 -1
- package/dest/monitors/epoch-monitor.js +15 -2
- package/dest/monitors/index.d.ts +1 -1
- package/dest/prover-node-publisher.d.ts +10 -12
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +62 -62
- package/dest/prover-node.d.ts +48 -43
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +175 -105
- package/dest/prover-publisher-factory.d.ts +21 -0
- package/dest/prover-publisher-factory.d.ts.map +1 -0
- package/dest/prover-publisher-factory.js +26 -0
- package/dest/test/index.d.ts +5 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +1 -3
- package/package.json +39 -33
- package/src/actions/download-epoch-proving-job.ts +44 -0
- package/src/actions/index.ts +2 -0
- package/src/actions/rerun-epoch-proving-job.ts +61 -0
- package/src/actions/upload-epoch-proof-failure.ts +88 -0
- package/src/bin/run-failed-epoch.ts +77 -0
- package/src/config.ts +108 -24
- package/src/factory.ts +163 -43
- package/src/index.ts +1 -1
- package/src/job/epoch-proving-job-data.ts +77 -0
- package/src/job/epoch-proving-job.ts +222 -52
- package/src/metrics.ts +135 -37
- package/src/monitors/epoch-monitor.ts +18 -6
- package/src/prover-node-publisher.ts +96 -88
- package/src/prover-node.ts +213 -136
- package/src/prover-publisher-factory.ts +37 -0
- package/src/test/index.ts +7 -4
- package/dest/http.d.ts +0 -8
- package/dest/http.d.ts.map +0 -1
- package/dest/http.js +0 -9
- package/dest/prover-coordination/config.d.ts +0 -7
- package/dest/prover-coordination/config.d.ts.map +0 -1
- package/dest/prover-coordination/config.js +0 -11
- package/dest/prover-coordination/factory.d.ts +0 -22
- package/dest/prover-coordination/factory.d.ts.map +0 -1
- package/dest/prover-coordination/factory.js +0 -42
- package/dest/prover-coordination/index.d.ts +0 -3
- package/dest/prover-coordination/index.d.ts.map +0 -1
- package/dest/prover-coordination/index.js +0 -2
- package/src/http.ts +0 -13
- package/src/prover-coordination/config.ts +0 -17
- package/src/prover-coordination/factory.ts +0 -72
- package/src/prover-coordination/index.ts +0 -2
|
@@ -4,57 +4,59 @@ 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 { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
7
8
|
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
9
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
10
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
8
11
|
import { createLogger } from '@aztec/foundation/log';
|
|
9
|
-
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
12
|
+
import { RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
|
|
10
13
|
import { Timer } from '@aztec/foundation/timer';
|
|
14
|
+
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
15
|
+
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
16
|
+
import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
|
|
17
|
+
import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
11
18
|
import { EpochProvingJobTerminalState } from '@aztec/stdlib/interfaces/server';
|
|
19
|
+
import { CheckpointConstantData } from '@aztec/stdlib/rollup';
|
|
20
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
12
21
|
import { Attributes, trackSpan } from '@aztec/telemetry-client';
|
|
13
22
|
import * as crypto from 'node:crypto';
|
|
23
|
+
import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
14
24
|
/**
|
|
15
|
-
* Job that grabs a range of blocks from the
|
|
25
|
+
* Job that grabs a range of blocks from the unfinalized chain from L1, gets their txs given their hashes,
|
|
16
26
|
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
17
27
|
* world state as part of public call execution via the public processor.
|
|
18
28
|
*/ export class EpochProvingJob {
|
|
29
|
+
data;
|
|
19
30
|
dbProvider;
|
|
20
|
-
epochNumber;
|
|
21
|
-
blocks;
|
|
22
|
-
txs;
|
|
23
31
|
prover;
|
|
24
32
|
publicProcessorFactory;
|
|
25
33
|
publisher;
|
|
26
34
|
l2BlockSource;
|
|
27
|
-
l1ToL2MessageSource;
|
|
28
35
|
metrics;
|
|
29
36
|
deadline;
|
|
30
37
|
config;
|
|
31
|
-
cleanUp;
|
|
32
38
|
state;
|
|
33
39
|
log;
|
|
34
40
|
uuid;
|
|
35
41
|
runPromise;
|
|
42
|
+
epochCheckPromise;
|
|
36
43
|
deadlineTimeoutHandler;
|
|
37
44
|
tracer;
|
|
38
|
-
constructor(
|
|
39
|
-
|
|
40
|
-
}, cleanUp = ()=>Promise.resolve()){
|
|
45
|
+
constructor(data, dbProvider, prover, publicProcessorFactory, publisher, l2BlockSource, metrics, deadline, config){
|
|
46
|
+
this.data = data;
|
|
41
47
|
this.dbProvider = dbProvider;
|
|
42
|
-
this.epochNumber = epochNumber;
|
|
43
|
-
this.blocks = blocks;
|
|
44
|
-
this.txs = txs;
|
|
45
48
|
this.prover = prover;
|
|
46
49
|
this.publicProcessorFactory = publicProcessorFactory;
|
|
47
50
|
this.publisher = publisher;
|
|
48
51
|
this.l2BlockSource = l2BlockSource;
|
|
49
|
-
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
50
52
|
this.metrics = metrics;
|
|
51
53
|
this.deadline = deadline;
|
|
52
54
|
this.config = config;
|
|
53
|
-
this.cleanUp = cleanUp;
|
|
54
55
|
this.state = 'initialized';
|
|
55
56
|
this.log = createLogger('prover-node:epoch-proving-job');
|
|
57
|
+
validateEpochProvingJobData(data);
|
|
56
58
|
this.uuid = crypto.randomUUID();
|
|
57
|
-
this.tracer = metrics.
|
|
59
|
+
this.tracer = metrics.tracer;
|
|
58
60
|
}
|
|
59
61
|
getId() {
|
|
60
62
|
return this.uuid;
|
|
@@ -63,13 +65,35 @@ import * as crypto from 'node:crypto';
|
|
|
63
65
|
return this.state;
|
|
64
66
|
}
|
|
65
67
|
getEpochNumber() {
|
|
66
|
-
return this.epochNumber;
|
|
68
|
+
return this.data.epochNumber;
|
|
69
|
+
}
|
|
70
|
+
getDeadline() {
|
|
71
|
+
return this.deadline;
|
|
72
|
+
}
|
|
73
|
+
getProvingData() {
|
|
74
|
+
return this.data;
|
|
75
|
+
}
|
|
76
|
+
get epochNumber() {
|
|
77
|
+
return this.data.epochNumber;
|
|
78
|
+
}
|
|
79
|
+
get blocks() {
|
|
80
|
+
return this.data.blocks;
|
|
81
|
+
}
|
|
82
|
+
get txs() {
|
|
83
|
+
return this.data.txs;
|
|
84
|
+
}
|
|
85
|
+
get attestations() {
|
|
86
|
+
return this.data.attestations;
|
|
67
87
|
}
|
|
68
88
|
/**
|
|
69
89
|
* Proves the given epoch and submits the proof to L1.
|
|
70
90
|
*/ async run() {
|
|
71
91
|
this.scheduleDeadlineStop();
|
|
72
|
-
|
|
92
|
+
if (!this.config.skipEpochCheck) {
|
|
93
|
+
await this.scheduleEpochCheck();
|
|
94
|
+
}
|
|
95
|
+
const attestations = this.attestations.map((attestation)=>attestation.toViem());
|
|
96
|
+
const epochNumber = this.epochNumber;
|
|
73
97
|
const epochSizeBlocks = this.blocks.length;
|
|
74
98
|
const epochSizeTxs = this.blocks.reduce((total, current)=>total + current.body.txEffects.length, 0);
|
|
75
99
|
const [fromBlock, toBlock] = [
|
|
@@ -88,14 +112,19 @@ import * as crypto from 'node:crypto';
|
|
|
88
112
|
const { promise, resolve } = promiseWithResolvers();
|
|
89
113
|
this.runPromise = promise;
|
|
90
114
|
try {
|
|
91
|
-
this.
|
|
92
|
-
await
|
|
93
|
-
|
|
115
|
+
const blobFieldsPerCheckpoint = this.blocks.map((block)=>block.getCheckpointBlobFields());
|
|
116
|
+
const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
|
|
117
|
+
// TODO(#17027): Enable multiple blocks per checkpoint.
|
|
118
|
+
// Total number of checkpoints equals number of blocks because we currently build a checkpoint with only one block.
|
|
119
|
+
const totalNumCheckpoints = epochSizeBlocks;
|
|
120
|
+
this.prover.startNewEpoch(epochNumber, totalNumCheckpoints, finalBlobBatchingChallenges);
|
|
121
|
+
await this.prover.startChonkVerifierCircuits(Array.from(this.txs.values()));
|
|
122
|
+
await asyncPool(this.config.parallelBlockLimit ?? 32, this.blocks, async (block)=>{
|
|
94
123
|
this.checkState();
|
|
95
124
|
const globalVariables = block.header.globalVariables;
|
|
96
|
-
const txs =
|
|
97
|
-
const l1ToL2Messages =
|
|
98
|
-
const previousHeader =
|
|
125
|
+
const txs = this.getTxs(block);
|
|
126
|
+
const l1ToL2Messages = this.getL1ToL2Messages(block);
|
|
127
|
+
const previousHeader = this.getBlockHeader(block.number - 1);
|
|
99
128
|
this.log.verbose(`Starting processing block ${block.number}`, {
|
|
100
129
|
number: block.number,
|
|
101
130
|
blockHash: (await block.hash()).toString(),
|
|
@@ -107,11 +136,35 @@ import * as crypto from 'node:crypto';
|
|
|
107
136
|
uuid: this.uuid,
|
|
108
137
|
...globalVariables
|
|
109
138
|
});
|
|
139
|
+
const checkpointConstants = CheckpointConstantData.from({
|
|
140
|
+
chainId: globalVariables.chainId,
|
|
141
|
+
version: globalVariables.version,
|
|
142
|
+
vkTreeRoot: getVKTreeRoot(),
|
|
143
|
+
protocolContractsHash: protocolContractsHash,
|
|
144
|
+
proverId: this.prover.getProverId().toField(),
|
|
145
|
+
slotNumber: globalVariables.slotNumber,
|
|
146
|
+
coinbase: globalVariables.coinbase,
|
|
147
|
+
feeRecipient: globalVariables.feeRecipient,
|
|
148
|
+
gasFees: globalVariables.gasFees
|
|
149
|
+
});
|
|
150
|
+
// TODO(#17027): Enable multiple blocks per checkpoint.
|
|
151
|
+
// Each checkpoint has only one block.
|
|
152
|
+
const totalNumBlocks = 1;
|
|
153
|
+
const checkpointIndex = block.number - fromBlock;
|
|
154
|
+
await this.prover.startNewCheckpoint(checkpointIndex, checkpointConstants, l1ToL2Messages, totalNumBlocks, previousHeader);
|
|
110
155
|
// Start block proving
|
|
111
|
-
await this.prover.startNewBlock(
|
|
156
|
+
await this.prover.startNewBlock(block.number, globalVariables.timestamp, txs.length);
|
|
112
157
|
// Process public fns
|
|
113
|
-
const db = await this.
|
|
114
|
-
const
|
|
158
|
+
const db = await this.createFork(block.number - 1, l1ToL2Messages);
|
|
159
|
+
const config = PublicSimulatorConfig.from({
|
|
160
|
+
proverId: this.prover.getProverId().toField(),
|
|
161
|
+
skipFeeEnforcement: false,
|
|
162
|
+
collectDebugLogs: false,
|
|
163
|
+
collectHints: true,
|
|
164
|
+
maxDebugLogMemoryReads: 0,
|
|
165
|
+
collectStatistics: false
|
|
166
|
+
});
|
|
167
|
+
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
|
|
115
168
|
const processed = await this.processTxs(publicProcessor, txs);
|
|
116
169
|
await this.prover.addTxs(processed);
|
|
117
170
|
await db.close();
|
|
@@ -121,23 +174,32 @@ import * as crypto from 'node:crypto';
|
|
|
121
174
|
uuid: this.uuid
|
|
122
175
|
});
|
|
123
176
|
// Mark block as completed to pad it
|
|
124
|
-
|
|
177
|
+
const expectedBlockHeader = block.getBlockHeader();
|
|
178
|
+
await this.prover.setBlockCompleted(block.number, expectedBlockHeader);
|
|
125
179
|
});
|
|
126
180
|
const executionTime = timer.ms();
|
|
127
181
|
this.progressState('awaiting-prover');
|
|
128
|
-
const { publicInputs, proof } = await this.prover.
|
|
129
|
-
this.log.info(`
|
|
182
|
+
const { publicInputs, proof, batchedBlobInputs } = await this.prover.finalizeEpoch();
|
|
183
|
+
this.log.info(`Finalized proof for epoch ${epochNumber}`, {
|
|
130
184
|
epochNumber,
|
|
131
185
|
uuid: this.uuid,
|
|
132
186
|
duration: timer.ms()
|
|
133
187
|
});
|
|
134
188
|
this.progressState('publishing-proof');
|
|
189
|
+
if (this.config.skipSubmitProof) {
|
|
190
|
+
this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`);
|
|
191
|
+
this.state = 'completed';
|
|
192
|
+
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
135
195
|
const success = await this.publisher.submitEpochProof({
|
|
136
196
|
fromBlock,
|
|
137
197
|
toBlock,
|
|
138
198
|
epochNumber,
|
|
139
199
|
publicInputs,
|
|
140
|
-
proof
|
|
200
|
+
proof,
|
|
201
|
+
batchedBlobInputs,
|
|
202
|
+
attestations
|
|
141
203
|
});
|
|
142
204
|
if (!success) {
|
|
143
205
|
throw new Error('Failed to submit epoch proof to L1');
|
|
@@ -152,7 +214,8 @@ import * as crypto from 'node:crypto';
|
|
|
152
214
|
if (err && err.name === 'HaltExecutionError') {
|
|
153
215
|
this.log.warn(`Halted execution of epoch ${epochNumber} prover job`, {
|
|
154
216
|
uuid: this.uuid,
|
|
155
|
-
epochNumber
|
|
217
|
+
epochNumber,
|
|
218
|
+
details: err.message
|
|
156
219
|
});
|
|
157
220
|
return;
|
|
158
221
|
}
|
|
@@ -160,27 +223,41 @@ import * as crypto from 'node:crypto';
|
|
|
160
223
|
uuid: this.uuid,
|
|
161
224
|
epochNumber
|
|
162
225
|
});
|
|
163
|
-
this.state
|
|
226
|
+
if (this.state === 'processing' || this.state === 'awaiting-prover' || this.state === 'publishing-proof') {
|
|
227
|
+
this.state = 'failed';
|
|
228
|
+
}
|
|
164
229
|
} finally{
|
|
165
230
|
clearTimeout(this.deadlineTimeoutHandler);
|
|
166
|
-
await this.
|
|
231
|
+
await this.epochCheckPromise?.stop();
|
|
167
232
|
await this.prover.stop();
|
|
168
233
|
resolve();
|
|
169
234
|
}
|
|
170
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Create a new db fork for tx processing, inserting all L1 to L2.
|
|
238
|
+
* REFACTOR: The prover already spawns a db fork of its own for each block, so we may be able to do away with just one fork.
|
|
239
|
+
*/ async createFork(blockNumber, l1ToL2Messages) {
|
|
240
|
+
const db = await this.dbProvider.fork(blockNumber);
|
|
241
|
+
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 'Too many L1 to L2 messages');
|
|
242
|
+
this.log.verbose(`Creating fork at ${blockNumber} with ${l1ToL2Messages.length} L1 to L2 messages`, {
|
|
243
|
+
blockNumber,
|
|
244
|
+
l1ToL2Messages: l1ToL2Messages.map((m)=>m.toString())
|
|
245
|
+
});
|
|
246
|
+
await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
247
|
+
return db;
|
|
248
|
+
}
|
|
171
249
|
progressState(state) {
|
|
172
250
|
this.checkState();
|
|
173
251
|
this.state = state;
|
|
174
252
|
}
|
|
175
253
|
checkState() {
|
|
176
|
-
if (this.state === 'timed-out' || this.state === 'stopped' || this.state === 'failed') {
|
|
254
|
+
if (this.state === 'timed-out' || this.state === 'stopped' || this.state === 'failed' || this.state === 'reorg') {
|
|
177
255
|
throw new HaltExecutionError(this.state);
|
|
178
256
|
}
|
|
179
257
|
}
|
|
180
258
|
async stop(state = 'stopped') {
|
|
181
259
|
this.state = state;
|
|
182
260
|
this.prover.cancel();
|
|
183
|
-
// TODO(palla/prover): Stop the publisher as well
|
|
184
261
|
if (this.runPromise) {
|
|
185
262
|
await this.runPromise;
|
|
186
263
|
}
|
|
@@ -209,22 +286,47 @@ import * as crypto from 'node:crypto';
|
|
|
209
286
|
}, timeout);
|
|
210
287
|
}
|
|
211
288
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
289
|
+
/**
|
|
290
|
+
* Kicks off a running promise that queries the archiver for the set of L2 blocks of the current epoch.
|
|
291
|
+
* If those change, stops the proving job with a `rerun` state, so the node re-enqueues it.
|
|
292
|
+
*/ async scheduleEpochCheck() {
|
|
293
|
+
const l2BlockSource = this.l2BlockSource;
|
|
294
|
+
if (!l2BlockSource) {
|
|
295
|
+
this.log.warn(`No L2 block source available, skipping epoch check`);
|
|
296
|
+
return;
|
|
215
297
|
}
|
|
216
|
-
|
|
298
|
+
const intervalMs = Math.ceil((await l2BlockSource.getL1Constants()).ethereumSlotDuration / 2) * 1000;
|
|
299
|
+
this.epochCheckPromise = new RunningPromise(async ()=>{
|
|
300
|
+
const blocks = await l2BlockSource.getBlockHeadersForEpoch(this.epochNumber);
|
|
301
|
+
const blockHashes = await Promise.all(blocks.map((block)=>block.hash()));
|
|
302
|
+
const thisBlockHashes = await Promise.all(this.blocks.map((block)=>block.hash()));
|
|
303
|
+
if (blocks.length !== this.blocks.length || !blockHashes.every((block, i)=>block.equals(thisBlockHashes[i]))) {
|
|
304
|
+
this.log.warn('Epoch blocks changed underfoot', {
|
|
305
|
+
uuid: this.uuid,
|
|
306
|
+
epochNumber: this.epochNumber,
|
|
307
|
+
oldBlockHashes: thisBlockHashes,
|
|
308
|
+
newBlockHashes: blockHashes
|
|
309
|
+
});
|
|
310
|
+
void this.stop('reorg');
|
|
311
|
+
}
|
|
312
|
+
}, this.log, intervalMs).start();
|
|
313
|
+
this.log.verbose(`Scheduled epoch check for epoch ${this.epochNumber} every ${intervalMs}ms`);
|
|
217
314
|
}
|
|
218
|
-
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
315
|
+
/* Returns the header for the given block number based on the epoch proving job data. */ getBlockHeader(blockNumber) {
|
|
316
|
+
const block = this.blocks.find((b)=>b.number === blockNumber);
|
|
317
|
+
if (block) {
|
|
318
|
+
return block.getBlockHeader();
|
|
319
|
+
}
|
|
320
|
+
if (blockNumber === Number(this.data.previousBlockHeader.getBlockNumber())) {
|
|
321
|
+
return this.data.previousBlockHeader;
|
|
322
|
+
}
|
|
323
|
+
throw new Error(`Block header not found for block number ${blockNumber} (got ${this.blocks.map((b)=>b.number).join(', ')} and previous header ${this.data.previousBlockHeader.getBlockNumber()})`);
|
|
324
|
+
}
|
|
325
|
+
getTxs(block) {
|
|
326
|
+
return block.body.txEffects.map((txEffect)=>this.txs.get(txEffect.txHash.toString()));
|
|
225
327
|
}
|
|
226
328
|
getL1ToL2Messages(block) {
|
|
227
|
-
return this.
|
|
329
|
+
return this.data.l1ToL2Messages[block.number];
|
|
228
330
|
}
|
|
229
331
|
async processTxs(publicProcessor, txs) {
|
|
230
332
|
const { deadline } = this;
|
|
@@ -232,7 +334,8 @@ import * as crypto from 'node:crypto';
|
|
|
232
334
|
deadline
|
|
233
335
|
});
|
|
234
336
|
if (failedTxs.length) {
|
|
235
|
-
|
|
337
|
+
const failedTxHashes = await Promise.all(failedTxs.map(({ tx })=>tx.getTxHash()));
|
|
338
|
+
throw new Error(`Txs failed processing: ${failedTxs.map(({ error }, index)=>`${failedTxHashes[index]} (${error})`).join(', ')}`);
|
|
236
339
|
}
|
|
237
340
|
if (processedTxs.length !== txs.length) {
|
|
238
341
|
throw new Error(`Failed to process all txs: processed ${processedTxs.length} out of ${txs.length}`);
|
|
@@ -243,13 +346,14 @@ import * as crypto from 'node:crypto';
|
|
|
243
346
|
_ts_decorate([
|
|
244
347
|
trackSpan('EpochProvingJob.run', function() {
|
|
245
348
|
return {
|
|
246
|
-
[Attributes.EPOCH_NUMBER]:
|
|
349
|
+
[Attributes.EPOCH_NUMBER]: this.data.epochNumber
|
|
247
350
|
};
|
|
248
351
|
})
|
|
249
352
|
], EpochProvingJob.prototype, "run", null);
|
|
250
353
|
class HaltExecutionError extends Error {
|
|
354
|
+
state;
|
|
251
355
|
constructor(state){
|
|
252
|
-
super(`Halted execution due to state ${state}`);
|
|
356
|
+
super(`Halted execution due to state ${state}`), this.state = state;
|
|
253
357
|
this.name = 'HaltExecutionError';
|
|
254
358
|
}
|
|
255
359
|
}
|
package/dest/metrics.d.ts
CHANGED
|
@@ -1,12 +1,35 @@
|
|
|
1
|
+
import type { RollupContract } from '@aztec/ethereum';
|
|
2
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
1
3
|
import type { L1PublishProofStats } from '@aztec/stdlib/stats';
|
|
2
|
-
import { type Gauge, type Histogram, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
|
|
3
|
-
export declare class
|
|
4
|
-
|
|
4
|
+
import { type Gauge, type Histogram, type Meter, type TelemetryClient, type Tracer, type UpDownCounter } from '@aztec/telemetry-client';
|
|
5
|
+
export declare class ProverNodeJobMetrics {
|
|
6
|
+
private meter;
|
|
7
|
+
readonly tracer: Tracer;
|
|
5
8
|
private logger;
|
|
6
9
|
proverEpochExecutionDuration: Histogram;
|
|
7
10
|
provingJobDuration: Histogram;
|
|
8
11
|
provingJobBlocks: Gauge;
|
|
9
12
|
provingJobTransactions: Gauge;
|
|
13
|
+
constructor(meter: Meter, tracer: Tracer, logger?: import("@aztec/foundation/log").Logger);
|
|
14
|
+
recordProvingJob(executionTimeMs: number, totalTimeMs: number, numBlocks: number, numTxs: number): void;
|
|
15
|
+
}
|
|
16
|
+
export declare class ProverNodeRewardsMetrics {
|
|
17
|
+
private meter;
|
|
18
|
+
private coinbase;
|
|
19
|
+
private rollup;
|
|
20
|
+
private logger;
|
|
21
|
+
private rewards;
|
|
22
|
+
private accumulatedRewards;
|
|
23
|
+
private prevEpoch;
|
|
24
|
+
private proofSubmissionEpochs;
|
|
25
|
+
constructor(meter: Meter, coinbase: EthAddress, rollup: RollupContract, logger?: import("@aztec/foundation/log").Logger);
|
|
26
|
+
start(): Promise<void>;
|
|
27
|
+
stop(): void;
|
|
28
|
+
private observe;
|
|
29
|
+
}
|
|
30
|
+
export declare class ProverNodePublisherMetrics {
|
|
31
|
+
readonly client: TelemetryClient;
|
|
32
|
+
private logger;
|
|
10
33
|
gasPrice: Histogram;
|
|
11
34
|
txCount: UpDownCounter;
|
|
12
35
|
txDuration: Histogram;
|
|
@@ -15,12 +38,13 @@ export declare class ProverNodeMetrics {
|
|
|
15
38
|
txCalldataGas: Histogram;
|
|
16
39
|
txBlobDataGasUsed: Histogram;
|
|
17
40
|
txBlobDataGasCost: Histogram;
|
|
41
|
+
txTotalFee: Histogram;
|
|
18
42
|
private senderBalance;
|
|
43
|
+
private meter;
|
|
19
44
|
constructor(client: TelemetryClient, name?: string, logger?: import("@aztec/foundation/log").Logger);
|
|
20
45
|
recordFailedTx(): void;
|
|
21
46
|
recordSubmitProof(durationMs: number, stats: L1PublishProofStats): void;
|
|
22
|
-
recordProvingJob(executionTimeMs: number, totalTimeMs: number, numBlocks: number, numTxs: number): void;
|
|
23
47
|
recordSenderBalance(wei: bigint, senderAddress: string): void;
|
|
24
48
|
private recordTx;
|
|
25
49
|
}
|
|
26
|
-
//# sourceMappingURL=
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxxQkFBYSxvQkFBb0I7SUFPN0IsT0FBTyxDQUFDLEtBQUs7YUFDRyxNQUFNLEVBQUUsTUFBTTtJQUM5QixPQUFPLENBQUMsTUFBTTtJQVJoQiw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDeEMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQzlCLGdCQUFnQixFQUFFLEtBQUssQ0FBQztJQUN4QixzQkFBc0IsRUFBRSxLQUFLLENBQUM7SUFFOUIsWUFDVSxLQUFLLEVBQUUsS0FBSyxFQUNKLE1BQU0sRUFBRSxNQUFNLEVBQ3RCLE1BQU0seUNBQWdELEVBb0IvRDtJQUVNLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBS3RHO0NBQ0Y7QUFFRCxxQkFBYSx3QkFBd0I7SUFPakMsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxNQUFNO0lBVGhCLE9BQU8sQ0FBQyxPQUFPLENBQWtCO0lBQ2pDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBZ0I7SUFDMUMsT0FBTyxDQUFDLFNBQVMsQ0FBTztJQUN4QixPQUFPLENBQUMscUJBQXFCLENBQUs7SUFFbEMsWUFDVSxLQUFLLEVBQUUsS0FBSyxFQUNaLFFBQVEsRUFBRSxVQUFVLEVBQ3BCLE1BQU0sRUFBRSxjQUFjLEVBQ3RCLE1BQU0seUNBQWdELEVBVy9EO0lBRVksS0FBSyxrQkFJakI7SUFFTSxJQUFJLFNBRVY7SUFFRCxPQUFPLENBQUMsT0FBTyxDQXdCYjtDQUNIO0FBRUQscUJBQWEsMEJBQTBCO2FBZW5CLE1BQU0sRUFBRSxlQUFlO0lBRXZDLE9BQU8sQ0FBQyxNQUFNO0lBaEJoQixRQUFRLEVBQUUsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sRUFBRSxhQUFhLENBQUM7SUFDdkIsVUFBVSxFQUFFLFNBQVMsQ0FBQztJQUN0QixLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ2pCLGNBQWMsRUFBRSxTQUFTLENBQUM7SUFDMUIsYUFBYSxFQUFFLFNBQVMsQ0FBQztJQUN6QixpQkFBaUIsRUFBRSxTQUFTLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQzdCLFVBQVUsRUFBRSxTQUFTLENBQUM7SUFFdEIsT0FBTyxDQUFDLGFBQWEsQ0FBUTtJQUM3QixPQUFPLENBQUMsS0FBSyxDQUFRO0lBRXJCLFlBQ2tCLE1BQU0sRUFBRSxlQUFlLEVBQ3ZDLElBQUksU0FBZSxFQUNYLE1BQU0seUNBQWdELEVBa0UvRDtJQUVELGNBQWMsU0FLYjtJQUVELGlCQUFpQixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixRQUUvRDtJQUVNLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFLNUQ7SUFFRCxPQUFPLENBQUMsUUFBUTtDQXVDakIifQ==
|
package/dest/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,KAAK,EAGV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,KAAK;aACG,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,MAAM;IARhB,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,gBAAgB,EAAE,KAAK,CAAC;IACxB,sBAAsB,EAAE,KAAK,CAAC;IAE9B,YACU,KAAK,EAAE,KAAK,EACJ,MAAM,EAAE,MAAM,EACtB,MAAM,yCAAgD,EAoB/D;IAEM,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAKtG;CACF;AAED,qBAAa,wBAAwB;IAOjC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAThB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,qBAAqB,CAAK;IAElC,YACU,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,cAAc,EACtB,MAAM,yCAAgD,EAW/D;IAEY,KAAK,kBAIjB;IAEM,IAAI,SAEV;IAED,OAAO,CAAC,OAAO,CAwBb;CACH;AAED,qBAAa,0BAA0B;aAenB,MAAM,EAAE,eAAe;IAEvC,OAAO,CAAC,MAAM;IAhBhB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IAEtB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAQ;IAErB,YACkB,MAAM,EAAE,eAAe,EACvC,IAAI,SAAe,EACX,MAAM,yCAAgD,EAkE/D;IAED,cAAc,SAKb;IAED,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,QAE/D;IAEM,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAK5D;IAED,OAAO,CAAC,QAAQ;CAuCjB"}
|