@aztec/prover-node 5.0.0-nightly.20260524 → 5.0.0-nightly.20260526
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.d.ts +5 -1
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +163 -26
- package/dest/prover-node-publisher.d.ts +5 -1
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +42 -0
- package/dest/prover-node.js +2 -2
- package/package.json +23 -23
- package/src/job/epoch-proving-job.ts +78 -20
- package/src/prover-node-publisher.ts +54 -0
- package/src/prover-node.ts +2 -2
|
@@ -31,6 +31,7 @@ export declare class EpochProvingJob implements Traceable {
|
|
|
31
31
|
private log;
|
|
32
32
|
private uuid;
|
|
33
33
|
private runPromise;
|
|
34
|
+
private abortController;
|
|
34
35
|
private epochCheckPromise;
|
|
35
36
|
private deadlineTimeoutHandler;
|
|
36
37
|
readonly tracer: Tracer;
|
|
@@ -49,9 +50,12 @@ export declare class EpochProvingJob implements Traceable {
|
|
|
49
50
|
*/
|
|
50
51
|
run(): Promise<void>;
|
|
51
52
|
private createFork;
|
|
53
|
+
private processCheckpoints;
|
|
52
54
|
private progressState;
|
|
53
55
|
private checkState;
|
|
54
56
|
stop(state?: EpochProvingJobTerminalState): Promise<void>;
|
|
57
|
+
private failProcessing;
|
|
58
|
+
private interruptProcessing;
|
|
55
59
|
private scheduleDeadlineStop;
|
|
56
60
|
private scheduleEpochCheck;
|
|
57
61
|
private gatherPreviousBlockHeaders;
|
|
@@ -60,4 +64,4 @@ export declare class EpochProvingJob implements Traceable {
|
|
|
60
64
|
private processTxs;
|
|
61
65
|
}
|
|
62
66
|
export { type EpochProvingJobState };
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qb2IvZXBvY2gtcHJvdmluZy1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTNFLE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQU92RixPQUFPLEtBQUssRUFBbUIsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RixPQUFPLEtBQUssRUFBVyxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRSxPQUFPLEVBQ0wsS0FBSyxXQUFXLEVBQ2hCLEtBQUssb0JBQW9CLEVBQ3pCLDRCQUE0QixFQUM1QixLQUFLLHdCQUF3QixFQUM5QixNQUFNLGlDQUFpQyxDQUFDO0FBSXpDLE9BQU8sRUFBYyxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBSTdGLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQStCLE1BQU0sNkJBQTZCLENBQUM7QUFFcEcsTUFBTSxNQUFNLHNCQUFzQixHQUFHO0lBQ25DLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzVCLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUN6QixlQUFlLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDM0IsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxxQkFBYSxlQUFnQixZQUFXLFNBQVM7SUFhN0MsT0FBTyxDQUFDLElBQUk7SUFDWixPQUFPLENBQUMsVUFBVTtJQUNsQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxzQkFBc0I7SUFDOUIsT0FBTyxDQUFDLFNBQVM7SUFDakIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLE9BQU87SUFDZixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsTUFBTTtJQXBCaEIsT0FBTyxDQUFDLEtBQUssQ0FBdUM7SUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBUztJQUNwQixPQUFPLENBQUMsSUFBSSxDQUFTO0lBRXJCLE9BQU8sQ0FBQyxVQUFVLENBQTRCO0lBQzlDLE9BQU8sQ0FBQyxlQUFlLENBQXlCO0lBQ2hELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBNkI7SUFDdEQsT0FBTyxDQUFDLHNCQUFzQixDQUE2QjtJQUUzRCxTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRS9CLFlBQ1UsSUFBSSxFQUFFLG1CQUFtQixFQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxFQUNsRCxNQUFNLEVBQUUsV0FBVyxFQUNuQixzQkFBc0IsRUFBRSxzQkFBc0IsRUFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQyxFQUN4RixhQUFhLEVBQUUsYUFBYSxHQUFHLFNBQVMsRUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUM3QixRQUFRLEVBQUUsSUFBSSxHQUFHLFNBQVMsRUFDMUIsTUFBTSxFQUFFLHNCQUFzQixFQUN0QyxRQUFRLENBQUMsRUFBRSxjQUFjLEVBUzFCO0lBRU0sS0FBSyxJQUFJLE1BQU0sQ0FFckI7SUFFTSxRQUFRLElBQUksb0JBQW9CLENBRXRDO0lBRU0sY0FBYyxJQUFJLFdBQVcsQ0FFbkM7SUFFTSxXQUFXLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FFckM7SUFFTSxjQUFjLElBQUksbUJBQW1CLENBRTNDO0lBRUQsT0FBTyxLQUFLLFdBQVcsR0FFdEI7SUFFRCxPQUFPLEtBQUssV0FBVyxHQUV0QjtJQUVELE9BQU8sS0FBSyxHQUFHLEdBRWQ7SUFFRCxPQUFPLEtBQUssWUFBWSxHQUV2QjtJQUVEOztPQUVHO0lBSVUsR0FBRyxrQkF5TmY7WUFRYSxVQUFVO1lBbUJWLGtCQUFrQjtJQWlDaEMsT0FBTyxDQUFDLGFBQWE7SUFLckIsT0FBTyxDQUFDLFVBQVU7SUFNTCxJQUFJLENBQUMsS0FBSyxHQUFFLDRCQUF3QyxpQkFNaEU7SUFFRCxPQUFPLENBQUMsY0FBYztJQU90QixPQUFPLENBQUMsbUJBQW1CO0lBSzNCLE9BQU8sQ0FBQyxvQkFBb0I7WUF3QmQsa0JBQWtCO0lBb0NoQyxPQUFPLENBQUMsMEJBQTBCO0lBS2xDLE9BQU8sQ0FBQyxNQUFNO0lBSWQsT0FBTyxDQUFDLGlCQUFpQjtZQUlYLFVBQVU7Q0F1QnpCO0FBU0QsT0FBTyxFQUFFLEtBQUssb0JBQW9CLEVBQUUsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAOvF,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;
|
|
1
|
+
{"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAOvF,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAa7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IApBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACU,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAClD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,GAAG,6BAA6B,CAAC,EACxF,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE,sBAAsB,EACtC,QAAQ,CAAC,EAAE,cAAc,EAS1B;IAEM,KAAK,IAAI,MAAM,CAErB;IAEM,QAAQ,IAAI,oBAAoB,CAEtC;IAEM,cAAc,IAAI,WAAW,CAEnC;IAEM,WAAW,IAAI,IAAI,GAAG,SAAS,CAErC;IAEM,cAAc,IAAI,mBAAmB,CAE3C;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,GAAG,GAEd;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IAIU,GAAG,kBAyNf;YAQa,UAAU;YAmBV,kBAAkB;IAiChC,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,KAAK,GAAE,4BAAwC,iBAMhE;IAED,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,oBAAoB;YAwBd,kBAAkB;IAoChC,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAuBzB;AASD,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
|
|
@@ -1,3 +1,68 @@
|
|
|
1
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() {
|
|
16
|
+
try {
|
|
17
|
+
inner.call(this);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
return Promise.reject(e);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
env.stack.push({
|
|
23
|
+
value: value,
|
|
24
|
+
dispose: dispose,
|
|
25
|
+
async: async
|
|
26
|
+
});
|
|
27
|
+
} else if (async) {
|
|
28
|
+
env.stack.push({
|
|
29
|
+
async: true
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function _ts_dispose_resources(env) {
|
|
35
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
36
|
+
var e = new Error(message);
|
|
37
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
38
|
+
};
|
|
39
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
40
|
+
function fail(e) {
|
|
41
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
42
|
+
env.hasError = true;
|
|
43
|
+
}
|
|
44
|
+
var r, s = 0;
|
|
45
|
+
function next() {
|
|
46
|
+
while(r = env.stack.pop()){
|
|
47
|
+
try {
|
|
48
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
49
|
+
if (r.dispose) {
|
|
50
|
+
var result = r.dispose.call(r.value);
|
|
51
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
52
|
+
fail(e);
|
|
53
|
+
return next();
|
|
54
|
+
});
|
|
55
|
+
} else s |= 1;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
fail(e);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
61
|
+
if (env.hasError) throw env.error;
|
|
62
|
+
}
|
|
63
|
+
return next();
|
|
64
|
+
})(env);
|
|
65
|
+
}
|
|
1
66
|
function applyDecs2203RFactory() {
|
|
2
67
|
function createAddInitializerMethod(initializers, decoratorFinishedRef) {
|
|
3
68
|
return function addInitializer(initializer) {
|
|
@@ -419,6 +484,7 @@ _dec = trackSpan('EpochProvingJob.run', function() {
|
|
|
419
484
|
log;
|
|
420
485
|
uuid;
|
|
421
486
|
runPromise;
|
|
487
|
+
abortController;
|
|
422
488
|
epochCheckPromise;
|
|
423
489
|
deadlineTimeoutHandler;
|
|
424
490
|
tracer;
|
|
@@ -433,6 +499,7 @@ _dec = trackSpan('EpochProvingJob.run', function() {
|
|
|
433
499
|
this.deadline = deadline;
|
|
434
500
|
this.config = config;
|
|
435
501
|
this.state = (_initProto(this), 'initialized');
|
|
502
|
+
this.abortController = new AbortController();
|
|
436
503
|
validateEpochProvingJobData(data);
|
|
437
504
|
this.uuid = crypto.randomUUID();
|
|
438
505
|
this.log = createLogger('prover-node:epoch-proving-job', {
|
|
@@ -509,7 +576,7 @@ _dec = trackSpan('EpochProvingJob.run', function() {
|
|
|
509
576
|
const previousBlockHeaders = this.gatherPreviousBlockHeaders();
|
|
510
577
|
const allCheckpointsTimer = new Timer();
|
|
511
578
|
const parallelism = this.config.parallelBlockLimit ? this.config.parallelBlockLimit : AVM_MAX_CONCURRENT_SIMULATIONS > 0 ? AVM_MAX_CONCURRENT_SIMULATIONS : this.checkpoints.length;
|
|
512
|
-
await
|
|
579
|
+
await this.processCheckpoints(parallelism, async (checkpoint)=>{
|
|
513
580
|
this.checkState();
|
|
514
581
|
const checkpointTimer = new Timer();
|
|
515
582
|
const checkpointIndex = checkpoint.number - fromCheckpoint;
|
|
@@ -554,19 +621,36 @@ _dec = trackSpan('EpochProvingJob.run', function() {
|
|
|
554
621
|
await this.prover.startNewBlock(block.number, globalVariables.timestamp, txs.length);
|
|
555
622
|
// Process public fns. L1 to L2 messages are only inserted for the first block of a checkpoint,
|
|
556
623
|
// as the fork for subsequent blocks already includes them from the previous block's synced state.
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
624
|
+
{
|
|
625
|
+
const env = {
|
|
626
|
+
stack: [],
|
|
627
|
+
error: void 0,
|
|
628
|
+
hasError: false
|
|
629
|
+
};
|
|
630
|
+
try {
|
|
631
|
+
const db = _ts_add_disposable_resource(env, await this.createFork(BlockNumber(block.number - 1), blockIndex === 0 ? l1ToL2Messages : undefined), true);
|
|
632
|
+
this.checkState();
|
|
633
|
+
const config = PublicSimulatorConfig.from({
|
|
634
|
+
proverId: this.prover.getProverId().toField(),
|
|
635
|
+
skipFeeEnforcement: false,
|
|
636
|
+
collectDebugLogs: false,
|
|
637
|
+
collectHints: true,
|
|
638
|
+
collectPublicInputs: true,
|
|
639
|
+
collectStatistics: false
|
|
640
|
+
});
|
|
641
|
+
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
|
|
642
|
+
const processed = await this.processTxs(publicProcessor, txs);
|
|
643
|
+
this.checkState();
|
|
644
|
+
await this.prover.addTxs(processed);
|
|
645
|
+
} catch (e) {
|
|
646
|
+
env.error = e;
|
|
647
|
+
env.hasError = true;
|
|
648
|
+
} finally{
|
|
649
|
+
const result = _ts_dispose_resources(env);
|
|
650
|
+
if (result) await result;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
this.checkState();
|
|
570
654
|
this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
|
|
571
655
|
blockNumber: block.number,
|
|
572
656
|
blockHash: (await block.hash()).toString(),
|
|
@@ -655,18 +739,59 @@ _dec = trackSpan('EpochProvingJob.run', function() {
|
|
|
655
739
|
* as subsequent blocks' synced state already includes them.
|
|
656
740
|
* 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.
|
|
657
741
|
*/ async createFork(blockNumber, l1ToL2Messages) {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
742
|
+
const env = {
|
|
743
|
+
stack: [],
|
|
744
|
+
error: void 0,
|
|
745
|
+
hasError: false
|
|
746
|
+
};
|
|
747
|
+
try {
|
|
748
|
+
this.log.verbose(`Creating fork at ${blockNumber}`, {
|
|
749
|
+
blockNumber
|
|
666
750
|
});
|
|
667
|
-
|
|
751
|
+
const cleanup = _ts_add_disposable_resource(env, new AsyncDisposableStack(), true);
|
|
752
|
+
const db = cleanup.use(await this.dbProvider.fork(blockNumber));
|
|
753
|
+
if (l1ToL2Messages !== undefined) {
|
|
754
|
+
this.log.verbose(`Inserting ${l1ToL2Messages.length} L1 to L2 messages in fork`, {
|
|
755
|
+
blockNumber,
|
|
756
|
+
l1ToL2Messages: l1ToL2Messages.map((m)=>m.toString())
|
|
757
|
+
});
|
|
758
|
+
await appendL1ToL2MessagesToTree(db, l1ToL2Messages);
|
|
759
|
+
}
|
|
760
|
+
// everything run succesfully so we can release this stack and give control of the fork's lifetime to the caller
|
|
761
|
+
cleanup.move();
|
|
762
|
+
return db;
|
|
763
|
+
} catch (e) {
|
|
764
|
+
env.error = e;
|
|
765
|
+
env.hasError = true;
|
|
766
|
+
} finally{
|
|
767
|
+
const result = _ts_dispose_resources(env);
|
|
768
|
+
if (result) await result;
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
async processCheckpoints(parallelism, processCheckpoint) {
|
|
772
|
+
let hasError = false;
|
|
773
|
+
let firstError;
|
|
774
|
+
await asyncPool(Math.max(parallelism, 1), this.checkpoints, async (checkpoint)=>{
|
|
775
|
+
if (hasError || this.abortController.signal.aborted) {
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
778
|
+
try {
|
|
779
|
+
this.checkState();
|
|
780
|
+
await processCheckpoint(checkpoint);
|
|
781
|
+
} catch (err) {
|
|
782
|
+
if (!hasError) {
|
|
783
|
+
hasError = true;
|
|
784
|
+
firstError = err;
|
|
785
|
+
this.failProcessing();
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
});
|
|
789
|
+
if (hasError) {
|
|
790
|
+
throw firstError;
|
|
791
|
+
}
|
|
792
|
+
if (this.abortController.signal.aborted) {
|
|
793
|
+
this.checkState();
|
|
668
794
|
}
|
|
669
|
-
return db;
|
|
670
795
|
}
|
|
671
796
|
progressState(state) {
|
|
672
797
|
this.checkState();
|
|
@@ -679,11 +804,21 @@ _dec = trackSpan('EpochProvingJob.run', function() {
|
|
|
679
804
|
}
|
|
680
805
|
async stop(state = 'stopped') {
|
|
681
806
|
this.state = state;
|
|
682
|
-
this.
|
|
807
|
+
this.interruptProcessing();
|
|
683
808
|
if (this.runPromise) {
|
|
684
809
|
await this.runPromise;
|
|
685
810
|
}
|
|
686
811
|
}
|
|
812
|
+
failProcessing() {
|
|
813
|
+
if (!EpochProvingJobTerminalState.includes(this.state)) {
|
|
814
|
+
this.state = 'failed';
|
|
815
|
+
}
|
|
816
|
+
this.interruptProcessing();
|
|
817
|
+
}
|
|
818
|
+
interruptProcessing() {
|
|
819
|
+
this.abortController.abort();
|
|
820
|
+
this.prover.cancel();
|
|
821
|
+
}
|
|
687
822
|
scheduleDeadlineStop() {
|
|
688
823
|
const deadline = this.deadline;
|
|
689
824
|
if (deadline) {
|
|
@@ -754,8 +889,10 @@ _dec = trackSpan('EpochProvingJob.run', function() {
|
|
|
754
889
|
async processTxs(publicProcessor, txs) {
|
|
755
890
|
const { deadline } = this;
|
|
756
891
|
const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
|
|
757
|
-
deadline
|
|
892
|
+
deadline,
|
|
893
|
+
signal: this.abortController.signal
|
|
758
894
|
});
|
|
895
|
+
this.checkState();
|
|
759
896
|
if (failedTxs.length) {
|
|
760
897
|
const failedTxHashes = await Promise.all(failedTxs.map(({ tx })=>tx.getTxHash()));
|
|
761
898
|
throw new Error(`Txs failed processing: ${failedTxs.map(({ error }, index)=>`${failedTxHashes[index]} (${error})`).join(', ')}`);
|
|
@@ -53,6 +53,10 @@ export declare class ProverNodePublisher {
|
|
|
53
53
|
batchedBlobInputs: BatchedBlob;
|
|
54
54
|
attestations: ViemCommitteeAttestation[];
|
|
55
55
|
}): Promise<boolean>;
|
|
56
|
+
private waitUntilStartBuildsOnProven;
|
|
57
|
+
private getProvenCheckpoint;
|
|
58
|
+
private isStartBuildingOnProven;
|
|
59
|
+
private getSecondsUntilProofSubmissionWindowEnd;
|
|
56
60
|
private validateEpochProofSubmission;
|
|
57
61
|
/**
|
|
58
62
|
* Estimates what submitting the epoch proof would have cost on L1 without actually sending it.
|
|
@@ -73,4 +77,4 @@ export declare class ProverNodePublisher {
|
|
|
73
77
|
private getEpochProofPublicInputsArgs;
|
|
74
78
|
private getSubmitEpochProofArgs;
|
|
75
79
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUtcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3pELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUcvRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFPbkYsc0VBQXNFO0FBQ3RFLE1BQU0sTUFBTSxzQkFBc0IsR0FBRztJQUNuQyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDcEIsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxFQUFFLENBQUM7SUFDakIsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNaLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLHlCQUF5QixDQUFDLENBQUM7SUFDNUQsS0FBSyxFQUFFLEtBQUssQ0FBQztDQUNkLENBQUM7QUFFRixxQkFBYSxtQkFBbUI7SUFDOUIsT0FBTyxDQUFDLFdBQVcsQ0FBUztJQUM1QixPQUFPLENBQUMsT0FBTyxDQUE2QjtJQUU1QyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztJQUV0QixTQUFTLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQztJQUV6QyxTQUFnQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBRXJDLFlBQ0UsTUFBTSxFQUFFLGNBQWMsR0FBRyxlQUFlLEVBQ3hDLElBQUksRUFBRTtRQUNKLGNBQWMsRUFBRSxjQUFjLENBQUM7UUFDL0IsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNyQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7S0FDN0IsRUFDRCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBUzFCO0lBRU0saUJBQWlCLG1CQUV2QjtJQUVEOzs7OztPQUtHO0lBQ0ksU0FBUyxTQUdmO0lBRUQsd0RBQXdEO0lBQ2pELE9BQU8sU0FHYjtJQUVNLGdCQUFnQixlQUV0QjtJQUVZLGdCQUFnQixDQUFDLElBQUksRUFBRTtRQUNsQyxXQUFXLEVBQUUsV0FBVyxDQUFDO1FBQ3pCLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQztRQUNqQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0IsWUFBWSxFQUFFLHNCQUFzQixDQUFDO1FBQ3JDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDYixpQkFBaUIsRUFBRSxXQUFXLENBQUM7UUFDL0IsWUFBWSxFQUFFLHdCQUF3QixFQUFFLENBQUM7S0FDMUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBc0RuQjtZQUVhLDRCQUE0QjtZQWlDNUIsbUJBQW1CO0lBSWpDLE9BQU8sQ0FBQyx1QkFBdUI7WUFJakIsdUNBQXVDO1lBTXZDLDRCQUE0QjtJQW1FMUM7Ozs7T0FJRztJQUNVLDJCQUEyQixDQUFDLElBQUksRUFBRTtRQUM3QyxXQUFXLEVBQUUsV0FBVyxDQUFDO1FBQ3pCLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQztRQUNqQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0IsWUFBWSxFQUFFLHNCQUFzQixDQUFDO1FBQ3JDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDYixpQkFBaUIsRUFBRSxXQUFXLENBQUM7UUFDL0IsWUFBWSxFQUFFLHdCQUF3QixFQUFFLENBQUM7S0FDMUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBc0NoQjtJQUVELE9BQU8sQ0FBQyw4QkFBOEI7WUFleEIsc0JBQXNCO0lBNENwQyxPQUFPLENBQUMsNkJBQTZCO0lBMEJyQyxPQUFPLENBQUMsdUJBQXVCO0NBdUJoQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAOnF,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,yBAAyB,CAAC,CAAC;IAC5D,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,YACE,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACJ,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B,EACD,QAAQ,CAAC,EAAE,cAAc,EAS1B;IAEM,iBAAiB,mBAEvB;IAED;;;;;OAKG;IACI,SAAS,SAGf;IAED,wDAAwD;IACjD,OAAO,SAGb;IAEM,gBAAgB,eAEtB;IAEY,gBAAgB,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,EAAE,gBAAgB,CAAC;QACjC,YAAY,EAAE,gBAAgB,CAAC;QAC/B,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,CAAC,CAsDnB;YAEa,4BAA4B;YAiC5B,mBAAmB;IAIjC,OAAO,CAAC,uBAAuB;YAIjB,uCAAuC;YAMvC,4BAA4B;IAmE1C;;;;OAIG;IACU,2BAA2B,CAAC,IAAI,EAAE;QAC7C,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,EAAE,gBAAgB,CAAC;QACjC,YAAY,EAAE,gBAAgB,CAAC;QAC/B,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,IAAI,CAAC,CAsChB;IAED,OAAO,CAAC,8BAA8B;YAexB,sBAAsB;IA4CpC,OAAO,CAAC,6BAA6B;IA0BrC,OAAO,CAAC,uBAAuB;CAuBhC"}
|
|
@@ -6,9 +6,11 @@ import { areArraysEqual } from '@aztec/foundation/collection';
|
|
|
6
6
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
7
7
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
8
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
9
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
9
10
|
import { Timer } from '@aztec/foundation/timer';
|
|
10
11
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
11
12
|
import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
13
|
+
import { getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
12
14
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
13
15
|
import { inspect } from 'util';
|
|
14
16
|
import { encodeFunctionData, formatEther, formatGwei } from 'viem';
|
|
@@ -53,6 +55,10 @@ export class ProverNodePublisher {
|
|
|
53
55
|
toCheckpoint
|
|
54
56
|
};
|
|
55
57
|
if (!this.interrupted) {
|
|
58
|
+
if (!await this.waitUntilStartBuildsOnProven(args)) {
|
|
59
|
+
this.log.verbose('Checkpoint data syncing interrupted', ctx);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
56
62
|
const timer = new Timer();
|
|
57
63
|
// Validate epoch proof range and hashes are correct before submitting
|
|
58
64
|
await this.validateEpochProofSubmission(args);
|
|
@@ -93,6 +99,42 @@ export class ProverNodePublisher {
|
|
|
93
99
|
this.log.verbose('Checkpoint data syncing interrupted', ctx);
|
|
94
100
|
return false;
|
|
95
101
|
}
|
|
102
|
+
async waitUntilStartBuildsOnProven(args) {
|
|
103
|
+
const { epochNumber, fromCheckpoint } = args;
|
|
104
|
+
const provenCheckpoint = await this.getProvenCheckpoint();
|
|
105
|
+
if (this.isStartBuildingOnProven(fromCheckpoint, provenCheckpoint)) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
const timeout = await this.getSecondsUntilProofSubmissionWindowEnd(epochNumber);
|
|
109
|
+
this.log.info(`Waiting for proven checkpoint to reach proof start`, {
|
|
110
|
+
epochNumber,
|
|
111
|
+
fromCheckpoint,
|
|
112
|
+
provenCheckpoint,
|
|
113
|
+
timeout
|
|
114
|
+
});
|
|
115
|
+
await retryUntil(async ()=>{
|
|
116
|
+
if (this.interrupted) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
const proven = await this.getProvenCheckpoint();
|
|
120
|
+
this.log.verbose(`Proven checkpoint is at ${proven} (waiting for ${fromCheckpoint - 1})`, {
|
|
121
|
+
epochNumber
|
|
122
|
+
});
|
|
123
|
+
return this.isStartBuildingOnProven(fromCheckpoint, proven) ? true : undefined;
|
|
124
|
+
}, `proven checkpoint to reach ${fromCheckpoint - 1}`, timeout, 4);
|
|
125
|
+
return !this.interrupted;
|
|
126
|
+
}
|
|
127
|
+
async getProvenCheckpoint() {
|
|
128
|
+
return (await this.rollupContract.getTips()).proven;
|
|
129
|
+
}
|
|
130
|
+
isStartBuildingOnProven(fromCheckpoint, provenCheckpoint) {
|
|
131
|
+
return fromCheckpoint - 1 <= provenCheckpoint;
|
|
132
|
+
}
|
|
133
|
+
async getSecondsUntilProofSubmissionWindowEnd(epochNumber) {
|
|
134
|
+
const deadline = getProofSubmissionDeadlineTimestamp(epochNumber, await this.rollupContract.getRollupConstants());
|
|
135
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
136
|
+
return Math.max(Number(deadline - now), 0.001);
|
|
137
|
+
}
|
|
96
138
|
async validateEpochProofSubmission(args) {
|
|
97
139
|
const { fromCheckpoint, toCheckpoint, publicInputs, batchedBlobInputs } = args;
|
|
98
140
|
// Check that the checkpoint numbers match the expected epoch to be proven
|
package/dest/prover-node.js
CHANGED
|
@@ -519,10 +519,10 @@ _dec = trackSpan('ProverNode.createProvingJob', (epochNumber)=>({
|
|
|
519
519
|
*/ async stop() {
|
|
520
520
|
this.log.info('Stopping ProverNode');
|
|
521
521
|
await this.epochsMonitor.stop();
|
|
522
|
-
await this.prover.stop();
|
|
523
|
-
await tryStop(this.publisherFactory);
|
|
524
522
|
this.publisher?.interrupt();
|
|
525
523
|
await Promise.all(Array.from(this.jobs.values()).map((job)=>job.stop()));
|
|
524
|
+
await this.prover.stop();
|
|
525
|
+
await tryStop(this.publisherFactory);
|
|
526
526
|
this.rewardsMetrics.stop();
|
|
527
527
|
this.l1Metrics.stop();
|
|
528
528
|
await this.telemetryClient.stop();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "5.0.0-nightly.
|
|
3
|
+
"version": "5.0.0-nightly.20260526",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,28 +56,28 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/archiver": "5.0.0-nightly.
|
|
60
|
-
"@aztec/bb-prover": "5.0.0-nightly.
|
|
61
|
-
"@aztec/blob-client": "5.0.0-nightly.
|
|
62
|
-
"@aztec/blob-lib": "5.0.0-nightly.
|
|
63
|
-
"@aztec/constants": "5.0.0-nightly.
|
|
64
|
-
"@aztec/epoch-cache": "5.0.0-nightly.
|
|
65
|
-
"@aztec/ethereum": "5.0.0-nightly.
|
|
66
|
-
"@aztec/foundation": "5.0.0-nightly.
|
|
67
|
-
"@aztec/kv-store": "5.0.0-nightly.
|
|
68
|
-
"@aztec/l1-artifacts": "5.0.0-nightly.
|
|
69
|
-
"@aztec/native": "5.0.0-nightly.
|
|
70
|
-
"@aztec/node-keystore": "5.0.0-nightly.
|
|
71
|
-
"@aztec/node-lib": "5.0.0-nightly.
|
|
72
|
-
"@aztec/noir-protocol-circuits-types": "5.0.0-nightly.
|
|
73
|
-
"@aztec/p2p": "5.0.0-nightly.
|
|
74
|
-
"@aztec/protocol-contracts": "5.0.0-nightly.
|
|
75
|
-
"@aztec/prover-client": "5.0.0-nightly.
|
|
76
|
-
"@aztec/sequencer-client": "5.0.0-nightly.
|
|
77
|
-
"@aztec/simulator": "5.0.0-nightly.
|
|
78
|
-
"@aztec/stdlib": "5.0.0-nightly.
|
|
79
|
-
"@aztec/telemetry-client": "5.0.0-nightly.
|
|
80
|
-
"@aztec/world-state": "5.0.0-nightly.
|
|
59
|
+
"@aztec/archiver": "5.0.0-nightly.20260526",
|
|
60
|
+
"@aztec/bb-prover": "5.0.0-nightly.20260526",
|
|
61
|
+
"@aztec/blob-client": "5.0.0-nightly.20260526",
|
|
62
|
+
"@aztec/blob-lib": "5.0.0-nightly.20260526",
|
|
63
|
+
"@aztec/constants": "5.0.0-nightly.20260526",
|
|
64
|
+
"@aztec/epoch-cache": "5.0.0-nightly.20260526",
|
|
65
|
+
"@aztec/ethereum": "5.0.0-nightly.20260526",
|
|
66
|
+
"@aztec/foundation": "5.0.0-nightly.20260526",
|
|
67
|
+
"@aztec/kv-store": "5.0.0-nightly.20260526",
|
|
68
|
+
"@aztec/l1-artifacts": "5.0.0-nightly.20260526",
|
|
69
|
+
"@aztec/native": "5.0.0-nightly.20260526",
|
|
70
|
+
"@aztec/node-keystore": "5.0.0-nightly.20260526",
|
|
71
|
+
"@aztec/node-lib": "5.0.0-nightly.20260526",
|
|
72
|
+
"@aztec/noir-protocol-circuits-types": "5.0.0-nightly.20260526",
|
|
73
|
+
"@aztec/p2p": "5.0.0-nightly.20260526",
|
|
74
|
+
"@aztec/protocol-contracts": "5.0.0-nightly.20260526",
|
|
75
|
+
"@aztec/prover-client": "5.0.0-nightly.20260526",
|
|
76
|
+
"@aztec/sequencer-client": "5.0.0-nightly.20260526",
|
|
77
|
+
"@aztec/simulator": "5.0.0-nightly.20260526",
|
|
78
|
+
"@aztec/stdlib": "5.0.0-nightly.20260526",
|
|
79
|
+
"@aztec/telemetry-client": "5.0.0-nightly.20260526",
|
|
80
|
+
"@aztec/world-state": "5.0.0-nightly.20260526",
|
|
81
81
|
"source-map-support": "^0.5.21",
|
|
82
82
|
"tslib": "^2.4.0",
|
|
83
83
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
@@ -46,6 +46,7 @@ export class EpochProvingJob implements Traceable {
|
|
|
46
46
|
private uuid: string;
|
|
47
47
|
|
|
48
48
|
private runPromise: Promise<void> | undefined;
|
|
49
|
+
private abortController = new AbortController();
|
|
49
50
|
private epochCheckPromise: RunningPromise | undefined;
|
|
50
51
|
private deadlineTimeoutHandler: NodeJS.Timeout | undefined;
|
|
51
52
|
|
|
@@ -170,7 +171,7 @@ export class EpochProvingJob implements Traceable {
|
|
|
170
171
|
? AVM_MAX_CONCURRENT_SIMULATIONS
|
|
171
172
|
: this.checkpoints.length;
|
|
172
173
|
|
|
173
|
-
await
|
|
174
|
+
await this.processCheckpoints(parallelism, async checkpoint => {
|
|
174
175
|
this.checkState();
|
|
175
176
|
const checkpointTimer = new Timer();
|
|
176
177
|
|
|
@@ -228,22 +229,26 @@ export class EpochProvingJob implements Traceable {
|
|
|
228
229
|
|
|
229
230
|
// Process public fns. L1 to L2 messages are only inserted for the first block of a checkpoint,
|
|
230
231
|
// as the fork for subsequent blocks already includes them from the previous block's synced state.
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
232
|
+
{
|
|
233
|
+
await using db = await this.createFork(
|
|
234
|
+
BlockNumber(block.number - 1),
|
|
235
|
+
blockIndex === 0 ? l1ToL2Messages : undefined,
|
|
236
|
+
);
|
|
237
|
+
this.checkState();
|
|
238
|
+
const config = PublicSimulatorConfig.from({
|
|
239
|
+
proverId: this.prover.getProverId().toField(),
|
|
240
|
+
skipFeeEnforcement: false,
|
|
241
|
+
collectDebugLogs: false,
|
|
242
|
+
collectHints: true,
|
|
243
|
+
collectPublicInputs: true,
|
|
244
|
+
collectStatistics: false,
|
|
245
|
+
});
|
|
246
|
+
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
|
|
247
|
+
const processed = await this.processTxs(publicProcessor, txs);
|
|
248
|
+
this.checkState();
|
|
249
|
+
await this.prover.addTxs(processed);
|
|
250
|
+
}
|
|
251
|
+
this.checkState();
|
|
247
252
|
this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
|
|
248
253
|
blockNumber: block.number,
|
|
249
254
|
blockHash: (await block.hash()).toString(),
|
|
@@ -337,7 +342,9 @@ export class EpochProvingJob implements Traceable {
|
|
|
337
342
|
*/
|
|
338
343
|
private async createFork(blockNumber: BlockNumber, l1ToL2Messages: Fr[] | undefined) {
|
|
339
344
|
this.log.verbose(`Creating fork at ${blockNumber}`, { blockNumber });
|
|
340
|
-
|
|
345
|
+
// temporary stack to control fork lifetime
|
|
346
|
+
await using cleanup = new AsyncDisposableStack();
|
|
347
|
+
const db = cleanup.use(await this.dbProvider.fork(blockNumber));
|
|
341
348
|
|
|
342
349
|
if (l1ToL2Messages !== undefined) {
|
|
343
350
|
this.log.verbose(`Inserting ${l1ToL2Messages.length} L1 to L2 messages in fork`, {
|
|
@@ -347,9 +354,44 @@ export class EpochProvingJob implements Traceable {
|
|
|
347
354
|
await appendL1ToL2MessagesToTree(db, l1ToL2Messages);
|
|
348
355
|
}
|
|
349
356
|
|
|
357
|
+
// everything run succesfully so we can release this stack and give control of the fork's lifetime to the caller
|
|
358
|
+
cleanup.move();
|
|
350
359
|
return db;
|
|
351
360
|
}
|
|
352
361
|
|
|
362
|
+
private async processCheckpoints(
|
|
363
|
+
parallelism: number,
|
|
364
|
+
processCheckpoint: (checkpoint: Checkpoint) => Promise<void>,
|
|
365
|
+
): Promise<void> {
|
|
366
|
+
let hasError = false;
|
|
367
|
+
let firstError: unknown;
|
|
368
|
+
|
|
369
|
+
await asyncPool(Math.max(parallelism, 1), this.checkpoints, async checkpoint => {
|
|
370
|
+
if (hasError || this.abortController.signal.aborted) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
try {
|
|
375
|
+
this.checkState();
|
|
376
|
+
await processCheckpoint(checkpoint);
|
|
377
|
+
} catch (err) {
|
|
378
|
+
if (!hasError) {
|
|
379
|
+
hasError = true;
|
|
380
|
+
firstError = err;
|
|
381
|
+
this.failProcessing();
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
if (hasError) {
|
|
387
|
+
throw firstError;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (this.abortController.signal.aborted) {
|
|
391
|
+
this.checkState();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
353
395
|
private progressState(state: EpochProvingJobState) {
|
|
354
396
|
this.checkState();
|
|
355
397
|
this.state = state;
|
|
@@ -363,12 +405,24 @@ export class EpochProvingJob implements Traceable {
|
|
|
363
405
|
|
|
364
406
|
public async stop(state: EpochProvingJobTerminalState = 'stopped') {
|
|
365
407
|
this.state = state;
|
|
366
|
-
this.
|
|
408
|
+
this.interruptProcessing();
|
|
367
409
|
if (this.runPromise) {
|
|
368
410
|
await this.runPromise;
|
|
369
411
|
}
|
|
370
412
|
}
|
|
371
413
|
|
|
414
|
+
private failProcessing() {
|
|
415
|
+
if (!EpochProvingJobTerminalState.includes(this.state)) {
|
|
416
|
+
this.state = 'failed';
|
|
417
|
+
}
|
|
418
|
+
this.interruptProcessing();
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
private interruptProcessing() {
|
|
422
|
+
this.abortController.abort();
|
|
423
|
+
this.prover.cancel();
|
|
424
|
+
}
|
|
425
|
+
|
|
372
426
|
private scheduleDeadlineStop() {
|
|
373
427
|
const deadline = this.deadline;
|
|
374
428
|
if (deadline) {
|
|
@@ -444,7 +498,11 @@ export class EpochProvingJob implements Traceable {
|
|
|
444
498
|
|
|
445
499
|
private async processTxs(publicProcessor: PublicProcessor, txs: Tx[]): Promise<ProcessedTx[]> {
|
|
446
500
|
const { deadline } = this;
|
|
447
|
-
const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
|
|
501
|
+
const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
|
|
502
|
+
deadline,
|
|
503
|
+
signal: this.abortController.signal,
|
|
504
|
+
});
|
|
505
|
+
this.checkState();
|
|
448
506
|
|
|
449
507
|
if (failedTxs.length) {
|
|
450
508
|
const failedTxHashes = await Promise.all(failedTxs.map(({ tx }) => tx.getTxHash()));
|
|
@@ -8,11 +8,13 @@ import { areArraysEqual } from '@aztec/foundation/collection';
|
|
|
8
8
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
9
9
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
10
10
|
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
11
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
11
12
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
12
13
|
import { Timer } from '@aztec/foundation/timer';
|
|
13
14
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
14
15
|
import type { PublisherConfig, TxSenderConfig } from '@aztec/sequencer-client';
|
|
15
16
|
import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
17
|
+
import { getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
16
18
|
import type { Proof } from '@aztec/stdlib/proofs';
|
|
17
19
|
import type { FeeRecipient, RootRollupPublicInputs } from '@aztec/stdlib/rollup';
|
|
18
20
|
import type { L1PublishProofStats } from '@aztec/stdlib/stats';
|
|
@@ -101,6 +103,11 @@ export class ProverNodePublisher {
|
|
|
101
103
|
const ctx = { epochNumber, fromCheckpoint, toCheckpoint };
|
|
102
104
|
|
|
103
105
|
if (!this.interrupted) {
|
|
106
|
+
if (!(await this.waitUntilStartBuildsOnProven(args))) {
|
|
107
|
+
this.log.verbose('Checkpoint data syncing interrupted', ctx);
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
|
|
104
111
|
const timer = new Timer();
|
|
105
112
|
// Validate epoch proof range and hashes are correct before submitting
|
|
106
113
|
await this.validateEpochProofSubmission(args);
|
|
@@ -147,6 +154,53 @@ export class ProverNodePublisher {
|
|
|
147
154
|
return false;
|
|
148
155
|
}
|
|
149
156
|
|
|
157
|
+
private async waitUntilStartBuildsOnProven(args: { epochNumber: EpochNumber; fromCheckpoint: CheckpointNumber }) {
|
|
158
|
+
const { epochNumber, fromCheckpoint } = args;
|
|
159
|
+
const provenCheckpoint = await this.getProvenCheckpoint();
|
|
160
|
+
if (this.isStartBuildingOnProven(fromCheckpoint, provenCheckpoint)) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const timeout = await this.getSecondsUntilProofSubmissionWindowEnd(epochNumber);
|
|
165
|
+
this.log.info(`Waiting for proven checkpoint to reach proof start`, {
|
|
166
|
+
epochNumber,
|
|
167
|
+
fromCheckpoint,
|
|
168
|
+
provenCheckpoint,
|
|
169
|
+
timeout,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
await retryUntil(
|
|
173
|
+
async () => {
|
|
174
|
+
if (this.interrupted) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const proven = await this.getProvenCheckpoint();
|
|
179
|
+
this.log.verbose(`Proven checkpoint is at ${proven} (waiting for ${fromCheckpoint - 1})`, { epochNumber });
|
|
180
|
+
return this.isStartBuildingOnProven(fromCheckpoint, proven) ? true : undefined;
|
|
181
|
+
},
|
|
182
|
+
`proven checkpoint to reach ${fromCheckpoint - 1}`,
|
|
183
|
+
timeout,
|
|
184
|
+
4,
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
return !this.interrupted;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private async getProvenCheckpoint() {
|
|
191
|
+
return (await this.rollupContract.getTips()).proven;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private isStartBuildingOnProven(fromCheckpoint: CheckpointNumber, provenCheckpoint: CheckpointNumber) {
|
|
195
|
+
return fromCheckpoint - 1 <= provenCheckpoint;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private async getSecondsUntilProofSubmissionWindowEnd(epochNumber: EpochNumber) {
|
|
199
|
+
const deadline = getProofSubmissionDeadlineTimestamp(epochNumber, await this.rollupContract.getRollupConstants());
|
|
200
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
201
|
+
return Math.max(Number(deadline - now), 0.001);
|
|
202
|
+
}
|
|
203
|
+
|
|
150
204
|
private async validateEpochProofSubmission(args: {
|
|
151
205
|
fromCheckpoint: CheckpointNumber;
|
|
152
206
|
toCheckpoint: CheckpointNumber;
|
package/src/prover-node.ts
CHANGED
|
@@ -166,10 +166,10 @@ export class ProverNode implements EpochMonitorHandler, ProverNodeApi, Traceable
|
|
|
166
166
|
async stop() {
|
|
167
167
|
this.log.info('Stopping ProverNode');
|
|
168
168
|
await this.epochsMonitor.stop();
|
|
169
|
-
await this.prover.stop();
|
|
170
|
-
await tryStop(this.publisherFactory);
|
|
171
169
|
this.publisher?.interrupt();
|
|
172
170
|
await Promise.all(Array.from(this.jobs.values()).map(job => job.stop()));
|
|
171
|
+
await this.prover.stop();
|
|
172
|
+
await tryStop(this.publisherFactory);
|
|
173
173
|
this.rewardsMetrics.stop();
|
|
174
174
|
this.l1Metrics.stop();
|
|
175
175
|
await this.telemetryClient.stop();
|