@aztec/prover-node 3.0.0-canary.a9708bd → 3.0.0-devnet.2-patch.1
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 +2 -2
- package/dest/actions/upload-epoch-proof-failure.d.ts +1 -1
- package/dest/bin/run-failed-epoch.d.ts +1 -1
- package/dest/bin/run-failed-epoch.js +1 -1
- package/dest/config.d.ts +4 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +19 -14
- package/dest/factory.d.ts +2 -2
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +18 -7
- package/dest/index.d.ts +1 -1
- 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 +11 -16
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +107 -65
- package/dest/metrics.d.ts +4 -3
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +9 -3
- package/dest/monitors/epoch-monitor.d.ts +5 -2
- package/dest/monitors/epoch-monitor.d.ts.map +1 -1
- package/dest/monitors/epoch-monitor.js +10 -1
- package/dest/monitors/index.d.ts +1 -1
- package/dest/prover-node-publisher.d.ts +9 -10
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +51 -52
- package/dest/prover-node.d.ts +8 -7
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +39 -32
- package/dest/prover-publisher-factory.d.ts +6 -2
- package/dest/prover-publisher-factory.d.ts.map +1 -1
- package/dest/prover-publisher-factory.js +6 -0
- package/dest/test/index.d.ts +1 -1
- package/dest/test/index.d.ts.map +1 -1
- package/package.json +26 -25
- package/src/bin/run-failed-epoch.ts +2 -2
- package/src/config.ts +30 -29
- package/src/factory.ts +22 -14
- package/src/job/epoch-proving-job-data.ts +31 -25
- package/src/job/epoch-proving-job.ts +138 -82
- package/src/metrics.ts +16 -4
- package/src/monitors/epoch-monitor.ts +15 -5
- package/src/prover-node-publisher.ts +73 -72
- package/src/prover-node.ts +51 -44
- package/src/prover-publisher-factory.ts +12 -1
|
@@ -1,28 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getEthBlobEvaluationInputs } from '@aztec/blob-lib';
|
|
2
2
|
import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
|
|
3
|
-
import { RollupContract as RollupContractClass } from '@aztec/ethereum';
|
|
4
3
|
import { makeTuple } from '@aztec/foundation/array';
|
|
4
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
5
5
|
import { areArraysEqual } from '@aztec/foundation/collection';
|
|
6
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
7
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
7
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
8
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
9
|
-
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
10
9
|
import { Timer } from '@aztec/foundation/timer';
|
|
11
10
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
11
|
+
import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
12
12
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
13
13
|
import { inspect } from 'util';
|
|
14
14
|
import { encodeFunctionData } from 'viem';
|
|
15
15
|
import { ProverNodePublisherMetrics } from './metrics.js';
|
|
16
16
|
export class ProverNodePublisher {
|
|
17
|
-
interruptibleSleep = new InterruptibleSleep();
|
|
18
|
-
sleepTimeMs;
|
|
19
17
|
interrupted = false;
|
|
20
18
|
metrics;
|
|
21
19
|
log = createLogger('prover-node:l1-tx-publisher');
|
|
22
20
|
rollupContract;
|
|
23
21
|
l1TxUtils;
|
|
24
22
|
constructor(config, deps){
|
|
25
|
-
this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
|
|
26
23
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
27
24
|
this.metrics = new ProverNodePublisherMetrics(telemetry, 'ProverNode');
|
|
28
25
|
this.rollupContract = deps.rollupContract;
|
|
@@ -38,20 +35,21 @@ export class ProverNodePublisher {
|
|
|
38
35
|
* A call to `restart` is required before you can continue publishing.
|
|
39
36
|
*/ interrupt() {
|
|
40
37
|
this.interrupted = true;
|
|
41
|
-
this.
|
|
38
|
+
this.l1TxUtils.interrupt();
|
|
42
39
|
}
|
|
43
40
|
/** Restarts the publisher after calling `interrupt`. */ restart() {
|
|
44
41
|
this.interrupted = false;
|
|
42
|
+
this.l1TxUtils.restart();
|
|
45
43
|
}
|
|
46
44
|
getSenderAddress() {
|
|
47
45
|
return this.l1TxUtils.getSenderAddress();
|
|
48
46
|
}
|
|
49
47
|
async submitEpochProof(args) {
|
|
50
|
-
const { epochNumber,
|
|
48
|
+
const { epochNumber, fromCheckpoint, toCheckpoint } = args;
|
|
51
49
|
const ctx = {
|
|
52
50
|
epochNumber,
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
fromCheckpoint,
|
|
52
|
+
toCheckpoint
|
|
55
53
|
};
|
|
56
54
|
if (!this.interrupted) {
|
|
57
55
|
const timer = new Timer();
|
|
@@ -59,6 +57,7 @@ export class ProverNodePublisher {
|
|
|
59
57
|
await this.validateEpochProofSubmission(args);
|
|
60
58
|
const txReceipt = await this.sendSubmitEpochProofTx(args);
|
|
61
59
|
if (!txReceipt) {
|
|
60
|
+
this.log.error(`Failed to mine submitEpochProof tx`, undefined, ctx);
|
|
62
61
|
return false;
|
|
63
62
|
}
|
|
64
63
|
try {
|
|
@@ -88,37 +87,37 @@ export class ProverNodePublisher {
|
|
|
88
87
|
return true;
|
|
89
88
|
}
|
|
90
89
|
this.metrics.recordFailedTx();
|
|
91
|
-
this.log.error(`Rollup
|
|
92
|
-
await this.sleepOrInterrupted();
|
|
90
|
+
this.log.error(`Rollup submitEpochProof tx reverted ${txReceipt.transactionHash}`, undefined, ctx);
|
|
93
91
|
}
|
|
94
|
-
this.log.verbose('
|
|
92
|
+
this.log.verbose('Checkpoint data syncing interrupted', ctx);
|
|
95
93
|
return false;
|
|
96
94
|
}
|
|
97
95
|
async validateEpochProofSubmission(args) {
|
|
98
|
-
const {
|
|
99
|
-
// Check that the
|
|
100
|
-
const {
|
|
101
|
-
// Don't publish if proven is beyond our
|
|
102
|
-
if (proven >
|
|
103
|
-
throw new Error(`Cannot submit epoch proof for ${
|
|
96
|
+
const { fromCheckpoint, toCheckpoint, publicInputs, batchedBlobInputs } = args;
|
|
97
|
+
// Check that the checkpoint numbers match the expected epoch to be proven
|
|
98
|
+
const { pending, proven } = await this.rollupContract.getTips();
|
|
99
|
+
// Don't publish if proven is beyond our toCheckpoint, pointless to do so
|
|
100
|
+
if (proven > toCheckpoint) {
|
|
101
|
+
throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as proven checkpoint is ${proven}`);
|
|
104
102
|
}
|
|
105
|
-
//
|
|
106
|
-
if (
|
|
107
|
-
throw new Error(`Cannot submit epoch proof for ${
|
|
103
|
+
// toCheckpoint can't be greater than pending
|
|
104
|
+
if (toCheckpoint > pending) {
|
|
105
|
+
throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as pending checkpoint is ${pending}`);
|
|
108
106
|
}
|
|
109
|
-
// Check the archive for the immediate
|
|
110
|
-
const
|
|
111
|
-
if (publicInputs.previousArchiveRoot.toString() !==
|
|
112
|
-
throw new Error(`Previous archive root mismatch: ${publicInputs.previousArchiveRoot.toString()} !== ${
|
|
107
|
+
// Check the archive for the immediate checkpoint before the epoch
|
|
108
|
+
const checkpointLog = await this.rollupContract.getCheckpoint(CheckpointNumber(fromCheckpoint - 1));
|
|
109
|
+
if (publicInputs.previousArchiveRoot.toString() !== checkpointLog.archive) {
|
|
110
|
+
throw new Error(`Previous archive root mismatch: ${publicInputs.previousArchiveRoot.toString()} !== ${checkpointLog.archive}`);
|
|
113
111
|
}
|
|
114
|
-
// Check the archive for the last
|
|
115
|
-
const
|
|
116
|
-
if (publicInputs.endArchiveRoot.toString() !==
|
|
117
|
-
throw new Error(`End archive root mismatch: ${publicInputs.endArchiveRoot.toString()} !== ${
|
|
112
|
+
// Check the archive for the last checkpoint in the epoch
|
|
113
|
+
const endCheckpointLog = await this.rollupContract.getCheckpoint(toCheckpoint);
|
|
114
|
+
if (publicInputs.endArchiveRoot.toString() !== endCheckpointLog.archive) {
|
|
115
|
+
throw new Error(`End archive root mismatch: ${publicInputs.endArchiveRoot.toString()} !== ${endCheckpointLog.archive}`);
|
|
118
116
|
}
|
|
119
117
|
// Check the batched blob inputs from the root rollup against the batched blob computed in ts
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
const finalBlobAccumulator = batchedBlobInputs.toFinalBlobAccumulator();
|
|
119
|
+
if (!publicInputs.blobPublicInputs.equals(finalBlobAccumulator)) {
|
|
120
|
+
throw new Error(`Batched blob mismatch: ${inspect(publicInputs.blobPublicInputs)} !== ${inspect(finalBlobAccumulator)}`);
|
|
122
121
|
}
|
|
123
122
|
// Compare the public inputs computed by the contract with the ones injected
|
|
124
123
|
const rollupPublicInputs = await this.rollupContract.getEpochProofPublicInputs(this.getEpochProofPublicInputsArgs(args));
|
|
@@ -136,8 +135,8 @@ export class ProverNodePublisher {
|
|
|
136
135
|
];
|
|
137
136
|
this.log.info(`Submitting epoch proof to L1 rollup contract`, {
|
|
138
137
|
proofSize: args.proof.withoutPublicInputs().length,
|
|
139
|
-
|
|
140
|
-
|
|
138
|
+
fromCheckpoint: args.fromCheckpoint,
|
|
139
|
+
toCheckpoint: args.toCheckpoint
|
|
141
140
|
});
|
|
142
141
|
const data = encodeFunctionData({
|
|
143
142
|
abi: RollupAbi,
|
|
@@ -149,33 +148,36 @@ export class ProverNodePublisher {
|
|
|
149
148
|
to: this.rollupContract.address,
|
|
150
149
|
data
|
|
151
150
|
});
|
|
151
|
+
if (receipt.status !== 'success') {
|
|
152
|
+
const errorMsg = await this.l1TxUtils.tryGetErrorFromRevertedTx(data, {
|
|
153
|
+
args: [
|
|
154
|
+
...txArgs
|
|
155
|
+
],
|
|
156
|
+
functionName: 'submitEpochRootProof',
|
|
157
|
+
abi: RollupAbi,
|
|
158
|
+
address: this.rollupContract.address
|
|
159
|
+
}, /*blobInputs*/ undefined, /*stateOverride*/ []);
|
|
160
|
+
this.log.error(`Rollup submit epoch proof tx reverted with ${errorMsg ?? 'unknown error'}`);
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
152
163
|
return receipt;
|
|
153
164
|
} catch (err) {
|
|
154
165
|
this.log.error(`Rollup submit epoch proof failed`, err);
|
|
155
|
-
const errorMsg = await this.l1TxUtils.tryGetErrorFromRevertedTx(data, {
|
|
156
|
-
args: [
|
|
157
|
-
...txArgs
|
|
158
|
-
],
|
|
159
|
-
functionName: 'submitEpochRootProof',
|
|
160
|
-
abi: RollupAbi,
|
|
161
|
-
address: this.rollupContract.address
|
|
162
|
-
}, /*blobInputs*/ undefined, /*stateOverride*/ []);
|
|
163
|
-
this.log.error(`Rollup submit epoch proof tx reverted. ${errorMsg}`);
|
|
164
166
|
return undefined;
|
|
165
167
|
}
|
|
166
168
|
}
|
|
167
169
|
getEpochProofPublicInputsArgs(args) {
|
|
168
170
|
// Returns arguments for EpochProofLib.sol -> getEpochProofPublicInputs()
|
|
169
171
|
return [
|
|
170
|
-
BigInt(args.
|
|
171
|
-
BigInt(args.
|
|
172
|
+
BigInt(args.fromCheckpoint),
|
|
173
|
+
BigInt(args.toCheckpoint),
|
|
172
174
|
{
|
|
173
175
|
previousArchive: args.publicInputs.previousArchiveRoot.toString(),
|
|
174
176
|
endArchive: args.publicInputs.endArchiveRoot.toString(),
|
|
175
|
-
proverId: EthAddress.fromField(args.publicInputs.proverId).toString()
|
|
177
|
+
proverId: EthAddress.fromField(args.publicInputs.constants.proverId).toString()
|
|
176
178
|
} /*_args*/ ,
|
|
177
179
|
makeTuple(AZTEC_MAX_EPOCH_DURATION * 2, (i)=>i % 2 === 0 ? args.publicInputs.fees[i / 2].recipient.toField().toString() : args.publicInputs.fees[(i - 1) / 2].value.toString()),
|
|
178
|
-
args.batchedBlobInputs
|
|
180
|
+
getEthBlobEvaluationInputs(args.batchedBlobInputs)
|
|
179
181
|
];
|
|
180
182
|
}
|
|
181
183
|
getSubmitEpochProofArgs(args) {
|
|
@@ -187,12 +189,9 @@ export class ProverNodePublisher {
|
|
|
187
189
|
end: argsArray[1],
|
|
188
190
|
args: argsArray[2],
|
|
189
191
|
fees: argsArray[3],
|
|
190
|
-
attestations:
|
|
192
|
+
attestations: new CommitteeAttestationsAndSigners(args.attestations.map((a)=>CommitteeAttestation.fromViem(a))).getPackedAttestations(),
|
|
191
193
|
blobInputs: argsArray[4],
|
|
192
194
|
proof: proofHex
|
|
193
195
|
};
|
|
194
196
|
}
|
|
195
|
-
async sleepOrInterrupted() {
|
|
196
|
-
await this.interruptibleSleep.sleep(this.sleepTimeMs);
|
|
197
|
-
}
|
|
198
197
|
}
|
package/dest/prover-node.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { RollupContract } from '@aztec/ethereum';
|
|
1
|
+
import type { RollupContract } from '@aztec/ethereum/contracts';
|
|
2
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
4
|
import type { P2PClient } from '@aztec/p2p';
|
|
4
5
|
import { PublicProcessorFactory } from '@aztec/simulator/server';
|
|
@@ -50,7 +51,7 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
50
51
|
* @param epochNumber - The epoch number that was just completed.
|
|
51
52
|
* @returns false if there is an error, true otherwise
|
|
52
53
|
*/
|
|
53
|
-
handleEpochReadyToProve(epochNumber:
|
|
54
|
+
handleEpochReadyToProve(epochNumber: EpochNumber): Promise<boolean>;
|
|
54
55
|
/**
|
|
55
56
|
* Starts the prover node so it periodically checks for unproven epochs in the unfinalized chain from L1 and
|
|
56
57
|
* starts proving jobs for them.
|
|
@@ -67,7 +68,7 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
67
68
|
/**
|
|
68
69
|
* Starts a proving process and returns immediately.
|
|
69
70
|
*/
|
|
70
|
-
startProof(epochNumber:
|
|
71
|
+
startProof(epochNumber: EpochNumber): Promise<void>;
|
|
71
72
|
private runJob;
|
|
72
73
|
protected tryUploadEpochFailure(job: EpochProvingJob): Promise<string | undefined>;
|
|
73
74
|
/**
|
|
@@ -80,9 +81,9 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
80
81
|
getJobs(): Promise<{
|
|
81
82
|
uuid: string;
|
|
82
83
|
status: EpochProvingJobState;
|
|
83
|
-
epochNumber:
|
|
84
|
+
epochNumber: EpochNumber;
|
|
84
85
|
}[]>;
|
|
85
|
-
protected getActiveJobsForEpoch(
|
|
86
|
+
protected getActiveJobsForEpoch(epochNumber: EpochNumber): Promise<{
|
|
86
87
|
uuid: string;
|
|
87
88
|
status: EpochProvingJobState;
|
|
88
89
|
}[]>;
|
|
@@ -90,7 +91,7 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
90
91
|
private createProvingJob;
|
|
91
92
|
private getL1Constants;
|
|
92
93
|
private gatherEpochData;
|
|
93
|
-
private
|
|
94
|
+
private gatherCheckpoints;
|
|
94
95
|
private gatherTxs;
|
|
95
96
|
private gatherMessages;
|
|
96
97
|
private gatherPreviousBlockHeader;
|
|
@@ -103,4 +104,4 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
103
104
|
private validateConfig;
|
|
104
105
|
}
|
|
105
106
|
export {};
|
|
106
|
-
//# sourceMappingURL=
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92ZXItbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQWlDLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTdGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV6RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpFLE9BQU8sRUFDTCxLQUFLLGtCQUFrQixFQUV2QixLQUFLLGFBQWEsRUFDbEIsS0FBSyxPQUFPLEVBQ1osS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxzQkFBc0IsRUFFNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXZELE9BQU8sRUFFTCxTQUFTLEVBQ1QsS0FBSyxlQUFlLEVBQ3BCLEtBQUssU0FBUyxFQUNkLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxP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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"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"}
|
package/dest/prover-node.js
CHANGED
|
@@ -4,6 +4,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
4
4
|
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
}
|
|
7
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
7
8
|
import { assertRequired, compact, pick, sum } from '@aztec/foundation/collection';
|
|
8
9
|
import { memoize } from '@aztec/foundation/decorators';
|
|
9
10
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -63,6 +64,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
63
64
|
txGatheringMaxParallelRequestsPerNode: 100,
|
|
64
65
|
txGatheringTimeoutMs: 120_000,
|
|
65
66
|
proverNodeFailedEpochStore: undefined,
|
|
67
|
+
proverNodeEpochProvingDelayMs: undefined,
|
|
66
68
|
...compact(config)
|
|
67
69
|
};
|
|
68
70
|
this.validateConfig();
|
|
@@ -109,6 +111,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
109
111
|
* starts proving jobs for them.
|
|
110
112
|
*/ async start() {
|
|
111
113
|
this.epochsMonitor.start(this);
|
|
114
|
+
await this.publisherFactory.start();
|
|
112
115
|
this.publisher = await this.publisherFactory.create();
|
|
113
116
|
await this.rewardsMetrics.start();
|
|
114
117
|
this.l1Metrics.start();
|
|
@@ -122,6 +125,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
122
125
|
await this.prover.stop();
|
|
123
126
|
await tryStop(this.p2pClient);
|
|
124
127
|
await tryStop(this.l2BlockSource);
|
|
128
|
+
await tryStop(this.publisherFactory);
|
|
125
129
|
this.publisher?.interrupt();
|
|
126
130
|
await Promise.all(Array.from(this.jobs.values()).map((job)=>job.stop()));
|
|
127
131
|
await this.worldState.stop();
|
|
@@ -140,7 +144,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
140
144
|
/**
|
|
141
145
|
* Starts a proving process and returns immediately.
|
|
142
146
|
*/ async startProof(epochNumber) {
|
|
143
|
-
const job = await this.createProvingJob(
|
|
147
|
+
const job = await this.createProvingJob(epochNumber, {
|
|
144
148
|
skipEpochCheck: true
|
|
145
149
|
});
|
|
146
150
|
void this.runJob(job);
|
|
@@ -187,12 +191,11 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
187
191
|
return Promise.resolve(Array.from(this.jobs.entries()).map(([uuid, job])=>({
|
|
188
192
|
uuid,
|
|
189
193
|
status: job.getState(),
|
|
190
|
-
epochNumber:
|
|
194
|
+
epochNumber: job.getEpochNumber()
|
|
191
195
|
})));
|
|
192
196
|
}
|
|
193
|
-
async getActiveJobsForEpoch(
|
|
197
|
+
async getActiveJobsForEpoch(epochNumber) {
|
|
194
198
|
const jobs = await this.getJobs();
|
|
195
|
-
const epochNumber = Number(epochBigInt);
|
|
196
199
|
return jobs.filter((job)=>job.epochNumber === epochNumber && !EpochProvingJobTerminalState.includes(job.status));
|
|
197
200
|
}
|
|
198
201
|
checkMaximumPendingJobs() {
|
|
@@ -206,9 +209,11 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
206
209
|
this.publisher = await this.publisherFactory.create();
|
|
207
210
|
// Gather all data for this epoch
|
|
208
211
|
const epochData = await this.gatherEpochData(epochNumber);
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
+
const fromCheckpoint = epochData.checkpoints[0].number;
|
|
213
|
+
const toCheckpoint = epochData.checkpoints.at(-1).number;
|
|
214
|
+
const fromBlock = epochData.checkpoints[0].blocks[0].number;
|
|
215
|
+
const toBlock = epochData.checkpoints.at(-1).blocks.at(-1).number;
|
|
216
|
+
this.log.verbose(`Creating proving job for epoch ${epochNumber} for checkpoint range ${fromCheckpoint} to ${toCheckpoint} and block range ${fromBlock} to ${toBlock}`);
|
|
212
217
|
// Fast forward world state to right before the target block and get a fork
|
|
213
218
|
await this.worldState.syncImmediate(toBlock);
|
|
214
219
|
// Create a processor factory
|
|
@@ -224,18 +229,19 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
224
229
|
return this.l2BlockSource.getL1Constants();
|
|
225
230
|
}
|
|
226
231
|
async gatherEpochData(epochNumber) {
|
|
227
|
-
const
|
|
228
|
-
const txArray = await this.gatherTxs(epochNumber,
|
|
232
|
+
const checkpoints = await this.gatherCheckpoints(epochNumber);
|
|
233
|
+
const txArray = await this.gatherTxs(epochNumber, checkpoints);
|
|
229
234
|
const txs = new Map(txArray.map((tx)=>[
|
|
230
235
|
tx.getTxHash().toString(),
|
|
231
236
|
tx
|
|
232
237
|
]));
|
|
233
|
-
const l1ToL2Messages = await this.gatherMessages(epochNumber,
|
|
234
|
-
const
|
|
235
|
-
const
|
|
236
|
-
const
|
|
238
|
+
const l1ToL2Messages = await this.gatherMessages(epochNumber, checkpoints);
|
|
239
|
+
const [firstBlock] = checkpoints[0].blocks;
|
|
240
|
+
const previousBlockHeader = await this.gatherPreviousBlockHeader(epochNumber, firstBlock.number - 1);
|
|
241
|
+
const [lastPublishedCheckpoint] = await this.l2BlockSource.getPublishedCheckpoints(checkpoints.at(-1).number, 1);
|
|
242
|
+
const attestations = lastPublishedCheckpoint?.attestations ?? [];
|
|
237
243
|
return {
|
|
238
|
-
|
|
244
|
+
checkpoints,
|
|
239
245
|
txs,
|
|
240
246
|
l1ToL2Messages,
|
|
241
247
|
epochNumber,
|
|
@@ -243,16 +249,17 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
243
249
|
attestations
|
|
244
250
|
};
|
|
245
251
|
}
|
|
246
|
-
async
|
|
247
|
-
const
|
|
248
|
-
if (
|
|
252
|
+
async gatherCheckpoints(epochNumber) {
|
|
253
|
+
const checkpoints = await this.l2BlockSource.getCheckpointsForEpoch(epochNumber);
|
|
254
|
+
if (checkpoints.length === 0) {
|
|
249
255
|
throw new EmptyEpochError(epochNumber);
|
|
250
256
|
}
|
|
251
|
-
return
|
|
257
|
+
return checkpoints;
|
|
252
258
|
}
|
|
253
|
-
async gatherTxs(epochNumber,
|
|
259
|
+
async gatherTxs(epochNumber, checkpoints) {
|
|
254
260
|
const deadline = new Date(this.dateProvider.now() + this.config.txGatheringTimeoutMs);
|
|
255
261
|
const txProvider = this.p2pClient.getTxProvider();
|
|
262
|
+
const blocks = checkpoints.flatMap((checkpoint)=>checkpoint.blocks);
|
|
256
263
|
const txsByBlock = await Promise.all(blocks.map((block)=>txProvider.getTxsForBlock(block, {
|
|
257
264
|
deadline
|
|
258
265
|
})));
|
|
@@ -266,31 +273,31 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
266
273
|
}
|
|
267
274
|
throw new Error(`Txs not found for epoch ${epochNumber}: ${missingTxs.map((hash)=>hash.toString()).join(', ')}`);
|
|
268
275
|
}
|
|
269
|
-
async gatherMessages(epochNumber,
|
|
270
|
-
const messages = await Promise.all(
|
|
276
|
+
async gatherMessages(epochNumber, checkpoints) {
|
|
277
|
+
const messages = await Promise.all(checkpoints.map((c)=>this.l1ToL2MessageSource.getL1ToL2Messages(c.number)));
|
|
271
278
|
const messageCount = sum(messages.map((m)=>m.length));
|
|
272
279
|
this.log.verbose(`Gathered all ${messageCount} messages for epoch ${epochNumber}`, {
|
|
273
280
|
epochNumber
|
|
274
281
|
});
|
|
275
|
-
const
|
|
276
|
-
for(let i = 0; i <
|
|
277
|
-
|
|
282
|
+
const messagesByCheckpoint = {};
|
|
283
|
+
for(let i = 0; i < checkpoints.length; i++){
|
|
284
|
+
messagesByCheckpoint[checkpoints[i].number] = messages[i];
|
|
278
285
|
}
|
|
279
|
-
return
|
|
286
|
+
return messagesByCheckpoint;
|
|
280
287
|
}
|
|
281
|
-
async gatherPreviousBlockHeader(epochNumber,
|
|
282
|
-
const
|
|
283
|
-
const header = await (previousBlockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.l2BlockSource.getBlockHeader(previousBlockNumber));
|
|
288
|
+
async gatherPreviousBlockHeader(epochNumber, previousBlockNumber) {
|
|
289
|
+
const header = await (previousBlockNumber === 0 ? this.worldState.getCommitted().getInitialHeader() : this.l2BlockSource.getBlockHeader(BlockNumber(previousBlockNumber)));
|
|
284
290
|
if (!header) {
|
|
285
|
-
throw new Error(`Previous block header ${
|
|
291
|
+
throw new Error(`Previous block header ${previousBlockNumber} not found for proving epoch ${epochNumber}`);
|
|
286
292
|
}
|
|
287
293
|
this.log.verbose(`Gathered previous block header ${header.getBlockNumber()} for epoch ${epochNumber}`);
|
|
288
294
|
return header;
|
|
289
295
|
}
|
|
290
296
|
/** Extracted for testing purposes. */ doCreateEpochProvingJob(data, deadline, publicProcessorFactory, publisher, opts = {}) {
|
|
291
|
-
const { proverNodeMaxParallelBlocksPerEpoch: parallelBlockLimit } = this.config;
|
|
297
|
+
const { proverNodeMaxParallelBlocksPerEpoch: parallelBlockLimit, proverNodeDisableProofPublish } = this.config;
|
|
292
298
|
return new EpochProvingJob(data, this.worldState, this.prover.createEpochProver(), publicProcessorFactory, publisher, this.l2BlockSource, this.jobMetrics, deadline, {
|
|
293
299
|
parallelBlockLimit,
|
|
300
|
+
skipSubmitProof: proverNodeDisableProofPublish,
|
|
294
301
|
...opts
|
|
295
302
|
});
|
|
296
303
|
}
|
|
@@ -306,7 +313,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
306
313
|
}
|
|
307
314
|
_ts_decorate([
|
|
308
315
|
trackSpan('ProverNode.createProvingJob', (epochNumber)=>({
|
|
309
|
-
[Attributes.EPOCH_NUMBER]:
|
|
316
|
+
[Attributes.EPOCH_NUMBER]: epochNumber
|
|
310
317
|
}))
|
|
311
318
|
], ProverNode.prototype, "createProvingJob", null);
|
|
312
319
|
_ts_decorate([
|
|
@@ -314,7 +321,7 @@ _ts_decorate([
|
|
|
314
321
|
], ProverNode.prototype, "getL1Constants", null);
|
|
315
322
|
_ts_decorate([
|
|
316
323
|
trackSpan('ProverNode.gatherEpochData', (epochNumber)=>({
|
|
317
|
-
[Attributes.EPOCH_NUMBER]:
|
|
324
|
+
[Attributes.EPOCH_NUMBER]: epochNumber
|
|
318
325
|
}))
|
|
319
326
|
], ProverNode.prototype, "gatherEpochData", null);
|
|
320
327
|
class EmptyEpochError extends Error {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
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';
|
|
2
4
|
import type { PublisherConfig, TxSenderConfig } from '@aztec/sequencer-client';
|
|
3
5
|
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
4
6
|
import { ProverNodePublisher } from './prover-node-publisher.js';
|
|
@@ -10,10 +12,12 @@ export declare class ProverPublisherFactory {
|
|
|
10
12
|
publisherManager: PublisherManager<L1TxUtils>;
|
|
11
13
|
telemetry?: TelemetryClient;
|
|
12
14
|
});
|
|
15
|
+
start(): Promise<void>;
|
|
16
|
+
stop(): void;
|
|
13
17
|
/**
|
|
14
18
|
* Creates a new Prover Publisher instance.
|
|
15
19
|
* @returns A new ProverNodePublisher instance.
|
|
16
20
|
*/
|
|
17
21
|
create(): Promise<ProverNodePublisher>;
|
|
18
22
|
}
|
|
19
|
-
//# sourceMappingURL=
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLXB1Ymxpc2hlci1mYWN0b3J5LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLXB1Ymxpc2hlci1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9FLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWpFLHFCQUFhLHNCQUFzQjtJQUUvQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxJQUFJO0lBRmQsWUFDVSxNQUFNLEVBQUUsY0FBYyxHQUFHLGVBQWUsRUFDeEMsSUFBSSxFQUFFO1FBQ1osY0FBYyxFQUFFLGNBQWMsQ0FBQztRQUMvQixnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7S0FDN0IsRUFDQztJQUVTLEtBQUssa0JBRWpCO0lBRU0sSUFBSSxTQUVWO0lBRUQ7OztPQUdHO0lBQ1UsTUFBTSxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQU9sRDtDQUNGIn0=
|
|
@@ -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,
|
|
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,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC/E,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;IAFd,YACU,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACZ,cAAc,EAAE,cAAc,CAAC;QAC/B,gBAAgB,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9C,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B,EACC;IAES,KAAK,kBAEjB;IAEM,IAAI,SAEV;IAED;;;OAGG;IACU,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAOlD;CACF"}
|
|
@@ -6,6 +6,12 @@ export class ProverPublisherFactory {
|
|
|
6
6
|
this.config = config;
|
|
7
7
|
this.deps = deps;
|
|
8
8
|
}
|
|
9
|
+
async start() {
|
|
10
|
+
await this.deps.publisherManager.loadState();
|
|
11
|
+
}
|
|
12
|
+
stop() {
|
|
13
|
+
this.deps.publisherManager.interrupt();
|
|
14
|
+
}
|
|
9
15
|
/**
|
|
10
16
|
* Creates a new Prover Publisher instance.
|
|
11
17
|
* @returns A new ProverNodePublisher instance.
|
package/dest/test/index.d.ts
CHANGED
|
@@ -9,4 +9,4 @@ declare abstract class TestProverNodeClass extends ProverNode {
|
|
|
9
9
|
}
|
|
10
10
|
export type TestProverNode = TestProverNodeClass;
|
|
11
11
|
export {};
|
|
12
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFMUUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsdUJBQWUsbUJBQW9CLFNBQVEsVUFBVTtJQUNwQyxNQUFNLEVBQUUsa0JBQWtCLENBQUM7SUFDM0IsU0FBUyxFQUFFLG1CQUFtQixDQUFDO0lBRTlDLFNBQXlCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxlQUFlLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztDQUNuRztBQUVELE1BQU0sTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUMifQ==
|
package/dest/test/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,uBAAe,mBAAoB,SAAQ,UAAU;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,uBAAe,mBAAoB,SAAQ,UAAU;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,mBAAmB,CAAC;IAE9C,SAAyB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACnG;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "3.0.0-
|
|
3
|
+
"version": "3.0.0-devnet.2-patch.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"../package.common.json"
|
|
12
12
|
],
|
|
13
13
|
"scripts": {
|
|
14
|
-
"build": "yarn clean && tsc
|
|
15
|
-
"build:dev": "tsc
|
|
14
|
+
"build": "yarn clean && ../scripts/tsc.sh",
|
|
15
|
+
"build:dev": "../scripts/tsc.sh --watch",
|
|
16
16
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
17
17
|
"bb": "node --no-warnings ./dest/bb/index.js",
|
|
18
18
|
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
|
|
@@ -56,36 +56,37 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/archiver": "3.0.0-
|
|
60
|
-
"@aztec/bb-prover": "3.0.0-
|
|
61
|
-
"@aztec/blob-lib": "3.0.0-
|
|
62
|
-
"@aztec/blob-sink": "3.0.0-
|
|
63
|
-
"@aztec/constants": "3.0.0-
|
|
64
|
-
"@aztec/epoch-cache": "3.0.0-
|
|
65
|
-
"@aztec/ethereum": "3.0.0-
|
|
66
|
-
"@aztec/foundation": "3.0.0-
|
|
67
|
-
"@aztec/kv-store": "3.0.0-
|
|
68
|
-
"@aztec/l1-artifacts": "3.0.0-
|
|
69
|
-
"@aztec/node-keystore": "3.0.0-
|
|
70
|
-
"@aztec/node-lib": "3.0.0-
|
|
71
|
-
"@aztec/noir-protocol-circuits-types": "3.0.0-
|
|
72
|
-
"@aztec/p2p": "3.0.0-
|
|
73
|
-
"@aztec/protocol-contracts": "3.0.0-
|
|
74
|
-
"@aztec/prover-client": "3.0.0-
|
|
75
|
-
"@aztec/sequencer-client": "3.0.0-
|
|
76
|
-
"@aztec/simulator": "3.0.0-
|
|
77
|
-
"@aztec/stdlib": "3.0.0-
|
|
78
|
-
"@aztec/telemetry-client": "3.0.0-
|
|
79
|
-
"@aztec/world-state": "3.0.0-
|
|
59
|
+
"@aztec/archiver": "3.0.0-devnet.2-patch.1",
|
|
60
|
+
"@aztec/bb-prover": "3.0.0-devnet.2-patch.1",
|
|
61
|
+
"@aztec/blob-lib": "3.0.0-devnet.2-patch.1",
|
|
62
|
+
"@aztec/blob-sink": "3.0.0-devnet.2-patch.1",
|
|
63
|
+
"@aztec/constants": "3.0.0-devnet.2-patch.1",
|
|
64
|
+
"@aztec/epoch-cache": "3.0.0-devnet.2-patch.1",
|
|
65
|
+
"@aztec/ethereum": "3.0.0-devnet.2-patch.1",
|
|
66
|
+
"@aztec/foundation": "3.0.0-devnet.2-patch.1",
|
|
67
|
+
"@aztec/kv-store": "3.0.0-devnet.2-patch.1",
|
|
68
|
+
"@aztec/l1-artifacts": "3.0.0-devnet.2-patch.1",
|
|
69
|
+
"@aztec/node-keystore": "3.0.0-devnet.2-patch.1",
|
|
70
|
+
"@aztec/node-lib": "3.0.0-devnet.2-patch.1",
|
|
71
|
+
"@aztec/noir-protocol-circuits-types": "3.0.0-devnet.2-patch.1",
|
|
72
|
+
"@aztec/p2p": "3.0.0-devnet.2-patch.1",
|
|
73
|
+
"@aztec/protocol-contracts": "3.0.0-devnet.2-patch.1",
|
|
74
|
+
"@aztec/prover-client": "3.0.0-devnet.2-patch.1",
|
|
75
|
+
"@aztec/sequencer-client": "3.0.0-devnet.2-patch.1",
|
|
76
|
+
"@aztec/simulator": "3.0.0-devnet.2-patch.1",
|
|
77
|
+
"@aztec/stdlib": "3.0.0-devnet.2-patch.1",
|
|
78
|
+
"@aztec/telemetry-client": "3.0.0-devnet.2-patch.1",
|
|
79
|
+
"@aztec/world-state": "3.0.0-devnet.2-patch.1",
|
|
80
80
|
"source-map-support": "^0.5.21",
|
|
81
81
|
"tslib": "^2.4.0",
|
|
82
|
-
"viem": "2.
|
|
82
|
+
"viem": "npm:@aztec/viem@2.38.2"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
85
|
"@jest/globals": "^30.0.0",
|
|
86
86
|
"@types/jest": "^30.0.0",
|
|
87
87
|
"@types/node": "^22.15.17",
|
|
88
88
|
"@types/source-map-support": "^0.5.10",
|
|
89
|
+
"@typescript/native-preview": "7.0.0-dev.20251126.1",
|
|
89
90
|
"jest": "^30.0.0",
|
|
90
91
|
"jest-mock-extended": "^4.0.0",
|
|
91
92
|
"ts-node": "^10.9.1",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
|
-
import type { L1ContractAddresses } from '@aztec/ethereum';
|
|
2
|
+
import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -25,7 +25,7 @@ async function rerunFailedEpoch(provingJobUrl: string, baseLocalDir: string) {
|
|
|
25
25
|
const config = {
|
|
26
26
|
...getProverNodeConfigFromEnv(),
|
|
27
27
|
dataDirectory: dataDir,
|
|
28
|
-
|
|
28
|
+
dataStoreMapSizeKb: env.dataStoreMapSizeKb ?? 1024 * 1024,
|
|
29
29
|
proverId: env.proverId ?? EthAddress.random(),
|
|
30
30
|
};
|
|
31
31
|
|