@aztec/prover-node 0.0.1-commit.b655e406 → 0.0.1-commit.b6e433891
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 +4 -4
- package/dest/actions/index.d.ts +1 -1
- package/dest/actions/rerun-epoch-proving-job.d.ts +4 -3
- package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
- package/dest/actions/rerun-epoch-proving-job.js +2 -2
- package/dest/actions/upload-epoch-proof-failure.d.ts +2 -2
- package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -1
- package/dest/bin/run-failed-epoch.d.ts +1 -1
- package/dest/bin/run-failed-epoch.js +5 -2
- package/dest/config.d.ts +8 -10
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +19 -21
- package/dest/factory.d.ts +20 -16
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +28 -62
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/job/epoch-proving-job-data.d.ts +8 -6
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
- package/dest/job/epoch-proving-job-data.js +25 -18
- package/dest/job/epoch-proving-job.d.ts +7 -13
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +513 -105
- package/dest/metrics.d.ts +14 -3
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +55 -98
- package/dest/monitors/epoch-monitor.d.ts +3 -2
- package/dest/monitors/epoch-monitor.d.ts.map +1 -1
- package/dest/monitors/epoch-monitor.js +8 -18
- package/dest/monitors/index.d.ts +1 -1
- package/dest/prover-node-publisher.d.ts +14 -11
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +49 -42
- package/dest/prover-node.d.ts +27 -16
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +445 -59
- package/dest/prover-publisher-factory.d.ts +9 -5
- package/dest/prover-publisher-factory.d.ts.map +1 -1
- package/dest/prover-publisher-factory.js +4 -2
- package/dest/test/index.d.ts +1 -1
- package/dest/test/index.d.ts.map +1 -1
- package/package.json +27 -25
- package/src/actions/rerun-epoch-proving-job.ts +5 -3
- package/src/actions/upload-epoch-proof-failure.ts +1 -1
- package/src/bin/run-failed-epoch.ts +5 -2
- package/src/config.ts +27 -33
- package/src/factory.ts +64 -102
- package/src/index.ts +1 -0
- package/src/job/epoch-proving-job-data.ts +31 -25
- package/src/job/epoch-proving-job.ts +155 -110
- package/src/metrics.ts +65 -82
- package/src/monitors/epoch-monitor.ts +8 -15
- package/src/prover-node-publisher.ts +71 -58
- package/src/prover-node.ts +65 -53
- package/src/prover-publisher-factory.ts +16 -8
package/dest/prover-node.js
CHANGED
|
@@ -1,9 +1,377 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
function applyDecs2203RFactory() {
|
|
2
|
+
function createAddInitializerMethod(initializers, decoratorFinishedRef) {
|
|
3
|
+
return function addInitializer(initializer) {
|
|
4
|
+
assertNotFinished(decoratorFinishedRef, "addInitializer");
|
|
5
|
+
assertCallable(initializer, "An initializer");
|
|
6
|
+
initializers.push(initializer);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
|
|
10
|
+
var kindStr;
|
|
11
|
+
switch(kind){
|
|
12
|
+
case 1:
|
|
13
|
+
kindStr = "accessor";
|
|
14
|
+
break;
|
|
15
|
+
case 2:
|
|
16
|
+
kindStr = "method";
|
|
17
|
+
break;
|
|
18
|
+
case 3:
|
|
19
|
+
kindStr = "getter";
|
|
20
|
+
break;
|
|
21
|
+
case 4:
|
|
22
|
+
kindStr = "setter";
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
kindStr = "field";
|
|
26
|
+
}
|
|
27
|
+
var ctx = {
|
|
28
|
+
kind: kindStr,
|
|
29
|
+
name: isPrivate ? "#" + name : name,
|
|
30
|
+
static: isStatic,
|
|
31
|
+
private: isPrivate,
|
|
32
|
+
metadata: metadata
|
|
33
|
+
};
|
|
34
|
+
var decoratorFinishedRef = {
|
|
35
|
+
v: false
|
|
36
|
+
};
|
|
37
|
+
ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
|
|
38
|
+
var get, set;
|
|
39
|
+
if (kind === 0) {
|
|
40
|
+
if (isPrivate) {
|
|
41
|
+
get = desc.get;
|
|
42
|
+
set = desc.set;
|
|
43
|
+
} else {
|
|
44
|
+
get = function() {
|
|
45
|
+
return this[name];
|
|
46
|
+
};
|
|
47
|
+
set = function(v) {
|
|
48
|
+
this[name] = v;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
} else if (kind === 2) {
|
|
52
|
+
get = function() {
|
|
53
|
+
return desc.value;
|
|
54
|
+
};
|
|
55
|
+
} else {
|
|
56
|
+
if (kind === 1 || kind === 3) {
|
|
57
|
+
get = function() {
|
|
58
|
+
return desc.get.call(this);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (kind === 1 || kind === 4) {
|
|
62
|
+
set = function(v) {
|
|
63
|
+
desc.set.call(this, v);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
ctx.access = get && set ? {
|
|
68
|
+
get: get,
|
|
69
|
+
set: set
|
|
70
|
+
} : get ? {
|
|
71
|
+
get: get
|
|
72
|
+
} : {
|
|
73
|
+
set: set
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
return dec(value, ctx);
|
|
77
|
+
} finally{
|
|
78
|
+
decoratorFinishedRef.v = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function assertNotFinished(decoratorFinishedRef, fnName) {
|
|
82
|
+
if (decoratorFinishedRef.v) {
|
|
83
|
+
throw new Error("attempted to call " + fnName + " after decoration was finished");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function assertCallable(fn, hint) {
|
|
87
|
+
if (typeof fn !== "function") {
|
|
88
|
+
throw new TypeError(hint + " must be a function");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function assertValidReturnValue(kind, value) {
|
|
92
|
+
var type = typeof value;
|
|
93
|
+
if (kind === 1) {
|
|
94
|
+
if (type !== "object" || value === null) {
|
|
95
|
+
throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
|
|
96
|
+
}
|
|
97
|
+
if (value.get !== undefined) {
|
|
98
|
+
assertCallable(value.get, "accessor.get");
|
|
99
|
+
}
|
|
100
|
+
if (value.set !== undefined) {
|
|
101
|
+
assertCallable(value.set, "accessor.set");
|
|
102
|
+
}
|
|
103
|
+
if (value.init !== undefined) {
|
|
104
|
+
assertCallable(value.init, "accessor.init");
|
|
105
|
+
}
|
|
106
|
+
} else if (type !== "function") {
|
|
107
|
+
var hint;
|
|
108
|
+
if (kind === 0) {
|
|
109
|
+
hint = "field";
|
|
110
|
+
} else if (kind === 10) {
|
|
111
|
+
hint = "class";
|
|
112
|
+
} else {
|
|
113
|
+
hint = "method";
|
|
114
|
+
}
|
|
115
|
+
throw new TypeError(hint + " decorators must return a function or void 0");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
|
|
119
|
+
var decs = decInfo[0];
|
|
120
|
+
var desc, init, value;
|
|
121
|
+
if (isPrivate) {
|
|
122
|
+
if (kind === 0 || kind === 1) {
|
|
123
|
+
desc = {
|
|
124
|
+
get: decInfo[3],
|
|
125
|
+
set: decInfo[4]
|
|
126
|
+
};
|
|
127
|
+
} else if (kind === 3) {
|
|
128
|
+
desc = {
|
|
129
|
+
get: decInfo[3]
|
|
130
|
+
};
|
|
131
|
+
} else if (kind === 4) {
|
|
132
|
+
desc = {
|
|
133
|
+
set: decInfo[3]
|
|
134
|
+
};
|
|
135
|
+
} else {
|
|
136
|
+
desc = {
|
|
137
|
+
value: decInfo[3]
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
} else if (kind !== 0) {
|
|
141
|
+
desc = Object.getOwnPropertyDescriptor(base, name);
|
|
142
|
+
}
|
|
143
|
+
if (kind === 1) {
|
|
144
|
+
value = {
|
|
145
|
+
get: desc.get,
|
|
146
|
+
set: desc.set
|
|
147
|
+
};
|
|
148
|
+
} else if (kind === 2) {
|
|
149
|
+
value = desc.value;
|
|
150
|
+
} else if (kind === 3) {
|
|
151
|
+
value = desc.get;
|
|
152
|
+
} else if (kind === 4) {
|
|
153
|
+
value = desc.set;
|
|
154
|
+
}
|
|
155
|
+
var newValue, get, set;
|
|
156
|
+
if (typeof decs === "function") {
|
|
157
|
+
newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
158
|
+
if (newValue !== void 0) {
|
|
159
|
+
assertValidReturnValue(kind, newValue);
|
|
160
|
+
if (kind === 0) {
|
|
161
|
+
init = newValue;
|
|
162
|
+
} else if (kind === 1) {
|
|
163
|
+
init = newValue.init;
|
|
164
|
+
get = newValue.get || value.get;
|
|
165
|
+
set = newValue.set || value.set;
|
|
166
|
+
value = {
|
|
167
|
+
get: get,
|
|
168
|
+
set: set
|
|
169
|
+
};
|
|
170
|
+
} else {
|
|
171
|
+
value = newValue;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
for(var i = decs.length - 1; i >= 0; i--){
|
|
176
|
+
var dec = decs[i];
|
|
177
|
+
newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
178
|
+
if (newValue !== void 0) {
|
|
179
|
+
assertValidReturnValue(kind, newValue);
|
|
180
|
+
var newInit;
|
|
181
|
+
if (kind === 0) {
|
|
182
|
+
newInit = newValue;
|
|
183
|
+
} else if (kind === 1) {
|
|
184
|
+
newInit = newValue.init;
|
|
185
|
+
get = newValue.get || value.get;
|
|
186
|
+
set = newValue.set || value.set;
|
|
187
|
+
value = {
|
|
188
|
+
get: get,
|
|
189
|
+
set: set
|
|
190
|
+
};
|
|
191
|
+
} else {
|
|
192
|
+
value = newValue;
|
|
193
|
+
}
|
|
194
|
+
if (newInit !== void 0) {
|
|
195
|
+
if (init === void 0) {
|
|
196
|
+
init = newInit;
|
|
197
|
+
} else if (typeof init === "function") {
|
|
198
|
+
init = [
|
|
199
|
+
init,
|
|
200
|
+
newInit
|
|
201
|
+
];
|
|
202
|
+
} else {
|
|
203
|
+
init.push(newInit);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (kind === 0 || kind === 1) {
|
|
210
|
+
if (init === void 0) {
|
|
211
|
+
init = function(instance, init) {
|
|
212
|
+
return init;
|
|
213
|
+
};
|
|
214
|
+
} else if (typeof init !== "function") {
|
|
215
|
+
var ownInitializers = init;
|
|
216
|
+
init = function(instance, init) {
|
|
217
|
+
var value = init;
|
|
218
|
+
for(var i = 0; i < ownInitializers.length; i++){
|
|
219
|
+
value = ownInitializers[i].call(instance, value);
|
|
220
|
+
}
|
|
221
|
+
return value;
|
|
222
|
+
};
|
|
223
|
+
} else {
|
|
224
|
+
var originalInitializer = init;
|
|
225
|
+
init = function(instance, init) {
|
|
226
|
+
return originalInitializer.call(instance, init);
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
ret.push(init);
|
|
230
|
+
}
|
|
231
|
+
if (kind !== 0) {
|
|
232
|
+
if (kind === 1) {
|
|
233
|
+
desc.get = value.get;
|
|
234
|
+
desc.set = value.set;
|
|
235
|
+
} else if (kind === 2) {
|
|
236
|
+
desc.value = value;
|
|
237
|
+
} else if (kind === 3) {
|
|
238
|
+
desc.get = value;
|
|
239
|
+
} else if (kind === 4) {
|
|
240
|
+
desc.set = value;
|
|
241
|
+
}
|
|
242
|
+
if (isPrivate) {
|
|
243
|
+
if (kind === 1) {
|
|
244
|
+
ret.push(function(instance, args) {
|
|
245
|
+
return value.get.call(instance, args);
|
|
246
|
+
});
|
|
247
|
+
ret.push(function(instance, args) {
|
|
248
|
+
return value.set.call(instance, args);
|
|
249
|
+
});
|
|
250
|
+
} else if (kind === 2) {
|
|
251
|
+
ret.push(value);
|
|
252
|
+
} else {
|
|
253
|
+
ret.push(function(instance, args) {
|
|
254
|
+
return value.call(instance, args);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
} else {
|
|
258
|
+
Object.defineProperty(base, name, desc);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function applyMemberDecs(Class, decInfos, metadata) {
|
|
263
|
+
var ret = [];
|
|
264
|
+
var protoInitializers;
|
|
265
|
+
var staticInitializers;
|
|
266
|
+
var existingProtoNonFields = new Map();
|
|
267
|
+
var existingStaticNonFields = new Map();
|
|
268
|
+
for(var i = 0; i < decInfos.length; i++){
|
|
269
|
+
var decInfo = decInfos[i];
|
|
270
|
+
if (!Array.isArray(decInfo)) continue;
|
|
271
|
+
var kind = decInfo[1];
|
|
272
|
+
var name = decInfo[2];
|
|
273
|
+
var isPrivate = decInfo.length > 3;
|
|
274
|
+
var isStatic = kind >= 5;
|
|
275
|
+
var base;
|
|
276
|
+
var initializers;
|
|
277
|
+
if (isStatic) {
|
|
278
|
+
base = Class;
|
|
279
|
+
kind = kind - 5;
|
|
280
|
+
staticInitializers = staticInitializers || [];
|
|
281
|
+
initializers = staticInitializers;
|
|
282
|
+
} else {
|
|
283
|
+
base = Class.prototype;
|
|
284
|
+
protoInitializers = protoInitializers || [];
|
|
285
|
+
initializers = protoInitializers;
|
|
286
|
+
}
|
|
287
|
+
if (kind !== 0 && !isPrivate) {
|
|
288
|
+
var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
|
|
289
|
+
var existingKind = existingNonFields.get(name) || 0;
|
|
290
|
+
if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
|
|
291
|
+
throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
|
|
292
|
+
} else if (!existingKind && kind > 2) {
|
|
293
|
+
existingNonFields.set(name, kind);
|
|
294
|
+
} else {
|
|
295
|
+
existingNonFields.set(name, true);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
|
|
299
|
+
}
|
|
300
|
+
pushInitializers(ret, protoInitializers);
|
|
301
|
+
pushInitializers(ret, staticInitializers);
|
|
302
|
+
return ret;
|
|
303
|
+
}
|
|
304
|
+
function pushInitializers(ret, initializers) {
|
|
305
|
+
if (initializers) {
|
|
306
|
+
ret.push(function(instance) {
|
|
307
|
+
for(var i = 0; i < initializers.length; i++){
|
|
308
|
+
initializers[i].call(instance);
|
|
309
|
+
}
|
|
310
|
+
return instance;
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function applyClassDecs(targetClass, classDecs, metadata) {
|
|
315
|
+
if (classDecs.length > 0) {
|
|
316
|
+
var initializers = [];
|
|
317
|
+
var newClass = targetClass;
|
|
318
|
+
var name = targetClass.name;
|
|
319
|
+
for(var i = classDecs.length - 1; i >= 0; i--){
|
|
320
|
+
var decoratorFinishedRef = {
|
|
321
|
+
v: false
|
|
322
|
+
};
|
|
323
|
+
try {
|
|
324
|
+
var nextNewClass = classDecs[i](newClass, {
|
|
325
|
+
kind: "class",
|
|
326
|
+
name: name,
|
|
327
|
+
addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
|
|
328
|
+
metadata
|
|
329
|
+
});
|
|
330
|
+
} finally{
|
|
331
|
+
decoratorFinishedRef.v = true;
|
|
332
|
+
}
|
|
333
|
+
if (nextNewClass !== undefined) {
|
|
334
|
+
assertValidReturnValue(10, nextNewClass);
|
|
335
|
+
newClass = nextNewClass;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return [
|
|
339
|
+
defineMetadata(newClass, metadata),
|
|
340
|
+
function() {
|
|
341
|
+
for(var i = 0; i < initializers.length; i++){
|
|
342
|
+
initializers[i].call(newClass);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function defineMetadata(Class, metadata) {
|
|
349
|
+
return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
|
|
350
|
+
configurable: true,
|
|
351
|
+
enumerable: true,
|
|
352
|
+
value: metadata
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
|
|
356
|
+
if (parentClass !== void 0) {
|
|
357
|
+
var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
|
|
358
|
+
}
|
|
359
|
+
var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
|
|
360
|
+
var e = applyMemberDecs(targetClass, memberDecs, metadata);
|
|
361
|
+
if (!classDecs.length) defineMetadata(targetClass, metadata);
|
|
362
|
+
return {
|
|
363
|
+
e: e,
|
|
364
|
+
get c () {
|
|
365
|
+
return applyClassDecs(targetClass, classDecs, metadata);
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
};
|
|
6
369
|
}
|
|
370
|
+
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
|
+
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
|
+
}
|
|
373
|
+
var _dec, _dec1, _initProto;
|
|
374
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
7
375
|
import { assertRequired, compact, pick, sum } from '@aztec/foundation/collection';
|
|
8
376
|
import { memoize } from '@aztec/foundation/decorators';
|
|
9
377
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -15,6 +383,11 @@ import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-clie
|
|
|
15
383
|
import { uploadEpochProofFailure } from './actions/upload-epoch-proof-failure.js';
|
|
16
384
|
import { EpochProvingJob } from './job/epoch-proving-job.js';
|
|
17
385
|
import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
386
|
+
_dec = trackSpan('ProverNode.createProvingJob', (epochNumber)=>({
|
|
387
|
+
[Attributes.EPOCH_NUMBER]: epochNumber
|
|
388
|
+
})), _dec1 = trackSpan('ProverNode.gatherEpochData', (epochNumber)=>({
|
|
389
|
+
[Attributes.EPOCH_NUMBER]: epochNumber
|
|
390
|
+
}));
|
|
18
391
|
/**
|
|
19
392
|
* An Aztec Prover Node is a standalone process that monitors the unfinalized chain on L1 for unproven epochs,
|
|
20
393
|
* fetches their txs from the p2p network or external nodes, re-executes their public functions, creates a rollup
|
|
@@ -31,15 +404,35 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
31
404
|
rollupContract;
|
|
32
405
|
l1Metrics;
|
|
33
406
|
telemetryClient;
|
|
34
|
-
|
|
407
|
+
delayer;
|
|
35
408
|
dateProvider;
|
|
409
|
+
static{
|
|
410
|
+
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
411
|
+
[
|
|
412
|
+
_dec,
|
|
413
|
+
2,
|
|
414
|
+
"createProvingJob"
|
|
415
|
+
],
|
|
416
|
+
[
|
|
417
|
+
memoize,
|
|
418
|
+
2,
|
|
419
|
+
"getL1Constants"
|
|
420
|
+
],
|
|
421
|
+
[
|
|
422
|
+
_dec1,
|
|
423
|
+
2,
|
|
424
|
+
"gatherEpochData"
|
|
425
|
+
]
|
|
426
|
+
], []));
|
|
427
|
+
}
|
|
428
|
+
log;
|
|
36
429
|
jobs;
|
|
37
430
|
config;
|
|
38
431
|
jobMetrics;
|
|
39
432
|
rewardsMetrics;
|
|
40
433
|
tracer;
|
|
41
434
|
publisher;
|
|
42
|
-
constructor(prover, publisherFactory, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, p2pClient, epochsMonitor, rollupContract, l1Metrics, config = {}, telemetryClient = getTelemetryClient()){
|
|
435
|
+
constructor(prover, publisherFactory, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, p2pClient, epochsMonitor, rollupContract, l1Metrics, config = {}, telemetryClient = getTelemetryClient(), delayer, dateProvider = new DateProvider()){
|
|
43
436
|
this.prover = prover;
|
|
44
437
|
this.publisherFactory = publisherFactory;
|
|
45
438
|
this.l2BlockSource = l2BlockSource;
|
|
@@ -51,13 +444,14 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
51
444
|
this.rollupContract = rollupContract;
|
|
52
445
|
this.l1Metrics = l1Metrics;
|
|
53
446
|
this.telemetryClient = telemetryClient;
|
|
54
|
-
this.
|
|
55
|
-
this.dateProvider =
|
|
447
|
+
this.delayer = delayer;
|
|
448
|
+
this.dateProvider = dateProvider;
|
|
449
|
+
this.log = (_initProto(this), createLogger('prover-node'));
|
|
56
450
|
this.jobs = new Map();
|
|
57
451
|
this.config = {
|
|
58
452
|
proverNodePollingIntervalMs: 1_000,
|
|
59
453
|
proverNodeMaxPendingJobs: 100,
|
|
60
|
-
proverNodeMaxParallelBlocksPerEpoch:
|
|
454
|
+
proverNodeMaxParallelBlocksPerEpoch: 0,
|
|
61
455
|
txGatheringIntervalMs: 1_000,
|
|
62
456
|
txGatheringBatchSize: 10,
|
|
63
457
|
txGatheringMaxParallelRequestsPerNode: 100,
|
|
@@ -78,6 +472,9 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
78
472
|
getP2P() {
|
|
79
473
|
return this.p2pClient;
|
|
80
474
|
}
|
|
475
|
+
/** Returns the shared tx delayer for prover L1 txs, if enabled. Test-only. */ getDelayer() {
|
|
476
|
+
return this.delayer;
|
|
477
|
+
}
|
|
81
478
|
/**
|
|
82
479
|
* Handles an epoch being completed by starting a proof for it if there are no active jobs for it.
|
|
83
480
|
* @param epochNumber - The epoch number that was just completed.
|
|
@@ -118,16 +515,14 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
118
515
|
}
|
|
119
516
|
/**
|
|
120
517
|
* Stops the prover node and all its dependencies.
|
|
518
|
+
* Resources not owned by this node (shared with the parent aztec-node) are skipped.
|
|
121
519
|
*/ async stop() {
|
|
122
520
|
this.log.info('Stopping ProverNode');
|
|
123
521
|
await this.epochsMonitor.stop();
|
|
124
522
|
await this.prover.stop();
|
|
125
|
-
await tryStop(this.p2pClient);
|
|
126
|
-
await tryStop(this.l2BlockSource);
|
|
127
523
|
await tryStop(this.publisherFactory);
|
|
128
524
|
this.publisher?.interrupt();
|
|
129
525
|
await Promise.all(Array.from(this.jobs.values()).map((job)=>job.stop()));
|
|
130
|
-
await this.worldState.stop();
|
|
131
526
|
this.rewardsMetrics.stop();
|
|
132
527
|
this.l1Metrics.stop();
|
|
133
528
|
await this.telemetryClient.stop();
|
|
@@ -143,7 +538,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
143
538
|
/**
|
|
144
539
|
* Starts a proving process and returns immediately.
|
|
145
540
|
*/ async startProof(epochNumber) {
|
|
146
|
-
const job = await this.createProvingJob(
|
|
541
|
+
const job = await this.createProvingJob(epochNumber, {
|
|
147
542
|
skipEpochCheck: true
|
|
148
543
|
});
|
|
149
544
|
void this.runJob(job);
|
|
@@ -190,12 +585,11 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
190
585
|
return Promise.resolve(Array.from(this.jobs.entries()).map(([uuid, job])=>({
|
|
191
586
|
uuid,
|
|
192
587
|
status: job.getState(),
|
|
193
|
-
epochNumber:
|
|
588
|
+
epochNumber: job.getEpochNumber()
|
|
194
589
|
})));
|
|
195
590
|
}
|
|
196
|
-
async getActiveJobsForEpoch(
|
|
591
|
+
async getActiveJobsForEpoch(epochNumber) {
|
|
197
592
|
const jobs = await this.getJobs();
|
|
198
|
-
const epochNumber = Number(epochBigInt);
|
|
199
593
|
return jobs.filter((job)=>job.epochNumber === epochNumber && !EpochProvingJobTerminalState.includes(job.status));
|
|
200
594
|
}
|
|
201
595
|
checkMaximumPendingJobs() {
|
|
@@ -209,13 +603,17 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
209
603
|
this.publisher = await this.publisherFactory.create();
|
|
210
604
|
// Gather all data for this epoch
|
|
211
605
|
const epochData = await this.gatherEpochData(epochNumber);
|
|
212
|
-
const
|
|
213
|
-
const
|
|
214
|
-
|
|
606
|
+
const fromCheckpoint = epochData.checkpoints[0].number;
|
|
607
|
+
const toCheckpoint = epochData.checkpoints.at(-1).number;
|
|
608
|
+
const fromBlock = epochData.checkpoints[0].blocks[0].number;
|
|
609
|
+
const lastBlock = epochData.checkpoints.at(-1).blocks.at(-1);
|
|
610
|
+
const toBlock = lastBlock.number;
|
|
611
|
+
this.log.verbose(`Creating proving job for epoch ${epochNumber} for checkpoint range ${fromCheckpoint} to ${toCheckpoint} and block range ${fromBlock} to ${toBlock}`);
|
|
215
612
|
// Fast forward world state to right before the target block and get a fork
|
|
216
|
-
await
|
|
613
|
+
const lastBlockHash = await lastBlock.header.hash();
|
|
614
|
+
await this.worldState.syncImmediate(toBlock, lastBlockHash);
|
|
217
615
|
// Create a processor factory
|
|
218
|
-
const publicProcessorFactory = new PublicProcessorFactory(this.contractDataSource, this.dateProvider, this.telemetryClient);
|
|
616
|
+
const publicProcessorFactory = new PublicProcessorFactory(this.contractDataSource, this.dateProvider, this.telemetryClient, this.log.getBindings());
|
|
219
617
|
// Set deadline for this job to run. It will abort if it takes too long.
|
|
220
618
|
const deadlineTs = getProofSubmissionDeadlineTimestamp(epochNumber, await this.getL1Constants());
|
|
221
619
|
const deadline = new Date(Number(deadlineTs) * 1000);
|
|
@@ -227,18 +625,19 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
227
625
|
return this.l2BlockSource.getL1Constants();
|
|
228
626
|
}
|
|
229
627
|
async gatherEpochData(epochNumber) {
|
|
230
|
-
const
|
|
231
|
-
const txArray = await this.gatherTxs(epochNumber,
|
|
628
|
+
const checkpoints = await this.gatherCheckpoints(epochNumber);
|
|
629
|
+
const txArray = await this.gatherTxs(epochNumber, checkpoints);
|
|
232
630
|
const txs = new Map(txArray.map((tx)=>[
|
|
233
631
|
tx.getTxHash().toString(),
|
|
234
632
|
tx
|
|
235
633
|
]));
|
|
236
|
-
const l1ToL2Messages = await this.gatherMessages(epochNumber,
|
|
237
|
-
const
|
|
238
|
-
const
|
|
239
|
-
const
|
|
634
|
+
const l1ToL2Messages = await this.gatherMessages(epochNumber, checkpoints);
|
|
635
|
+
const [firstBlock] = checkpoints[0].blocks;
|
|
636
|
+
const previousBlockHeader = await this.gatherPreviousBlockHeader(epochNumber, firstBlock.number - 1);
|
|
637
|
+
const [lastPublishedCheckpoint] = await this.l2BlockSource.getCheckpoints(checkpoints.at(-1).number, 1);
|
|
638
|
+
const attestations = lastPublishedCheckpoint?.attestations ?? [];
|
|
240
639
|
return {
|
|
241
|
-
|
|
640
|
+
checkpoints,
|
|
242
641
|
txs,
|
|
243
642
|
l1ToL2Messages,
|
|
244
643
|
epochNumber,
|
|
@@ -246,16 +645,17 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
246
645
|
attestations
|
|
247
646
|
};
|
|
248
647
|
}
|
|
249
|
-
async
|
|
250
|
-
const
|
|
251
|
-
if (
|
|
648
|
+
async gatherCheckpoints(epochNumber) {
|
|
649
|
+
const checkpoints = await this.l2BlockSource.getCheckpointsForEpoch(epochNumber);
|
|
650
|
+
if (checkpoints.length === 0) {
|
|
252
651
|
throw new EmptyEpochError(epochNumber);
|
|
253
652
|
}
|
|
254
|
-
return
|
|
653
|
+
return checkpoints;
|
|
255
654
|
}
|
|
256
|
-
async gatherTxs(epochNumber,
|
|
655
|
+
async gatherTxs(epochNumber, checkpoints) {
|
|
257
656
|
const deadline = new Date(this.dateProvider.now() + this.config.txGatheringTimeoutMs);
|
|
258
657
|
const txProvider = this.p2pClient.getTxProvider();
|
|
658
|
+
const blocks = checkpoints.flatMap((checkpoint)=>checkpoint.blocks);
|
|
259
659
|
const txsByBlock = await Promise.all(blocks.map((block)=>txProvider.getTxsForBlock(block, {
|
|
260
660
|
deadline
|
|
261
661
|
})));
|
|
@@ -269,23 +669,22 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
269
669
|
}
|
|
270
670
|
throw new Error(`Txs not found for epoch ${epochNumber}: ${missingTxs.map((hash)=>hash.toString()).join(', ')}`);
|
|
271
671
|
}
|
|
272
|
-
async gatherMessages(epochNumber,
|
|
273
|
-
const messages = await Promise.all(
|
|
672
|
+
async gatherMessages(epochNumber, checkpoints) {
|
|
673
|
+
const messages = await Promise.all(checkpoints.map((c)=>this.l1ToL2MessageSource.getL1ToL2Messages(c.number)));
|
|
274
674
|
const messageCount = sum(messages.map((m)=>m.length));
|
|
275
675
|
this.log.verbose(`Gathered all ${messageCount} messages for epoch ${epochNumber}`, {
|
|
276
676
|
epochNumber
|
|
277
677
|
});
|
|
278
|
-
const
|
|
279
|
-
for(let i = 0; i <
|
|
280
|
-
|
|
678
|
+
const messagesByCheckpoint = {};
|
|
679
|
+
for(let i = 0; i < checkpoints.length; i++){
|
|
680
|
+
messagesByCheckpoint[checkpoints[i].number] = messages[i];
|
|
281
681
|
}
|
|
282
|
-
return
|
|
682
|
+
return messagesByCheckpoint;
|
|
283
683
|
}
|
|
284
|
-
async gatherPreviousBlockHeader(epochNumber,
|
|
285
|
-
const
|
|
286
|
-
const header = await (previousBlockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.l2BlockSource.getBlockHeader(previousBlockNumber));
|
|
684
|
+
async gatherPreviousBlockHeader(epochNumber, previousBlockNumber) {
|
|
685
|
+
const header = await (previousBlockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.l2BlockSource.getBlockHeader(BlockNumber(previousBlockNumber)));
|
|
287
686
|
if (!header) {
|
|
288
|
-
throw new Error(`Previous block header ${
|
|
687
|
+
throw new Error(`Previous block header ${previousBlockNumber} not found for proving epoch ${epochNumber}`);
|
|
289
688
|
}
|
|
290
689
|
this.log.verbose(`Gathered previous block header ${header.getBlockNumber()} for epoch ${epochNumber}`);
|
|
291
690
|
return header;
|
|
@@ -296,31 +695,18 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
296
695
|
parallelBlockLimit,
|
|
297
696
|
skipSubmitProof: proverNodeDisableProofPublish,
|
|
298
697
|
...opts
|
|
299
|
-
});
|
|
698
|
+
}, this.log.getBindings());
|
|
300
699
|
}
|
|
301
700
|
/** Extracted for testing purposes. */ async triggerMonitors() {
|
|
302
701
|
await this.epochsMonitor.work();
|
|
303
702
|
}
|
|
304
703
|
validateConfig() {
|
|
305
|
-
if (this.config.proverNodeFailedEpochStore && (!this.config.dataDirectory || !this.config.l1ChainId ||
|
|
704
|
+
if (this.config.proverNodeFailedEpochStore && (!this.config.dataDirectory || !this.config.l1ChainId || this.config.rollupVersion === undefined)) {
|
|
306
705
|
this.log.warn(`Invalid prover-node config (missing dataDirectory, l1ChainId, or rollupVersion)`, pick(this.config, 'proverNodeFailedEpochStore', 'dataDirectory', 'l1ChainId', 'rollupVersion'));
|
|
307
706
|
throw new Error('All of dataDirectory, l1ChainId, and rollupVersion are required if proverNodeFailedEpochStore is set.');
|
|
308
707
|
}
|
|
309
708
|
}
|
|
310
709
|
}
|
|
311
|
-
_ts_decorate([
|
|
312
|
-
trackSpan('ProverNode.createProvingJob', (epochNumber)=>({
|
|
313
|
-
[Attributes.EPOCH_NUMBER]: Number(epochNumber)
|
|
314
|
-
}))
|
|
315
|
-
], ProverNode.prototype, "createProvingJob", null);
|
|
316
|
-
_ts_decorate([
|
|
317
|
-
memoize
|
|
318
|
-
], ProverNode.prototype, "getL1Constants", null);
|
|
319
|
-
_ts_decorate([
|
|
320
|
-
trackSpan('ProverNode.gatherEpochData', (epochNumber)=>({
|
|
321
|
-
[Attributes.EPOCH_NUMBER]: Number(epochNumber)
|
|
322
|
-
}))
|
|
323
|
-
], ProverNode.prototype, "gatherEpochData", null);
|
|
324
710
|
class EmptyEpochError extends Error {
|
|
325
711
|
constructor(epochNumber){
|
|
326
712
|
super(`No blocks found for epoch ${epochNumber}`);
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { RollupContract } from '@aztec/ethereum/contracts';
|
|
2
|
+
import type { L1TxUtils } from '@aztec/ethereum/l1-tx-utils';
|
|
3
|
+
import type { PublisherManager } from '@aztec/ethereum/publisher-manager';
|
|
4
|
+
import type { LoggerBindings } from '@aztec/foundation/log';
|
|
5
|
+
import type { ProverPublisherConfig, ProverTxSenderConfig } from '@aztec/sequencer-client';
|
|
3
6
|
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
4
7
|
import { ProverNodePublisher } from './prover-node-publisher.js';
|
|
5
8
|
export declare class ProverPublisherFactory {
|
|
6
9
|
private config;
|
|
7
10
|
private deps;
|
|
8
|
-
|
|
11
|
+
private bindings?;
|
|
12
|
+
constructor(config: ProverTxSenderConfig & ProverPublisherConfig, deps: {
|
|
9
13
|
rollupContract: RollupContract;
|
|
10
14
|
publisherManager: PublisherManager<L1TxUtils>;
|
|
11
15
|
telemetry?: TelemetryClient;
|
|
12
|
-
});
|
|
16
|
+
}, bindings?: LoggerBindings | undefined);
|
|
13
17
|
start(): Promise<void>;
|
|
14
18
|
stop(): void;
|
|
15
19
|
/**
|
|
@@ -18,4 +22,4 @@ export declare class ProverPublisherFactory {
|
|
|
18
22
|
*/
|
|
19
23
|
create(): Promise<ProverNodePublisher>;
|
|
20
24
|
}
|
|
21
|
-
//# sourceMappingURL=
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLXB1Ymxpc2hlci1mYWN0b3J5LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLXB1Ymxpc2hlci1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRixPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxxQkFBYSxzQkFBc0I7SUFFL0IsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsSUFBSTtJQUtaLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFQbkIsWUFDVSxNQUFNLEVBQUUsb0JBQW9CLEdBQUcscUJBQXFCLEVBQ3BELElBQUksRUFBRTtRQUNaLGNBQWMsRUFBRSxjQUFjLENBQUM7UUFDL0IsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsU0FBUyxDQUFDLEVBQUUsZUFBZSxDQUFDO0tBQzdCLEVBQ08sUUFBUSxDQUFDLDRCQUFnQixFQUMvQjtJQUVTLEtBQUssa0JBRWpCO0lBRU0sSUFBSSxTQUVWO0lBRUQ7OztPQUdHO0lBQ1UsTUFBTSxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQVdsRDtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prover-publisher-factory.d.ts","sourceRoot":"","sources":["../src/prover-publisher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"prover-publisher-factory.d.ts","sourceRoot":"","sources":["../src/prover-publisher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,QAAQ,CAAC;IAPnB,YACU,MAAM,EAAE,oBAAoB,GAAG,qBAAqB,EACpD,IAAI,EAAE;QACZ,cAAc,EAAE,cAAc,CAAC;QAC/B,gBAAgB,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9C,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B,EACO,QAAQ,CAAC,4BAAgB,EAC/B;IAES,KAAK,kBAEjB;IAEM,IAAI,SAEV;IAED;;;OAGG;IACU,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAWlD;CACF"}
|