@aztec/prover-node 3.0.0-nightly.20251202 → 3.0.0-nightly.20251203
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/job/epoch-proving-job-data.d.ts +6 -5
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
- package/dest/job/epoch-proving-job-data.js +23 -17
- package/dest/job/epoch-proving-job.d.ts +3 -3
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +87 -83
- package/dest/metrics.d.ts +3 -2
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +7 -1
- package/dest/prover-node-publisher.d.ts +4 -4
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +24 -25
- package/dest/prover-node.d.ts +2 -2
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +27 -24
- package/package.json +22 -22
- package/src/job/epoch-proving-job-data.ts +27 -22
- package/src/job/epoch-proving-job.ts +99 -97
- package/src/metrics.ts +13 -1
- package/src/prover-node-publisher.ts +37 -34
- package/src/prover-node.ts +34 -28
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
|
-
import { CommitteeAttestation
|
|
3
|
+
import { CommitteeAttestation } from '@aztec/stdlib/block';
|
|
4
|
+
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
4
5
|
import { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
5
6
|
/** All data from an epoch used in proving. */
|
|
6
7
|
export type EpochProvingJobData = {
|
|
7
8
|
epochNumber: EpochNumber;
|
|
8
|
-
|
|
9
|
+
checkpoints: Checkpoint[];
|
|
9
10
|
txs: Map<string, Tx>;
|
|
10
|
-
l1ToL2Messages: Record<
|
|
11
|
+
l1ToL2Messages: Record<CheckpointNumber, Fr[]>;
|
|
11
12
|
previousBlockHeader: BlockHeader;
|
|
12
13
|
attestations: CommitteeAttestation[];
|
|
13
14
|
};
|
|
14
15
|
export declare function validateEpochProvingJobData(data: EpochProvingJobData): void;
|
|
15
16
|
export declare function serializeEpochProvingJobData(data: EpochProvingJobData): Buffer;
|
|
16
17
|
export declare function deserializeEpochProvingJobData(buf: Buffer): EpochProvingJobData;
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2ItZGF0YS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2pvYi9lcG9jaC1wcm92aW5nLWpvYi1kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsOENBQThDO0FBQzlDLE1BQU0sTUFBTSxtQkFBbUIsR0FBRztJQUNoQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0lBQ3pCLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUMxQixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyQixjQUFjLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO0lBQ2pDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxDQUFDO0NBQ3RDLENBQUM7QUFFRix3QkFBZ0IsMkJBQTJCLENBQUMsSUFBSSxFQUFFLG1CQUFtQixRQWtCcEU7QUFFRCx3QkFBZ0IsNEJBQTRCLENBQUMsSUFBSSxFQUFFLG1CQUFtQixHQUFHLE1BQU0sQ0FzQjlFO0FBRUQsd0JBQWdCLDhCQUE4QixDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsbUJBQW1CLENBb0IvRSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch-proving-job-data.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"epoch-proving-job-data.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEnD,8CAA8C;AAC9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,mBAAmB,EAAE,WAAW,CAAC;IACjC,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,mBAAmB,QAkBpE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAsB9E;AAED,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAoB/E"}
|
|
@@ -1,41 +1,47 @@
|
|
|
1
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
3
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
4
|
-
import { CommitteeAttestation
|
|
4
|
+
import { CommitteeAttestation } from '@aztec/stdlib/block';
|
|
5
|
+
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
5
6
|
import { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
6
7
|
export function validateEpochProvingJobData(data) {
|
|
7
|
-
if (data.
|
|
8
|
-
throw new Error(
|
|
8
|
+
if (data.checkpoints.length === 0) {
|
|
9
|
+
throw new Error('No checkpoints to prove');
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const firstBlockNumber = data.checkpoints[0].blocks[0].number;
|
|
12
|
+
const previousBlockNumber = data.previousBlockHeader.getBlockNumber();
|
|
13
|
+
if (previousBlockNumber + 1 !== firstBlockNumber) {
|
|
14
|
+
throw new Error(`Initial block number ${firstBlockNumber} does not match previous block header ${previousBlockNumber}`);
|
|
15
|
+
}
|
|
16
|
+
for (const checkpoint of data.checkpoints){
|
|
17
|
+
if (!(checkpoint.number in data.l1ToL2Messages)) {
|
|
18
|
+
throw new Error(`Missing L1 to L2 messages for checkpoint number ${checkpoint.number}`);
|
|
13
19
|
}
|
|
14
20
|
}
|
|
15
21
|
}
|
|
16
22
|
export function serializeEpochProvingJobData(data) {
|
|
17
|
-
const
|
|
23
|
+
const checkpoints = data.checkpoints.map((checkpoint)=>checkpoint.toBuffer());
|
|
18
24
|
const txs = Array.from(data.txs.values()).map((tx)=>tx.toBuffer());
|
|
19
|
-
const l1ToL2Messages = Object.entries(data.l1ToL2Messages).map(([
|
|
20
|
-
Number(
|
|
25
|
+
const l1ToL2Messages = Object.entries(data.l1ToL2Messages).map(([checkpointNumber, messages])=>[
|
|
26
|
+
Number(checkpointNumber),
|
|
21
27
|
messages.length,
|
|
22
28
|
...messages
|
|
23
29
|
]);
|
|
24
30
|
const attestations = data.attestations.map((attestation)=>attestation.toBuffer());
|
|
25
|
-
return serializeToBuffer(data.epochNumber, data.previousBlockHeader,
|
|
31
|
+
return serializeToBuffer(data.epochNumber, data.previousBlockHeader, checkpoints.length, ...checkpoints, txs.length, ...txs, l1ToL2Messages.length, ...l1ToL2Messages, attestations.length, ...attestations);
|
|
26
32
|
}
|
|
27
33
|
export function deserializeEpochProvingJobData(buf) {
|
|
28
34
|
const reader = BufferReader.asReader(buf);
|
|
29
35
|
const epochNumber = EpochNumber(reader.readNumber());
|
|
30
36
|
const previousBlockHeader = reader.readObject(BlockHeader);
|
|
31
|
-
const
|
|
37
|
+
const checkpoints = reader.readVector(Checkpoint);
|
|
32
38
|
const txArray = reader.readVector(Tx);
|
|
33
|
-
const
|
|
39
|
+
const l1ToL2MessageCheckpointCount = reader.readNumber();
|
|
34
40
|
const l1ToL2Messages = {};
|
|
35
|
-
for(let i = 0; i <
|
|
36
|
-
const
|
|
41
|
+
for(let i = 0; i < l1ToL2MessageCheckpointCount; i++){
|
|
42
|
+
const checkpointNumber = CheckpointNumber(reader.readNumber());
|
|
37
43
|
const messages = reader.readVector(Fr);
|
|
38
|
-
l1ToL2Messages[
|
|
44
|
+
l1ToL2Messages[checkpointNumber] = messages;
|
|
39
45
|
}
|
|
40
46
|
const attestations = reader.readVector(CommitteeAttestation);
|
|
41
47
|
const txs = new Map(txArray.map((tx)=>[
|
|
@@ -45,7 +51,7 @@ export function deserializeEpochProvingJobData(buf) {
|
|
|
45
51
|
return {
|
|
46
52
|
epochNumber,
|
|
47
53
|
previousBlockHeader,
|
|
48
|
-
|
|
54
|
+
checkpoints,
|
|
49
55
|
txs,
|
|
50
56
|
l1ToL2Messages,
|
|
51
57
|
attestations
|
|
@@ -40,7 +40,7 @@ export declare class EpochProvingJob implements Traceable {
|
|
|
40
40
|
getDeadline(): Date | undefined;
|
|
41
41
|
getProvingData(): EpochProvingJobData;
|
|
42
42
|
private get epochNumber();
|
|
43
|
-
private get
|
|
43
|
+
private get checkpoints();
|
|
44
44
|
private get txs();
|
|
45
45
|
private get attestations();
|
|
46
46
|
/**
|
|
@@ -53,10 +53,10 @@ export declare class EpochProvingJob implements Traceable {
|
|
|
53
53
|
stop(state?: EpochProvingJobTerminalState): Promise<void>;
|
|
54
54
|
private scheduleDeadlineStop;
|
|
55
55
|
private scheduleEpochCheck;
|
|
56
|
-
private
|
|
56
|
+
private gatherPreviousBlockHeaders;
|
|
57
57
|
private getTxs;
|
|
58
58
|
private getL1ToL2Messages;
|
|
59
59
|
private processTxs;
|
|
60
60
|
}
|
|
61
61
|
export { type EpochProvingJobState };
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qb2IvZXBvY2gtcHJvdmluZy1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBUzlELE9BQU8sS0FBSyxFQUFtQixzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFjLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJFLE9BQU8sRUFDTCxLQUFLLFdBQVcsRUFDaEIsS0FBSyxvQkFBb0IsRUFDekIsNEJBQTRCLEVBQzVCLEtBQUssd0JBQXdCLEVBQzlCLE1BQU0saUNBQWlDLENBQUM7QUFJekMsT0FBTyxFQUFjLEtBQUssU0FBUyxFQUFFLEtBQUssTUFBTSxFQUFhLE1BQU0seUJBQXlCLENBQUM7QUFJN0YsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBK0IsTUFBTSw2QkFBNkIsQ0FBQztBQUVwRyxNQUFNLE1BQU0sc0JBQXNCLEdBQUc7SUFDbkMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDNUIsY0FBYyxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQ3pCLGVBQWUsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUMzQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILHFCQUFhLGVBQWdCLFlBQVcsU0FBUztJQVk3QyxPQUFPLENBQUMsSUFBSTtJQUNaLE9BQU8sQ0FBQyxVQUFVO0lBQ2xCLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLHNCQUFzQjtJQUM5QixPQUFPLENBQUMsU0FBUztJQUNqQixPQUFPLENBQUMsYUFBYTtJQUNyQixPQUFPLENBQUMsT0FBTztJQUNmLE9BQU8sQ0FBQyxRQUFRO0lBQ2hCLE9BQU8sQ0FBQyxNQUFNO0lBbkJoQixPQUFPLENBQUMsS0FBSyxDQUF1QztJQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFpRDtJQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFTO0lBRXJCLE9BQU8sQ0FBQyxVQUFVLENBQTRCO0lBQzlDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBNkI7SUFDdEQsT0FBTyxDQUFDLHNCQUFzQixDQUE2QjtJQUUzRCxTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRS9CLFlBQ1UsSUFBSSxFQUFFLG1CQUFtQixFQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxFQUNsRCxNQUFNLEVBQUUsV0FBVyxFQUNuQixzQkFBc0IsRUFBRSxzQkFBc0IsRUFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxFQUN4RCxhQUFhLEVBQUUsYUFBYSxHQUFHLFNBQVMsRUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUM3QixRQUFRLEVBQUUsSUFBSSxHQUFHLFNBQVMsRUFDMUIsTUFBTSxFQUFFLHNCQUFzQixFQUt2QztJQUVNLEtBQUssSUFBSSxNQUFNLENBRXJCO0lBRU0sUUFBUSxJQUFJLG9CQUFvQixDQUV0QztJQUVNLGNBQWMsSUFBSSxXQUFXLENBRW5DO0lBRU0sV0FBVyxJQUFJLElBQUksR0FBRyxTQUFTLENBRXJDO0lBRU0sY0FBYyxJQUFJLG1CQUFtQixDQUUzQztJQUVELE9BQU8sS0FBSyxXQUFXLEdBRXRCO0lBRUQsT0FBTyxLQUFLLFdBQVcsR0FFdEI7SUFFRCxPQUFPLEtBQUssR0FBRyxHQUVkO0lBRUQsT0FBTyxLQUFLLFlBQVksR0FFdkI7SUFFRDs7T0FFRztJQUlVLEdBQUcsa0JBaUxmO1lBTWEsVUFBVTtJQWdCeEIsT0FBTyxDQUFDLGFBQWE7SUFLckIsT0FBTyxDQUFDLFVBQVU7SUFNTCxJQUFJLENBQUMsS0FBSyxHQUFFLDRCQUF3QyxpQkFNaEU7SUFFRCxPQUFPLENBQUMsb0JBQW9CO1lBd0JkLGtCQUFrQjtJQStCaEMsT0FBTyxDQUFDLDBCQUEwQjtJQUtsQyxPQUFPLENBQUMsTUFBTTtJQUlkLE9BQU8sQ0FBQyxpQkFBaUI7WUFJWCxVQUFVO0NBbUJ6QjtBQVNELE9BQU8sRUFBRSxLQUFLLG9CQUFvQixFQUFFLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAS9D,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAS9D,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAErE,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;IAY7C,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;IAnBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAiD;IAC5D,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,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,CAAC,EACxD,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE,sBAAsB,EAKvC;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,kBAiLf;YAMa,UAAU;IAgBxB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,KAAK,GAAE,4BAAwC,iBAMhE;IAED,OAAO,CAAC,oBAAoB;YAwBd,kBAAkB;IA+BhC,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAmBzB;AASD,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
|
|
@@ -76,8 +76,8 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
76
76
|
get epochNumber() {
|
|
77
77
|
return this.data.epochNumber;
|
|
78
78
|
}
|
|
79
|
-
get
|
|
80
|
-
return this.data.
|
|
79
|
+
get checkpoints() {
|
|
80
|
+
return this.data.checkpoints;
|
|
81
81
|
}
|
|
82
82
|
get txs() {
|
|
83
83
|
return this.data.txs;
|
|
@@ -94,16 +94,17 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
94
94
|
}
|
|
95
95
|
const attestations = this.attestations.map((attestation)=>attestation.toViem());
|
|
96
96
|
const epochNumber = this.epochNumber;
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
];
|
|
103
|
-
this.
|
|
97
|
+
const epochSizeCheckpoints = this.checkpoints.length;
|
|
98
|
+
const epochSizeBlocks = this.checkpoints.reduce((accum, checkpoint)=>accum + checkpoint.blocks.length, 0);
|
|
99
|
+
const epochSizeTxs = this.checkpoints.reduce((accum, checkpoint)=>accum + checkpoint.blocks.reduce((accumC, block)=>accumC + block.body.txEffects.length, 0), 0);
|
|
100
|
+
const fromCheckpoint = this.checkpoints[0].number;
|
|
101
|
+
const toCheckpoint = this.checkpoints.at(-1).number;
|
|
102
|
+
const fromBlock = this.checkpoints[0].blocks[0].number;
|
|
103
|
+
const toBlock = this.checkpoints.at(-1).blocks.at(-1).number;
|
|
104
|
+
this.log.info(`Starting epoch ${epochNumber} proving job with checkpoints ${fromCheckpoint} to ${toCheckpoint}`, {
|
|
104
105
|
fromBlock,
|
|
105
106
|
toBlock,
|
|
106
|
-
|
|
107
|
+
epochSizeTxs,
|
|
107
108
|
epochNumber,
|
|
108
109
|
uuid: this.uuid
|
|
109
110
|
});
|
|
@@ -112,70 +113,75 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
112
113
|
const { promise, resolve } = promiseWithResolvers();
|
|
113
114
|
this.runPromise = promise;
|
|
114
115
|
try {
|
|
115
|
-
const blobFieldsPerCheckpoint = this.
|
|
116
|
+
const blobFieldsPerCheckpoint = this.checkpoints.map((checkpoint)=>checkpoint.toBlobFields());
|
|
116
117
|
const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
|
|
117
|
-
|
|
118
|
-
// Total number of checkpoints equals number of blocks because we currently build a checkpoint with only one block.
|
|
119
|
-
const totalNumCheckpoints = epochSizeBlocks;
|
|
120
|
-
this.prover.startNewEpoch(epochNumber, totalNumCheckpoints, finalBlobBatchingChallenges);
|
|
118
|
+
this.prover.startNewEpoch(epochNumber, epochSizeCheckpoints, finalBlobBatchingChallenges);
|
|
121
119
|
await this.prover.startChonkVerifierCircuits(Array.from(this.txs.values()));
|
|
122
|
-
|
|
120
|
+
// Everything in the epoch should have the same chainId and version.
|
|
121
|
+
const { chainId, version } = this.checkpoints[0].blocks[0].header.globalVariables;
|
|
122
|
+
const previousBlockHeaders = this.gatherPreviousBlockHeaders();
|
|
123
|
+
await asyncPool(this.config.parallelBlockLimit ?? 32, this.checkpoints, async (checkpoint)=>{
|
|
123
124
|
this.checkState();
|
|
124
|
-
const
|
|
125
|
-
const txs = this.getTxs(block);
|
|
126
|
-
const l1ToL2Messages = this.getL1ToL2Messages(block);
|
|
127
|
-
const previousHeader = this.getBlockHeader(block.number - 1);
|
|
128
|
-
this.log.verbose(`Starting processing block ${block.number}`, {
|
|
129
|
-
number: block.number,
|
|
130
|
-
blockHash: (await block.hash()).toString(),
|
|
131
|
-
lastArchive: block.header.lastArchive.root,
|
|
132
|
-
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
133
|
-
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
134
|
-
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
135
|
-
previousHeader: previousHeader.hash(),
|
|
136
|
-
uuid: this.uuid,
|
|
137
|
-
...globalVariables
|
|
138
|
-
});
|
|
125
|
+
const checkpointIndex = checkpoint.number - fromCheckpoint;
|
|
139
126
|
const checkpointConstants = CheckpointConstantData.from({
|
|
140
|
-
chainId
|
|
141
|
-
version
|
|
127
|
+
chainId,
|
|
128
|
+
version,
|
|
142
129
|
vkTreeRoot: getVKTreeRoot(),
|
|
143
130
|
protocolContractsHash: protocolContractsHash,
|
|
144
131
|
proverId: this.prover.getProverId().toField(),
|
|
145
|
-
slotNumber:
|
|
146
|
-
coinbase:
|
|
147
|
-
feeRecipient:
|
|
148
|
-
gasFees:
|
|
132
|
+
slotNumber: checkpoint.header.slotNumber,
|
|
133
|
+
coinbase: checkpoint.header.coinbase,
|
|
134
|
+
feeRecipient: checkpoint.header.feeRecipient,
|
|
135
|
+
gasFees: checkpoint.header.gasFees
|
|
149
136
|
});
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
// Process public fns
|
|
158
|
-
const db = await this.createFork(block.number - 1, l1ToL2Messages);
|
|
159
|
-
const config = PublicSimulatorConfig.from({
|
|
160
|
-
proverId: this.prover.getProverId().toField(),
|
|
161
|
-
skipFeeEnforcement: false,
|
|
162
|
-
collectDebugLogs: false,
|
|
163
|
-
collectHints: true,
|
|
164
|
-
maxDebugLogMemoryReads: 0,
|
|
165
|
-
collectStatistics: false
|
|
166
|
-
});
|
|
167
|
-
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
|
|
168
|
-
const processed = await this.processTxs(publicProcessor, txs);
|
|
169
|
-
await this.prover.addTxs(processed);
|
|
170
|
-
await db.close();
|
|
171
|
-
this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
|
|
172
|
-
blockNumber: block.number,
|
|
173
|
-
blockHash: (await block.hash()).toString(),
|
|
137
|
+
const previousHeader = previousBlockHeaders[checkpointIndex];
|
|
138
|
+
const l1ToL2Messages = this.getL1ToL2Messages(checkpoint);
|
|
139
|
+
this.log.verbose(`Starting processing checkpoint ${checkpoint.number}`, {
|
|
140
|
+
number: checkpoint.number,
|
|
141
|
+
checkpointHash: checkpoint.hash().toString(),
|
|
142
|
+
lastArchive: checkpoint.header.lastArchiveRoot,
|
|
143
|
+
previousHeader: previousHeader.hash(),
|
|
174
144
|
uuid: this.uuid
|
|
175
145
|
});
|
|
176
|
-
|
|
177
|
-
const
|
|
178
|
-
|
|
146
|
+
await this.prover.startNewCheckpoint(checkpointIndex, checkpointConstants, l1ToL2Messages, checkpoint.blocks.length, previousHeader);
|
|
147
|
+
for (const block of checkpoint.blocks){
|
|
148
|
+
const globalVariables = block.header.globalVariables;
|
|
149
|
+
const txs = this.getTxs(block);
|
|
150
|
+
this.log.verbose(`Starting processing block ${block.number}`, {
|
|
151
|
+
number: block.number,
|
|
152
|
+
blockHash: (await block.hash()).toString(),
|
|
153
|
+
lastArchive: block.header.lastArchive.root,
|
|
154
|
+
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
155
|
+
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
156
|
+
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
157
|
+
...globalVariables,
|
|
158
|
+
numTxs: txs.length
|
|
159
|
+
});
|
|
160
|
+
// Start block proving
|
|
161
|
+
await this.prover.startNewBlock(block.number, globalVariables.timestamp, txs.length);
|
|
162
|
+
// Process public fns
|
|
163
|
+
const db = await this.createFork(block.number - 1, l1ToL2Messages);
|
|
164
|
+
const config = PublicSimulatorConfig.from({
|
|
165
|
+
proverId: this.prover.getProverId().toField(),
|
|
166
|
+
skipFeeEnforcement: false,
|
|
167
|
+
collectDebugLogs: false,
|
|
168
|
+
collectHints: true,
|
|
169
|
+
maxDebugLogMemoryReads: 0,
|
|
170
|
+
collectStatistics: false
|
|
171
|
+
});
|
|
172
|
+
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
|
|
173
|
+
const processed = await this.processTxs(publicProcessor, txs);
|
|
174
|
+
await this.prover.addTxs(processed);
|
|
175
|
+
await db.close();
|
|
176
|
+
this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
|
|
177
|
+
blockNumber: block.number,
|
|
178
|
+
blockHash: (await block.hash()).toString(),
|
|
179
|
+
uuid: this.uuid
|
|
180
|
+
});
|
|
181
|
+
// Mark block as completed to pad it
|
|
182
|
+
const expectedBlockHeader = block.header;
|
|
183
|
+
await this.prover.setBlockCompleted(block.number, expectedBlockHeader);
|
|
184
|
+
}
|
|
179
185
|
});
|
|
180
186
|
const executionTime = timer.ms();
|
|
181
187
|
this.progressState('awaiting-prover');
|
|
@@ -187,14 +193,14 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
187
193
|
});
|
|
188
194
|
this.progressState('publishing-proof');
|
|
189
195
|
if (this.config.skipSubmitProof) {
|
|
190
|
-
this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (
|
|
196
|
+
this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`);
|
|
191
197
|
this.state = 'completed';
|
|
192
|
-
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
|
|
198
|
+
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeCheckpoints, epochSizeBlocks, epochSizeTxs);
|
|
193
199
|
return;
|
|
194
200
|
}
|
|
195
201
|
const success = await this.publisher.submitEpochProof({
|
|
196
|
-
|
|
197
|
-
|
|
202
|
+
fromCheckpoint,
|
|
203
|
+
toCheckpoint,
|
|
198
204
|
epochNumber,
|
|
199
205
|
publicInputs,
|
|
200
206
|
proof,
|
|
@@ -204,12 +210,12 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
204
210
|
if (!success) {
|
|
205
211
|
throw new Error('Failed to submit epoch proof to L1');
|
|
206
212
|
}
|
|
207
|
-
this.log.info(`Submitted proof for epoch ${epochNumber} (
|
|
213
|
+
this.log.info(`Submitted proof for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`, {
|
|
208
214
|
epochNumber,
|
|
209
215
|
uuid: this.uuid
|
|
210
216
|
});
|
|
211
217
|
this.state = 'completed';
|
|
212
|
-
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
|
|
218
|
+
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeCheckpoints, epochSizeBlocks, epochSizeTxs);
|
|
213
219
|
} catch (err) {
|
|
214
220
|
if (err && err.name === 'HaltExecutionError') {
|
|
215
221
|
this.log.warn(`Halted execution of epoch ${epochNumber} prover job`, {
|
|
@@ -299,8 +305,9 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
299
305
|
this.epochCheckPromise = new RunningPromise(async ()=>{
|
|
300
306
|
const blocks = await l2BlockSource.getBlockHeadersForEpoch(this.epochNumber);
|
|
301
307
|
const blockHashes = await Promise.all(blocks.map((block)=>block.hash()));
|
|
302
|
-
const
|
|
303
|
-
|
|
308
|
+
const thisBlocks = this.checkpoints.flatMap((checkpoint)=>checkpoint.blocks);
|
|
309
|
+
const thisBlockHashes = await Promise.all(thisBlocks.map((block)=>block.hash()));
|
|
310
|
+
if (blocks.length !== thisBlocks.length || !blockHashes.every((block, i)=>block.equals(thisBlockHashes[i]))) {
|
|
304
311
|
this.log.warn('Epoch blocks changed underfoot', {
|
|
305
312
|
uuid: this.uuid,
|
|
306
313
|
epochNumber: this.epochNumber,
|
|
@@ -312,21 +319,18 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
312
319
|
}, this.log, intervalMs).start();
|
|
313
320
|
this.log.verbose(`Scheduled epoch check for epoch ${this.epochNumber} every ${intervalMs}ms`);
|
|
314
321
|
}
|
|
315
|
-
/* Returns the header
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
return this.data.previousBlockHeader;
|
|
322
|
-
}
|
|
323
|
-
throw new Error(`Block header not found for block number ${blockNumber} (got ${this.blocks.map((b)=>b.number).join(', ')} and previous header ${this.data.previousBlockHeader.getBlockNumber()})`);
|
|
322
|
+
/* Returns the last block header in the previous checkpoint for all checkpoints in the epoch */ gatherPreviousBlockHeaders() {
|
|
323
|
+
const lastBlocks = this.checkpoints.map((checkpoint)=>checkpoint.blocks.at(-1));
|
|
324
|
+
return [
|
|
325
|
+
this.data.previousBlockHeader,
|
|
326
|
+
...lastBlocks.map((block)=>block.header).slice(0, -1)
|
|
327
|
+
];
|
|
324
328
|
}
|
|
325
329
|
getTxs(block) {
|
|
326
330
|
return block.body.txEffects.map((txEffect)=>this.txs.get(txEffect.txHash.toString()));
|
|
327
331
|
}
|
|
328
|
-
getL1ToL2Messages(
|
|
329
|
-
return this.data.l1ToL2Messages[
|
|
332
|
+
getL1ToL2Messages(checkpoint) {
|
|
333
|
+
return this.data.l1ToL2Messages[checkpoint.number];
|
|
330
334
|
}
|
|
331
335
|
async processTxs(publicProcessor, txs) {
|
|
332
336
|
const { deadline } = this;
|
package/dest/metrics.d.ts
CHANGED
|
@@ -8,10 +8,11 @@ export declare class ProverNodeJobMetrics {
|
|
|
8
8
|
private logger;
|
|
9
9
|
proverEpochExecutionDuration: Histogram;
|
|
10
10
|
provingJobDuration: Histogram;
|
|
11
|
+
provingJobCheckpoints: Gauge;
|
|
11
12
|
provingJobBlocks: Gauge;
|
|
12
13
|
provingJobTransactions: Gauge;
|
|
13
14
|
constructor(meter: Meter, tracer: Tracer, logger?: import("@aztec/foundation/log").Logger);
|
|
14
|
-
recordProvingJob(executionTimeMs: number, totalTimeMs: number, numBlocks: number, numTxs: number): void;
|
|
15
|
+
recordProvingJob(executionTimeMs: number, totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
|
|
15
16
|
}
|
|
16
17
|
export declare class ProverNodeRewardsMetrics {
|
|
17
18
|
private meter;
|
|
@@ -47,4 +48,4 @@ export declare class ProverNodePublisherMetrics {
|
|
|
47
48
|
recordSenderBalance(wei: bigint, senderAddress: string): void;
|
|
48
49
|
private recordTx;
|
|
49
50
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxxQkFBYSxvQkFBb0I7SUFRN0IsT0FBTyxDQUFDLEtBQUs7YUFDRyxNQUFNLEVBQUUsTUFBTTtJQUM5QixPQUFPLENBQUMsTUFBTTtJQVRoQiw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDeEMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQzlCLHFCQUFxQixFQUFFLEtBQUssQ0FBQztJQUM3QixnQkFBZ0IsRUFBRSxLQUFLLENBQUM7SUFDeEIsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO0lBRTlCLFlBQ1UsS0FBSyxFQUFFLEtBQUssRUFDSixNQUFNLEVBQUUsTUFBTSxFQUN0QixNQUFNLHlDQUFnRCxFQXdCL0Q7SUFFTSxnQkFBZ0IsQ0FDckIsZUFBZSxFQUFFLE1BQU0sRUFDdkIsV0FBVyxFQUFFLE1BQU0sRUFDbkIsY0FBYyxFQUFFLE1BQU0sRUFDdEIsU0FBUyxFQUFFLE1BQU0sRUFDakIsTUFBTSxFQUFFLE1BQU0sUUFPZjtDQUNGO0FBRUQscUJBQWEsd0JBQXdCO0lBT2pDLE9BQU8sQ0FBQyxLQUFLO0lBQ2IsT0FBTyxDQUFDLFFBQVE7SUFDaEIsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsTUFBTTtJQVRoQixPQUFPLENBQUMsT0FBTyxDQUFrQjtJQUNqQyxPQUFPLENBQUMsa0JBQWtCLENBQWdCO0lBQzFDLE9BQU8sQ0FBQyxTQUFTLENBQU87SUFDeEIsT0FBTyxDQUFDLHFCQUFxQixDQUFLO0lBRWxDLFlBQ1UsS0FBSyxFQUFFLEtBQUssRUFDWixRQUFRLEVBQUUsVUFBVSxFQUNwQixNQUFNLEVBQUUsY0FBYyxFQUN0QixNQUFNLHlDQUFnRCxFQVcvRDtJQUVZLEtBQUssa0JBSWpCO0lBRU0sSUFBSSxTQUVWO0lBRUQsT0FBTyxDQUFDLE9BQU8sQ0F3QmI7Q0FDSDtBQUVELHFCQUFhLDBCQUEwQjthQWVuQixNQUFNLEVBQUUsZUFBZTtJQUV2QyxPQUFPLENBQUMsTUFBTTtJQWhCaEIsUUFBUSxFQUFFLFNBQVMsQ0FBQztJQUNwQixPQUFPLEVBQUUsYUFBYSxDQUFDO0lBQ3ZCLFVBQVUsRUFBRSxTQUFTLENBQUM7SUFDdEIsS0FBSyxFQUFFLFNBQVMsQ0FBQztJQUNqQixjQUFjLEVBQUUsU0FBUyxDQUFDO0lBQzFCLGFBQWEsRUFBRSxTQUFTLENBQUM7SUFDekIsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQzdCLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztJQUM3QixVQUFVLEVBQUUsU0FBUyxDQUFDO0lBRXRCLE9BQU8sQ0FBQyxhQUFhLENBQVE7SUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixZQUNrQixNQUFNLEVBQUUsZUFBZSxFQUN2QyxJQUFJLFNBQWUsRUFDWCxNQUFNLHlDQUFnRCxFQWtFL0Q7SUFFRCxjQUFjLFNBS2I7SUFFRCxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsUUFFL0Q7SUFFTSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBSzVEO0lBRUQsT0FBTyxDQUFDLFFBQVE7Q0F1Q2pCIn0=
|
package/dest/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,KAAK,EAGV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,oBAAoB;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,KAAK,EAGV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,KAAK;aACG,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,MAAM;IAThB,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,qBAAqB,EAAE,KAAK,CAAC;IAC7B,gBAAgB,EAAE,KAAK,CAAC;IACxB,sBAAsB,EAAE,KAAK,CAAC;IAE9B,YACU,KAAK,EAAE,KAAK,EACJ,MAAM,EAAE,MAAM,EACtB,MAAM,yCAAgD,EAwB/D;IAEM,gBAAgB,CACrB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,QAOf;CACF;AAED,qBAAa,wBAAwB;IAOjC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAThB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,qBAAqB,CAAK;IAElC,YACU,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,cAAc,EACtB,MAAM,yCAAgD,EAW/D;IAEY,KAAK,kBAIjB;IAEM,IAAI,SAEV;IAED,OAAO,CAAC,OAAO,CAwBb;CACH;AAED,qBAAa,0BAA0B;aAenB,MAAM,EAAE,eAAe;IAEvC,OAAO,CAAC,MAAM;IAhBhB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IAEtB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAQ;IAErB,YACkB,MAAM,EAAE,eAAe,EACvC,IAAI,SAAe,EACX,MAAM,yCAAgD,EAkE/D;IAED,cAAc,SAKb;IAED,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,QAE/D;IAEM,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAK5D;IAED,OAAO,CAAC,QAAQ;CAuCjB"}
|
package/dest/metrics.js
CHANGED
|
@@ -7,6 +7,7 @@ export class ProverNodeJobMetrics {
|
|
|
7
7
|
logger;
|
|
8
8
|
proverEpochExecutionDuration;
|
|
9
9
|
provingJobDuration;
|
|
10
|
+
provingJobCheckpoints;
|
|
10
11
|
provingJobBlocks;
|
|
11
12
|
provingJobTransactions;
|
|
12
13
|
constructor(meter, tracer, logger = createLogger('prover-node:publisher:metrics')){
|
|
@@ -23,6 +24,10 @@ export class ProverNodeJobMetrics {
|
|
|
23
24
|
unit: 's',
|
|
24
25
|
valueType: ValueType.DOUBLE
|
|
25
26
|
});
|
|
27
|
+
this.provingJobCheckpoints = this.meter.createGauge(Metrics.PROVER_NODE_JOB_CHECKPOINTS, {
|
|
28
|
+
description: 'Number of checkpoints in a proven epoch',
|
|
29
|
+
valueType: ValueType.INT
|
|
30
|
+
});
|
|
26
31
|
this.provingJobBlocks = this.meter.createGauge(Metrics.PROVER_NODE_JOB_BLOCKS, {
|
|
27
32
|
description: 'Number of blocks in a proven epoch',
|
|
28
33
|
valueType: ValueType.INT
|
|
@@ -32,9 +37,10 @@ export class ProverNodeJobMetrics {
|
|
|
32
37
|
valueType: ValueType.INT
|
|
33
38
|
});
|
|
34
39
|
}
|
|
35
|
-
recordProvingJob(executionTimeMs, totalTimeMs, numBlocks, numTxs) {
|
|
40
|
+
recordProvingJob(executionTimeMs, totalTimeMs, numCheckpoints, numBlocks, numTxs) {
|
|
36
41
|
this.proverEpochExecutionDuration.record(Math.ceil(executionTimeMs));
|
|
37
42
|
this.provingJobDuration.record(totalTimeMs / 1000);
|
|
43
|
+
this.provingJobCheckpoints.record(Math.floor(numCheckpoints));
|
|
38
44
|
this.provingJobBlocks.record(Math.floor(numBlocks));
|
|
39
45
|
this.provingJobTransactions.record(Math.floor(numTxs));
|
|
40
46
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BatchedBlob } from '@aztec/blob-lib';
|
|
2
2
|
import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
|
|
3
3
|
import type { L1TxUtils, RollupContract, ViemCommitteeAttestation } from '@aztec/ethereum';
|
|
4
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
import { Fr } from '@aztec/foundation/fields';
|
|
7
7
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
@@ -44,8 +44,8 @@ export declare class ProverNodePublisher {
|
|
|
44
44
|
getSenderAddress(): EthAddress;
|
|
45
45
|
submitEpochProof(args: {
|
|
46
46
|
epochNumber: EpochNumber;
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
fromCheckpoint: CheckpointNumber;
|
|
48
|
+
toCheckpoint: CheckpointNumber;
|
|
49
49
|
publicInputs: RootRollupPublicInputs;
|
|
50
50
|
proof: Proof;
|
|
51
51
|
batchedBlobInputs: BatchedBlob;
|
|
@@ -56,4 +56,4 @@ export declare class ProverNodePublisher {
|
|
|
56
56
|
private getEpochProofPublicInputsArgs;
|
|
57
57
|
private getSubmitEpochProofArgs;
|
|
58
58
|
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUtcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlDLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3pELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFPbkYsc0VBQXNFO0FBQ3RFLE1BQU0sTUFBTSxzQkFBc0IsR0FBRztJQUNuQyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDcEIsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxFQUFFLENBQUM7SUFDakIsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNaLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLHdCQUF3QixDQUFDLENBQUM7SUFDM0QsS0FBSyxFQUFFLEtBQUssQ0FBQztDQUNkLENBQUM7QUFFRixxQkFBYSxtQkFBbUI7SUFDOUIsT0FBTyxDQUFDLFdBQVcsQ0FBUztJQUM1QixPQUFPLENBQUMsT0FBTyxDQUE2QjtJQUU1QyxTQUFTLENBQUMsR0FBRyx5Q0FBK0M7SUFFNUQsU0FBUyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUM7SUFFekMsU0FBZ0IsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUVyQyxZQUNFLE1BQU0sRUFBRSxjQUFjLEdBQUcsZUFBZSxFQUN4QyxJQUFJLEVBQUU7UUFDSixjQUFjLEVBQUUsY0FBYyxDQUFDO1FBQy9CLFNBQVMsRUFBRSxTQUFTLENBQUM7UUFDckIsU0FBUyxDQUFDLEVBQUUsZUFBZSxDQUFDO0tBQzdCLEVBUUY7SUFFTSxpQkFBaUIsbUJBRXZCO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLFNBR2Y7SUFFRCx3REFBd0Q7SUFDakQsT0FBTyxTQUdiO0lBRU0sZ0JBQWdCLGVBRXRCO0lBRVksZ0JBQWdCLENBQUMsSUFBSSxFQUFFO1FBQ2xDLFdBQVcsRUFBRSxXQUFXLENBQUM7UUFDekIsY0FBYyxFQUFFLGdCQUFnQixDQUFDO1FBQ2pDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQztRQUMvQixZQUFZLEVBQUUsc0JBQXNCLENBQUM7UUFDckMsS0FBSyxFQUFFLEtBQUssQ0FBQztRQUNiLGlCQUFpQixFQUFFLFdBQVcsQ0FBQztRQUMvQixZQUFZLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztLQUMxQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FnRG5CO1lBRWEsNEJBQTRCO1lBK0Q1QixzQkFBc0I7SUF5Q3BDLE9BQU8sQ0FBQyw2QkFBNkI7SUF5QnJDLE9BQU8sQ0FBQyx1QkFBdUI7Q0F1QmhDIn0=
|
|
@@ -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,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3F,OAAO,
|
|
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,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE/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,wBAAwB,CAAC,CAAC;IAC3D,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,yCAA+C;IAE5D,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,EAQF;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,CAgDnB;YAEa,4BAA4B;YA+D5B,sBAAsB;IAyCpC,OAAO,CAAC,6BAA6B;IAyBrC,OAAO,CAAC,uBAAuB;CAuBhC"}
|
|
@@ -45,11 +45,11 @@ export class ProverNodePublisher {
|
|
|
45
45
|
return this.l1TxUtils.getSenderAddress();
|
|
46
46
|
}
|
|
47
47
|
async submitEpochProof(args) {
|
|
48
|
-
const { epochNumber,
|
|
48
|
+
const { epochNumber, fromCheckpoint, toCheckpoint } = args;
|
|
49
49
|
const ctx = {
|
|
50
50
|
epochNumber,
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
fromCheckpoint,
|
|
52
|
+
toCheckpoint
|
|
53
53
|
};
|
|
54
54
|
if (!this.interrupted) {
|
|
55
55
|
const timer = new Timer();
|
|
@@ -88,31 +88,30 @@ export class ProverNodePublisher {
|
|
|
88
88
|
this.metrics.recordFailedTx();
|
|
89
89
|
this.log.error(`Rollup.submitEpochProof tx status failed ${txReceipt.transactionHash}`, undefined, ctx);
|
|
90
90
|
}
|
|
91
|
-
this.log.verbose('
|
|
91
|
+
this.log.verbose('Checkpoint data syncing interrupted', ctx);
|
|
92
92
|
return false;
|
|
93
93
|
}
|
|
94
94
|
async validateEpochProofSubmission(args) {
|
|
95
|
-
const {
|
|
96
|
-
// Check that the
|
|
97
|
-
// TODO: These are checkpoint numbers, not block numbers. Fix when we decouple them properly.
|
|
95
|
+
const { fromCheckpoint, toCheckpoint, publicInputs, batchedBlobInputs } = args;
|
|
96
|
+
// Check that the checkpoint numbers match the expected epoch to be proven
|
|
98
97
|
const { pending, proven } = await this.rollupContract.getTips();
|
|
99
|
-
// Don't publish if proven is beyond our
|
|
100
|
-
if (proven > BigInt(
|
|
101
|
-
throw new Error(`Cannot submit epoch proof for ${
|
|
98
|
+
// Don't publish if proven is beyond our toCheckpoint, pointless to do so
|
|
99
|
+
if (proven > BigInt(toCheckpoint)) {
|
|
100
|
+
throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as proven checkpoint is ${proven}`);
|
|
102
101
|
}
|
|
103
|
-
//
|
|
104
|
-
if (
|
|
105
|
-
throw new Error(`Cannot submit epoch proof for ${
|
|
102
|
+
// toCheckpoint can't be greater than pending
|
|
103
|
+
if (toCheckpoint > pending) {
|
|
104
|
+
throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as pending checkpoint is ${pending}`);
|
|
106
105
|
}
|
|
107
|
-
// Check the archive for the immediate
|
|
108
|
-
const
|
|
109
|
-
if (publicInputs.previousArchiveRoot.toString() !==
|
|
110
|
-
throw new Error(`Previous archive root mismatch: ${publicInputs.previousArchiveRoot.toString()} !== ${
|
|
106
|
+
// Check the archive for the immediate checkpoint before the epoch
|
|
107
|
+
const checkpointLog = await this.rollupContract.getCheckpoint(CheckpointNumber(fromCheckpoint - 1));
|
|
108
|
+
if (publicInputs.previousArchiveRoot.toString() !== checkpointLog.archive) {
|
|
109
|
+
throw new Error(`Previous archive root mismatch: ${publicInputs.previousArchiveRoot.toString()} !== ${checkpointLog.archive}`);
|
|
111
110
|
}
|
|
112
|
-
// Check the archive for the last
|
|
113
|
-
const
|
|
114
|
-
if (publicInputs.endArchiveRoot.toString() !==
|
|
115
|
-
throw new Error(`End archive root mismatch: ${publicInputs.endArchiveRoot.toString()} !== ${
|
|
111
|
+
// Check the archive for the last checkpoint in the epoch
|
|
112
|
+
const endCheckpointLog = await this.rollupContract.getCheckpoint(toCheckpoint);
|
|
113
|
+
if (publicInputs.endArchiveRoot.toString() !== endCheckpointLog.archive) {
|
|
114
|
+
throw new Error(`End archive root mismatch: ${publicInputs.endArchiveRoot.toString()} !== ${endCheckpointLog.archive}`);
|
|
116
115
|
}
|
|
117
116
|
// Check the batched blob inputs from the root rollup against the batched blob computed in ts
|
|
118
117
|
const finalBlobAccumulator = batchedBlobInputs.toFinalBlobAccumulator();
|
|
@@ -135,8 +134,8 @@ export class ProverNodePublisher {
|
|
|
135
134
|
];
|
|
136
135
|
this.log.info(`Submitting epoch proof to L1 rollup contract`, {
|
|
137
136
|
proofSize: args.proof.withoutPublicInputs().length,
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
fromCheckpoint: args.fromCheckpoint,
|
|
138
|
+
toCheckpoint: args.toCheckpoint
|
|
140
139
|
});
|
|
141
140
|
const data = encodeFunctionData({
|
|
142
141
|
abi: RollupAbi,
|
|
@@ -166,8 +165,8 @@ export class ProverNodePublisher {
|
|
|
166
165
|
getEpochProofPublicInputsArgs(args) {
|
|
167
166
|
// Returns arguments for EpochProofLib.sol -> getEpochProofPublicInputs()
|
|
168
167
|
return [
|
|
169
|
-
BigInt(args.
|
|
170
|
-
BigInt(args.
|
|
168
|
+
BigInt(args.fromCheckpoint),
|
|
169
|
+
BigInt(args.toCheckpoint),
|
|
171
170
|
{
|
|
172
171
|
previousArchive: args.publicInputs.previousArchiveRoot.toString(),
|
|
173
172
|
endArchive: args.publicInputs.endArchiveRoot.toString(),
|