@aztec/prover-node 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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/bond/bond-manager.js +10 -12
- package/dest/bond/config.js +3 -4
- package/dest/bond/escrow-contract.js +23 -15
- package/dest/bond/factory.js +4 -2
- package/dest/bond/index.js +0 -1
- package/dest/bond/token-contract.js +52 -29
- package/dest/config.js +20 -21
- package/dest/factory.js +26 -14
- package/dest/http.js +1 -3
- package/dest/index.js +0 -1
- package/dest/job/epoch-proving-job.js +230 -190
- package/dest/metrics.js +33 -23
- package/dest/monitors/claims-monitor.js +52 -51
- package/dest/monitors/epoch-monitor.js +48 -47
- package/dest/monitors/index.js +0 -1
- package/dest/prover-coordination/config.js +2 -3
- package/dest/prover-coordination/factory.js +8 -7
- package/dest/prover-coordination/index.js +0 -1
- package/dest/prover-node-publisher.js +46 -43
- package/dest/prover-node.js +303 -308
- package/dest/quote-provider/http.js +11 -5
- package/dest/quote-provider/index.js +1 -2
- package/dest/quote-provider/simple.js +7 -3
- package/dest/quote-provider/utils.js +2 -3
- package/dest/quote-signer.js +6 -3
- package/dest/test/index.js +2 -1
- package/package.json +19 -19
- package/src/prover-node.ts +34 -62
- package/dest/bond/bond-manager.d.ts +0 -22
- package/dest/bond/bond-manager.d.ts.map +0 -1
- package/dest/bond/config.d.ts +0 -8
- package/dest/bond/config.d.ts.map +0 -1
- package/dest/bond/escrow-contract.d.ts +0 -19
- package/dest/bond/escrow-contract.d.ts.map +0 -1
- package/dest/bond/factory.d.ts +0 -6
- package/dest/bond/factory.d.ts.map +0 -1
- package/dest/bond/index.d.ts +0 -3
- package/dest/bond/index.d.ts.map +0 -1
- package/dest/bond/token-contract.d.ts +0 -26
- package/dest/bond/token-contract.d.ts.map +0 -1
- package/dest/config.d.ts +0 -31
- package/dest/config.d.ts.map +0 -1
- package/dest/factory.d.ts +0 -22
- package/dest/factory.d.ts.map +0 -1
- package/dest/http.d.ts +0 -8
- package/dest/http.d.ts.map +0 -1
- package/dest/index.d.ts +0 -6
- package/dest/index.d.ts.map +0 -1
- package/dest/job/epoch-proving-job.d.ts +0 -50
- package/dest/job/epoch-proving-job.d.ts.map +0 -1
- package/dest/metrics.d.ts +0 -23
- package/dest/metrics.d.ts.map +0 -1
- package/dest/monitors/claims-monitor.d.ts +0 -24
- package/dest/monitors/claims-monitor.d.ts.map +0 -1
- package/dest/monitors/epoch-monitor.d.ts +0 -22
- package/dest/monitors/epoch-monitor.d.ts.map +0 -1
- package/dest/monitors/index.d.ts +0 -3
- package/dest/monitors/index.d.ts.map +0 -1
- package/dest/prover-coordination/config.d.ts +0 -7
- package/dest/prover-coordination/config.d.ts.map +0 -1
- package/dest/prover-coordination/factory.d.ts +0 -22
- package/dest/prover-coordination/factory.d.ts.map +0 -1
- package/dest/prover-coordination/index.d.ts +0 -3
- package/dest/prover-coordination/index.d.ts.map +0 -1
- package/dest/prover-node-publisher.d.ts +0 -67
- package/dest/prover-node-publisher.d.ts.map +0 -1
- package/dest/prover-node.d.ts +0 -107
- package/dest/prover-node.d.ts.map +0 -1
- package/dest/quote-provider/http.d.ts +0 -15
- package/dest/quote-provider/http.d.ts.map +0 -1
- package/dest/quote-provider/index.d.ts +0 -6
- package/dest/quote-provider/index.d.ts.map +0 -1
- package/dest/quote-provider/simple.d.ts +0 -9
- package/dest/quote-provider/simple.d.ts.map +0 -1
- package/dest/quote-provider/utils.d.ts +0 -4
- package/dest/quote-provider/utils.d.ts.map +0 -1
- package/dest/quote-signer.d.ts +0 -13
- package/dest/quote-signer.d.ts.map +0 -1
- package/dest/test/index.d.ts +0 -10
- package/dest/test/index.d.ts.map +0 -1
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
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
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
import { EpochProvingJobTerminalState } from '@aztec/circuit-types';
|
|
3
8
|
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
4
9
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
10
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
@@ -10,203 +15,238 @@ import * as crypto from 'node:crypto';
|
|
|
10
15
|
* Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
|
|
11
16
|
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
12
17
|
* world state as part of public call execution via the public processor.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
*/ export class EpochProvingJob {
|
|
19
|
+
dbProvider;
|
|
20
|
+
epochNumber;
|
|
21
|
+
blocks;
|
|
22
|
+
txs;
|
|
23
|
+
prover;
|
|
24
|
+
publicProcessorFactory;
|
|
25
|
+
publisher;
|
|
26
|
+
l2BlockSource;
|
|
27
|
+
l1ToL2MessageSource;
|
|
28
|
+
metrics;
|
|
29
|
+
deadline;
|
|
30
|
+
config;
|
|
31
|
+
cleanUp;
|
|
32
|
+
state;
|
|
33
|
+
log;
|
|
34
|
+
uuid;
|
|
35
|
+
runPromise;
|
|
36
|
+
deadlineTimeoutHandler;
|
|
37
|
+
tracer;
|
|
38
|
+
constructor(dbProvider, epochNumber, blocks, txs, prover, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, metrics, deadline, config = {
|
|
39
|
+
parallelBlockLimit: 32
|
|
40
|
+
}, cleanUp = ()=>Promise.resolve()){
|
|
41
|
+
this.dbProvider = dbProvider;
|
|
42
|
+
this.epochNumber = epochNumber;
|
|
43
|
+
this.blocks = blocks;
|
|
44
|
+
this.txs = txs;
|
|
45
|
+
this.prover = prover;
|
|
46
|
+
this.publicProcessorFactory = publicProcessorFactory;
|
|
47
|
+
this.publisher = publisher;
|
|
48
|
+
this.l2BlockSource = l2BlockSource;
|
|
49
|
+
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
50
|
+
this.metrics = metrics;
|
|
51
|
+
this.deadline = deadline;
|
|
52
|
+
this.config = config;
|
|
53
|
+
this.cleanUp = cleanUp;
|
|
54
|
+
this.state = 'initialized';
|
|
55
|
+
this.log = createLogger('prover-node:epoch-proving-job');
|
|
56
|
+
this.uuid = crypto.randomUUID();
|
|
57
|
+
this.tracer = metrics.client.getTracer('EpochProvingJob');
|
|
58
|
+
}
|
|
59
|
+
getId() {
|
|
60
|
+
return this.uuid;
|
|
61
|
+
}
|
|
62
|
+
getState() {
|
|
63
|
+
return this.state;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Proves the given epoch and submits the proof to L1.
|
|
67
|
+
*/ async run() {
|
|
68
|
+
this.scheduleDeadlineStop();
|
|
69
|
+
const epochNumber = Number(this.epochNumber);
|
|
70
|
+
const epochSizeBlocks = this.blocks.length;
|
|
71
|
+
const epochSizeTxs = this.blocks.reduce((total, current)=>total + current.body.txEffects.length, 0);
|
|
72
|
+
const [fromBlock, toBlock] = [
|
|
73
|
+
this.blocks[0].number,
|
|
74
|
+
this.blocks.at(-1).number
|
|
75
|
+
];
|
|
76
|
+
this.log.info(`Starting epoch ${epochNumber} proving job with blocks ${fromBlock} to ${toBlock}`, {
|
|
77
|
+
fromBlock,
|
|
78
|
+
toBlock,
|
|
79
|
+
epochSizeBlocks,
|
|
80
|
+
epochNumber,
|
|
81
|
+
uuid: this.uuid
|
|
82
|
+
});
|
|
83
|
+
this.progressState('processing');
|
|
84
|
+
const timer = new Timer();
|
|
85
|
+
const { promise, resolve } = promiseWithResolvers();
|
|
86
|
+
this.runPromise = promise;
|
|
87
|
+
try {
|
|
88
|
+
this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks);
|
|
89
|
+
await this.prover.startTubeCircuits(this.txs);
|
|
90
|
+
await asyncPool(this.config.parallelBlockLimit, this.blocks, async (block)=>{
|
|
91
|
+
this.checkState();
|
|
92
|
+
const globalVariables = block.header.globalVariables;
|
|
93
|
+
const txs = await this.getTxs(block);
|
|
94
|
+
const l1ToL2Messages = await this.getL1ToL2Messages(block);
|
|
95
|
+
const previousHeader = await this.getBlockHeader(block.number - 1);
|
|
96
|
+
this.log.verbose(`Starting processing block ${block.number}`, {
|
|
97
|
+
number: block.number,
|
|
98
|
+
blockHash: (await block.hash()).toString(),
|
|
99
|
+
lastArchive: block.header.lastArchive.root,
|
|
100
|
+
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
101
|
+
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
102
|
+
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
103
|
+
previousHeader: previousHeader.hash(),
|
|
104
|
+
uuid: this.uuid,
|
|
105
|
+
...globalVariables
|
|
106
|
+
});
|
|
107
|
+
// Start block proving
|
|
108
|
+
await this.prover.startNewBlock(globalVariables, l1ToL2Messages, previousHeader);
|
|
109
|
+
// Process public fns
|
|
110
|
+
const db = await this.dbProvider.fork(block.number - 1);
|
|
111
|
+
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, true);
|
|
112
|
+
const processed = await this.processTxs(publicProcessor, txs);
|
|
113
|
+
await this.prover.addTxs(processed);
|
|
114
|
+
await db.close();
|
|
115
|
+
this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
|
|
116
|
+
blockNumber: block.number,
|
|
117
|
+
blockHash: (await block.hash()).toString(),
|
|
118
|
+
uuid: this.uuid
|
|
119
|
+
});
|
|
120
|
+
// Mark block as completed to pad it
|
|
121
|
+
await this.prover.setBlockCompleted(block.number, block.header);
|
|
122
|
+
});
|
|
123
|
+
const executionTime = timer.ms();
|
|
124
|
+
this.progressState('awaiting-prover');
|
|
125
|
+
const { publicInputs, proof } = await this.prover.finaliseEpoch();
|
|
126
|
+
this.log.info(`Finalised proof for epoch ${epochNumber}`, {
|
|
127
|
+
epochNumber,
|
|
128
|
+
uuid: this.uuid,
|
|
129
|
+
duration: timer.ms()
|
|
130
|
+
});
|
|
131
|
+
this.progressState('publishing-proof');
|
|
132
|
+
const success = await this.publisher.submitEpochProof({
|
|
133
|
+
fromBlock,
|
|
134
|
+
toBlock,
|
|
135
|
+
epochNumber,
|
|
136
|
+
publicInputs,
|
|
137
|
+
proof
|
|
138
|
+
});
|
|
139
|
+
if (!success) {
|
|
140
|
+
throw new Error('Failed to submit epoch proof to L1');
|
|
37
141
|
}
|
|
38
|
-
|
|
39
|
-
|
|
142
|
+
this.log.info(`Submitted proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`, {
|
|
143
|
+
epochNumber,
|
|
144
|
+
uuid: this.uuid
|
|
145
|
+
});
|
|
146
|
+
this.state = 'completed';
|
|
147
|
+
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
|
|
148
|
+
} catch (err) {
|
|
149
|
+
if (err && err.name === 'HaltExecutionError') {
|
|
150
|
+
this.log.warn(`Halted execution of epoch ${epochNumber} prover job`, {
|
|
151
|
+
uuid: this.uuid,
|
|
152
|
+
epochNumber
|
|
153
|
+
});
|
|
154
|
+
return;
|
|
40
155
|
}
|
|
41
|
-
|
|
42
|
-
|
|
156
|
+
this.log.error(`Error running epoch ${epochNumber} prover job`, err, {
|
|
157
|
+
uuid: this.uuid,
|
|
158
|
+
epochNumber
|
|
159
|
+
});
|
|
160
|
+
this.state = 'failed';
|
|
161
|
+
} finally{
|
|
162
|
+
clearTimeout(this.deadlineTimeoutHandler);
|
|
163
|
+
await this.cleanUp(this);
|
|
164
|
+
await this.prover.stop();
|
|
165
|
+
resolve();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
progressState(state) {
|
|
169
|
+
this.checkState();
|
|
170
|
+
this.state = state;
|
|
171
|
+
}
|
|
172
|
+
checkState() {
|
|
173
|
+
if (this.state === 'timed-out' || this.state === 'stopped' || this.state === 'failed') {
|
|
174
|
+
throw new HaltExecutionError(this.state);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async stop(state = 'stopped') {
|
|
178
|
+
this.state = state;
|
|
179
|
+
this.prover.cancel();
|
|
180
|
+
// TODO(palla/prover): Stop the publisher as well
|
|
181
|
+
if (this.runPromise) {
|
|
182
|
+
await this.runPromise;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
scheduleDeadlineStop() {
|
|
186
|
+
const deadline = this.deadline;
|
|
187
|
+
if (deadline) {
|
|
188
|
+
const timeout = deadline.getTime() - Date.now();
|
|
189
|
+
if (timeout <= 0) {
|
|
190
|
+
throw new Error('Cannot start job with deadline in the past');
|
|
43
191
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
this.
|
|
49
|
-
const epochNumber = Number(this.epochNumber);
|
|
50
|
-
const epochSizeBlocks = this.blocks.length;
|
|
51
|
-
const epochSizeTxs = this.blocks.reduce((total, current) => total + current.body.txEffects.length, 0);
|
|
52
|
-
const [fromBlock, toBlock] = [this.blocks[0].number, this.blocks.at(-1).number];
|
|
53
|
-
this.log.info(`Starting epoch ${epochNumber} proving job with blocks ${fromBlock} to ${toBlock}`, {
|
|
54
|
-
fromBlock,
|
|
55
|
-
toBlock,
|
|
56
|
-
epochSizeBlocks,
|
|
57
|
-
epochNumber,
|
|
192
|
+
this.deadlineTimeoutHandler = setTimeout(()=>{
|
|
193
|
+
if (EpochProvingJobTerminalState.includes(this.state)) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
this.log.warn('Stopping job due to deadline hit', {
|
|
58
197
|
uuid: this.uuid,
|
|
198
|
+
epochNumber: this.epochNumber
|
|
59
199
|
});
|
|
60
|
-
this.
|
|
61
|
-
|
|
62
|
-
const { promise, resolve } = promiseWithResolvers();
|
|
63
|
-
this.runPromise = promise;
|
|
64
|
-
try {
|
|
65
|
-
this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks);
|
|
66
|
-
await this.prover.startTubeCircuits(this.txs);
|
|
67
|
-
await asyncPool(this.config.parallelBlockLimit, this.blocks, async (block) => {
|
|
68
|
-
this.checkState();
|
|
69
|
-
const globalVariables = block.header.globalVariables;
|
|
70
|
-
const txs = await this.getTxs(block);
|
|
71
|
-
const l1ToL2Messages = await this.getL1ToL2Messages(block);
|
|
72
|
-
const previousHeader = (await this.getBlockHeader(block.number - 1));
|
|
73
|
-
this.log.verbose(`Starting processing block ${block.number}`, {
|
|
74
|
-
number: block.number,
|
|
75
|
-
blockHash: (await block.hash()).toString(),
|
|
76
|
-
lastArchive: block.header.lastArchive.root,
|
|
77
|
-
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
78
|
-
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
79
|
-
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
80
|
-
previousHeader: previousHeader.hash(),
|
|
81
|
-
uuid: this.uuid,
|
|
82
|
-
...globalVariables,
|
|
83
|
-
});
|
|
84
|
-
// Start block proving
|
|
85
|
-
await this.prover.startNewBlock(globalVariables, l1ToL2Messages, previousHeader);
|
|
86
|
-
// Process public fns
|
|
87
|
-
const db = await this.dbProvider.fork(block.number - 1);
|
|
88
|
-
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, true);
|
|
89
|
-
const processed = await this.processTxs(publicProcessor, txs);
|
|
90
|
-
await this.prover.addTxs(processed);
|
|
91
|
-
await db.close();
|
|
92
|
-
this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
|
|
93
|
-
blockNumber: block.number,
|
|
94
|
-
blockHash: (await block.hash()).toString(),
|
|
95
|
-
uuid: this.uuid,
|
|
96
|
-
});
|
|
97
|
-
// Mark block as completed to pad it
|
|
98
|
-
await this.prover.setBlockCompleted(block.number, block.header);
|
|
99
|
-
});
|
|
100
|
-
const executionTime = timer.ms();
|
|
101
|
-
this.progressState('awaiting-prover');
|
|
102
|
-
const { publicInputs, proof } = await this.prover.finaliseEpoch();
|
|
103
|
-
this.log.info(`Finalised proof for epoch ${epochNumber}`, { epochNumber, uuid: this.uuid, duration: timer.ms() });
|
|
104
|
-
this.progressState('publishing-proof');
|
|
105
|
-
const success = await this.publisher.submitEpochProof({ fromBlock, toBlock, epochNumber, publicInputs, proof });
|
|
106
|
-
if (!success) {
|
|
107
|
-
throw new Error('Failed to submit epoch proof to L1');
|
|
108
|
-
}
|
|
109
|
-
this.log.info(`Submitted proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`, {
|
|
110
|
-
epochNumber,
|
|
200
|
+
this.stop('timed-out').catch((err)=>{
|
|
201
|
+
this.log.error('Error stopping job', err, {
|
|
111
202
|
uuid: this.uuid,
|
|
203
|
+
epochNumber: this.epochNumber
|
|
112
204
|
});
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
this.deadlineTimeoutHandler = setTimeout(() => {
|
|
156
|
-
if (EpochProvingJobTerminalState.includes(this.state)) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
this.log.warn('Stopping job due to deadline hit', { uuid: this.uuid, epochNumber: this.epochNumber });
|
|
160
|
-
this.stop('timed-out').catch(err => {
|
|
161
|
-
this.log.error('Error stopping job', err, { uuid: this.uuid, epochNumber: this.epochNumber });
|
|
162
|
-
});
|
|
163
|
-
}, timeout);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
/* Returns the header for the given block number, or the genesis block for block zero. */
|
|
167
|
-
async getBlockHeader(blockNumber) {
|
|
168
|
-
if (blockNumber === 0) {
|
|
169
|
-
return (await this.dbProvider.fork()).getInitialHeader();
|
|
170
|
-
}
|
|
171
|
-
return this.l2BlockSource.getBlockHeader(blockNumber);
|
|
172
|
-
}
|
|
173
|
-
async getTxs(block) {
|
|
174
|
-
const txHashes = block.body.txEffects.map(tx => tx.txHash.toBigInt());
|
|
175
|
-
const txsAndHashes = await Promise.all(this.txs.map(async (tx) => ({ tx, hash: await tx.getTxHash() })));
|
|
176
|
-
return txsAndHashes
|
|
177
|
-
.filter(txAndHash => txHashes.includes(txAndHash.hash.toBigInt()))
|
|
178
|
-
.map(txAndHash => txAndHash.tx);
|
|
179
|
-
}
|
|
180
|
-
getL1ToL2Messages(block) {
|
|
181
|
-
return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
|
|
182
|
-
}
|
|
183
|
-
async processTxs(publicProcessor, txs) {
|
|
184
|
-
const { deadline } = this;
|
|
185
|
-
const [processedTxs, failedTxs] = await publicProcessor.process(txs, { deadline });
|
|
186
|
-
if (failedTxs.length) {
|
|
187
|
-
throw new Error(`Txs failed processing: ${failedTxs.map(({ tx, error }) => `${tx.getTxHash()} (${error})`).join(', ')}`);
|
|
188
|
-
}
|
|
189
|
-
if (processedTxs.length !== txs.length) {
|
|
190
|
-
throw new Error(`Failed to process all txs: processed ${processedTxs.length} out of ${txs.length}`);
|
|
191
|
-
}
|
|
192
|
-
return processedTxs;
|
|
193
|
-
}
|
|
194
|
-
},
|
|
195
|
-
(() => {
|
|
196
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
197
|
-
_run_decorators = [trackSpan('EpochProvingJob.run', function () {
|
|
198
|
-
return { [Attributes.EPOCH_NUMBER]: Number(this.epochNumber) };
|
|
199
|
-
})];
|
|
200
|
-
__esDecorate(_a, null, _run_decorators, { kind: "method", name: "run", static: false, private: false, access: { has: obj => "run" in obj, get: obj => obj.run }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
201
|
-
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
202
|
-
})(),
|
|
203
|
-
_a;
|
|
204
|
-
})();
|
|
205
|
-
export { EpochProvingJob };
|
|
205
|
+
});
|
|
206
|
+
}, timeout);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/* Returns the header for the given block number, or the genesis block for block zero. */ async getBlockHeader(blockNumber) {
|
|
210
|
+
if (blockNumber === 0) {
|
|
211
|
+
return (await this.dbProvider.fork()).getInitialHeader();
|
|
212
|
+
}
|
|
213
|
+
return this.l2BlockSource.getBlockHeader(blockNumber);
|
|
214
|
+
}
|
|
215
|
+
async getTxs(block) {
|
|
216
|
+
const txHashes = block.body.txEffects.map((tx)=>tx.txHash.toBigInt());
|
|
217
|
+
const txsAndHashes = await Promise.all(this.txs.map(async (tx)=>({
|
|
218
|
+
tx,
|
|
219
|
+
hash: await tx.getTxHash()
|
|
220
|
+
})));
|
|
221
|
+
return txsAndHashes.filter((txAndHash)=>txHashes.includes(txAndHash.hash.toBigInt())).map((txAndHash)=>txAndHash.tx);
|
|
222
|
+
}
|
|
223
|
+
getL1ToL2Messages(block) {
|
|
224
|
+
return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
|
|
225
|
+
}
|
|
226
|
+
async processTxs(publicProcessor, txs) {
|
|
227
|
+
const { deadline } = this;
|
|
228
|
+
const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
|
|
229
|
+
deadline
|
|
230
|
+
});
|
|
231
|
+
if (failedTxs.length) {
|
|
232
|
+
throw new Error(`Txs failed processing: ${failedTxs.map(({ tx, error })=>`${tx.getTxHash()} (${error})`).join(', ')}`);
|
|
233
|
+
}
|
|
234
|
+
if (processedTxs.length !== txs.length) {
|
|
235
|
+
throw new Error(`Failed to process all txs: processed ${processedTxs.length} out of ${txs.length}`);
|
|
236
|
+
}
|
|
237
|
+
return processedTxs;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
_ts_decorate([
|
|
241
|
+
trackSpan('EpochProvingJob.run', function() {
|
|
242
|
+
return {
|
|
243
|
+
[Attributes.EPOCH_NUMBER]: Number(this.epochNumber)
|
|
244
|
+
};
|
|
245
|
+
})
|
|
246
|
+
], EpochProvingJob.prototype, "run", null);
|
|
206
247
|
class HaltExecutionError extends Error {
|
|
207
|
-
constructor(state)
|
|
248
|
+
constructor(state){
|
|
208
249
|
super(`Halted execution due to state ${state}`);
|
|
209
250
|
this.name = 'HaltExecutionError';
|
|
210
251
|
}
|
|
211
252
|
}
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL2Vwb2NoLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0wsNEJBQTRCLEdBTzdCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFVBQVUsRUFBK0IsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0YsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFLdEM7Ozs7R0FJRztJQUNVLGVBQWU7Ozs7c0JBQWYsZUFBZTtZQVUxQixZQUNVLFVBQW9DLEVBQ3BDLFdBQW1CLEVBQ25CLE1BQWlCLEVBQ2pCLEdBQVMsRUFDVCxNQUFtQixFQUNuQixzQkFBOEMsRUFDOUMsU0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLE9BQTBCLEVBQzFCLFFBQTBCLEVBQzFCLFNBQXlDLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLEVBQ25FLFVBQW1ELEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBWjFFLGVBQVUsSUFYVCxtREFBZSxFQVdoQixVQUFVLEVBQTBCO2dCQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtnQkFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBVztnQkFDakIsUUFBRyxHQUFILEdBQUcsQ0FBTTtnQkFDVCxXQUFNLEdBQU4sTUFBTSxDQUFhO2dCQUNuQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO2dCQUM5QyxjQUFTLEdBQVQs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
|
package/dest/metrics.js
CHANGED
|
@@ -1,70 +1,83 @@
|
|
|
1
|
-
import { Attributes, Metrics, ValueType
|
|
1
|
+
import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
|
|
2
2
|
import { formatEther } from 'viem';
|
|
3
3
|
export class ProverNodeMetrics {
|
|
4
|
-
|
|
4
|
+
client;
|
|
5
|
+
proverEpochExecutionDuration;
|
|
6
|
+
provingJobDuration;
|
|
7
|
+
provingJobBlocks;
|
|
8
|
+
provingJobTransactions;
|
|
9
|
+
gasPrice;
|
|
10
|
+
txCount;
|
|
11
|
+
txDuration;
|
|
12
|
+
txGas;
|
|
13
|
+
txCalldataSize;
|
|
14
|
+
txCalldataGas;
|
|
15
|
+
txBlobDataGasUsed;
|
|
16
|
+
txBlobDataGasCost;
|
|
17
|
+
constructor(client, name = 'ProverNode'){
|
|
5
18
|
this.client = client;
|
|
6
19
|
const meter = client.getMeter(name);
|
|
7
20
|
this.proverEpochExecutionDuration = meter.createHistogram(Metrics.PROVER_NODE_EXECUTION_DURATION, {
|
|
8
21
|
description: 'Duration of execution of an epoch by the prover',
|
|
9
22
|
unit: 'ms',
|
|
10
|
-
valueType: ValueType.INT
|
|
23
|
+
valueType: ValueType.INT
|
|
11
24
|
});
|
|
12
25
|
this.provingJobDuration = meter.createHistogram(Metrics.PROVER_NODE_JOB_DURATION, {
|
|
13
26
|
description: 'Duration of proving job',
|
|
14
27
|
unit: 'ms',
|
|
15
|
-
valueType: ValueType.INT
|
|
28
|
+
valueType: ValueType.INT
|
|
16
29
|
});
|
|
17
30
|
this.provingJobBlocks = meter.createHistogram(Metrics.PROVER_NODE_JOB_BLOCKS, {
|
|
18
31
|
description: 'Number of blocks in a proven epoch',
|
|
19
|
-
valueType: ValueType.INT
|
|
32
|
+
valueType: ValueType.INT
|
|
20
33
|
});
|
|
21
34
|
this.provingJobTransactions = meter.createHistogram(Metrics.PROVER_NODE_JOB_TRANSACTIONS, {
|
|
22
35
|
description: 'Number of transactions in a proven epoch',
|
|
23
|
-
valueType: ValueType.INT
|
|
36
|
+
valueType: ValueType.INT
|
|
24
37
|
});
|
|
25
38
|
this.gasPrice = meter.createHistogram(Metrics.L1_PUBLISHER_GAS_PRICE, {
|
|
26
39
|
description: 'The gas price used for transactions',
|
|
27
40
|
unit: 'gwei',
|
|
28
|
-
valueType: ValueType.DOUBLE
|
|
41
|
+
valueType: ValueType.DOUBLE
|
|
29
42
|
});
|
|
30
43
|
this.txCount = meter.createUpDownCounter(Metrics.L1_PUBLISHER_TX_COUNT, {
|
|
31
|
-
description: 'The number of transactions processed'
|
|
44
|
+
description: 'The number of transactions processed'
|
|
32
45
|
});
|
|
33
46
|
this.txDuration = meter.createHistogram(Metrics.L1_PUBLISHER_TX_DURATION, {
|
|
34
47
|
description: 'The duration of transaction processing',
|
|
35
48
|
unit: 'ms',
|
|
36
|
-
valueType: ValueType.INT
|
|
49
|
+
valueType: ValueType.INT
|
|
37
50
|
});
|
|
38
51
|
this.txGas = meter.createHistogram(Metrics.L1_PUBLISHER_TX_GAS, {
|
|
39
52
|
description: 'The gas consumed by transactions',
|
|
40
53
|
unit: 'gas',
|
|
41
|
-
valueType: ValueType.INT
|
|
54
|
+
valueType: ValueType.INT
|
|
42
55
|
});
|
|
43
56
|
this.txCalldataSize = meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_SIZE, {
|
|
44
57
|
description: 'The size of the calldata in transactions',
|
|
45
58
|
unit: 'By',
|
|
46
|
-
valueType: ValueType.INT
|
|
59
|
+
valueType: ValueType.INT
|
|
47
60
|
});
|
|
48
61
|
this.txCalldataGas = meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_GAS, {
|
|
49
62
|
description: 'The gas consumed by the calldata in transactions',
|
|
50
63
|
unit: 'gas',
|
|
51
|
-
valueType: ValueType.INT
|
|
64
|
+
valueType: ValueType.INT
|
|
52
65
|
});
|
|
53
66
|
this.txBlobDataGasUsed = meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_USED, {
|
|
54
67
|
description: 'The amount of blob gas used in transactions',
|
|
55
68
|
unit: 'gas',
|
|
56
|
-
valueType: ValueType.INT
|
|
69
|
+
valueType: ValueType.INT
|
|
57
70
|
});
|
|
58
71
|
this.txBlobDataGasCost = meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_COST, {
|
|
59
72
|
description: 'The gas cost of blobs in transactions',
|
|
60
73
|
unit: 'gwei',
|
|
61
|
-
valueType: ValueType.INT
|
|
74
|
+
valueType: ValueType.INT
|
|
62
75
|
});
|
|
63
76
|
}
|
|
64
77
|
recordFailedTx() {
|
|
65
78
|
this.txCount.add(1, {
|
|
66
79
|
[Attributes.L1_TX_TYPE]: 'submitProof',
|
|
67
|
-
[Attributes.OK]: false
|
|
80
|
+
[Attributes.OK]: false
|
|
68
81
|
});
|
|
69
82
|
}
|
|
70
83
|
recordSubmitProof(durationMs, stats) {
|
|
@@ -79,15 +92,14 @@ export class ProverNodeMetrics {
|
|
|
79
92
|
recordTx(durationMs, stats) {
|
|
80
93
|
const attributes = {
|
|
81
94
|
[Attributes.L1_TX_TYPE]: 'submitProof',
|
|
82
|
-
[Attributes.L1_SENDER]: stats.sender
|
|
95
|
+
[Attributes.L1_SENDER]: stats.sender
|
|
83
96
|
};
|
|
84
97
|
this.txCount.add(1, {
|
|
85
98
|
...attributes,
|
|
86
|
-
[Attributes.OK]: true
|
|
99
|
+
[Attributes.OK]: true
|
|
87
100
|
});
|
|
88
101
|
this.txDuration.record(Math.ceil(durationMs), attributes);
|
|
89
|
-
this.txGas.record(
|
|
90
|
-
// safe to downcast - total block limit is 30M gas which fits in a JS number
|
|
102
|
+
this.txGas.record(// safe to downcast - total block limit is 30M gas which fits in a JS number
|
|
91
103
|
Number(stats.gasUsed), attributes);
|
|
92
104
|
this.txCalldataGas.record(stats.calldataGas, attributes);
|
|
93
105
|
this.txCalldataSize.record(stats.calldataSize, attributes);
|
|
@@ -95,10 +107,8 @@ export class ProverNodeMetrics {
|
|
|
95
107
|
this.txBlobDataGasUsed.record(Number(stats.blobGasUsed), attributes);
|
|
96
108
|
try {
|
|
97
109
|
this.gasPrice.record(parseInt(formatEther(stats.gasPrice, 'gwei'), 10));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// ignore
|
|
110
|
+
} catch (e) {
|
|
111
|
+
// ignore
|
|
101
112
|
}
|
|
102
113
|
}
|
|
103
114
|
}
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxVQUFVLEVBRVYsT0FBTyxFQUdQLFNBQVMsR0FDVixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbkMsTUFBTSxPQUFPLGlCQUFpQjtJQWU1QixZQUE0QixNQUF1QixFQUFFLElBQUksR0FBRyxZQUFZO1FBQTVDLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ2pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFO1lBQ2hHLFdBQVcsRUFBRSxpREFBaUQ7WUFDOUQsSUFBSSxFQUFFLElBQUk7WUFDVixTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFO1lBQ2hGLFdBQVcsRUFBRSx5QkFBeUI7WUFDdEMsSUFBSSxFQUFFLElBQUk7WUFDVixTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFO1lBQzVFLFdBQVcsRUFBRSxvQ0FBb0M7WUFDakQsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRTtZQUN4RixXQUFXLEVBQUUsMENBQTBD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
|