@aztec-labs/prover-node 6.0.0-nightly.20260829
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/README.md +573 -0
- package/dest/actions/download-epoch-proving-job.d.ts +18 -0
- package/dest/actions/download-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/download-epoch-proving-job.js +37 -0
- package/dest/actions/index.d.ts +3 -0
- package/dest/actions/index.d.ts.map +1 -0
- package/dest/actions/index.js +2 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts +23 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/rerun-epoch-proving-job.js +264 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts +15 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -0
- package/dest/actions/upload-epoch-proof-failure.js +78 -0
- package/dest/bin/run-failed-epoch.d.ts +2 -0
- package/dest/bin/run-failed-epoch.d.ts.map +1 -0
- package/dest/bin/run-failed-epoch.js +68 -0
- package/dest/checkpoint-store.d.ts +95 -0
- package/dest/checkpoint-store.d.ts.map +1 -0
- package/dest/checkpoint-store.js +178 -0
- package/dest/config.d.ts +31 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +143 -0
- package/dest/factory.d.ts +36 -0
- package/dest/factory.d.ts.map +1 -0
- package/dest/factory.js +105 -0
- package/dest/index.d.ts +8 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +7 -0
- package/dest/job/checkpoint-prover.d.ts +169 -0
- package/dest/job/checkpoint-prover.d.ts.map +1 -0
- package/dest/job/checkpoint-prover.js +413 -0
- package/dest/job/epoch-proving-job-data.d.ts +20 -0
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -0
- package/dest/job/epoch-proving-job-data.js +61 -0
- package/dest/job/epoch-session.d.ts +160 -0
- package/dest/job/epoch-session.d.ts.map +1 -0
- package/dest/job/epoch-session.js +744 -0
- package/dest/job/top-tree-job.d.ts +82 -0
- package/dest/job/top-tree-job.d.ts.map +1 -0
- package/dest/job/top-tree-job.js +152 -0
- package/dest/metrics.d.ts +88 -0
- package/dest/metrics.d.ts.map +1 -0
- package/dest/metrics.js +264 -0
- package/dest/monitors/epoch-monitor.d.ts +43 -0
- package/dest/monitors/epoch-monitor.d.ts.map +1 -0
- package/dest/monitors/epoch-monitor.js +111 -0
- package/dest/monitors/index.d.ts +2 -0
- package/dest/monitors/index.d.ts.map +1 -0
- package/dest/monitors/index.js +1 -0
- package/dest/proof-publishing-service.d.ts +161 -0
- package/dest/proof-publishing-service.d.ts.map +1 -0
- package/dest/proof-publishing-service.js +335 -0
- package/dest/prover-node-publisher.d.ts +71 -0
- package/dest/prover-node-publisher.d.ts.map +1 -0
- package/dest/prover-node-publisher.js +346 -0
- package/dest/prover-node.d.ts +185 -0
- package/dest/prover-node.d.ts.map +1 -0
- package/dest/prover-node.js +1056 -0
- package/dest/prover-publisher-factory.d.ts +27 -0
- package/dest/prover-publisher-factory.d.ts.map +1 -0
- package/dest/prover-publisher-factory.js +29 -0
- package/dest/session-manager.d.ts +158 -0
- package/dest/session-manager.d.ts.map +1 -0
- package/dest/session-manager.js +493 -0
- package/dest/test/index.d.ts +13 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +3 -0
- package/package.json +102 -0
- package/src/actions/download-epoch-proving-job.ts +43 -0
- package/src/actions/index.ts +2 -0
- package/src/actions/rerun-epoch-proving-job.ts +224 -0
- package/src/actions/upload-epoch-proof-failure.ts +87 -0
- package/src/bin/run-failed-epoch.ts +78 -0
- package/src/checkpoint-store.ts +212 -0
- package/src/config.ts +208 -0
- package/src/factory.ts +191 -0
- package/src/index.ts +7 -0
- package/src/job/checkpoint-prover.ts +551 -0
- package/src/job/epoch-proving-job-data.ts +94 -0
- package/src/job/epoch-session.ts +466 -0
- package/src/job/top-tree-job.ts +227 -0
- package/src/metrics.ts +323 -0
- package/src/monitors/epoch-monitor.ts +110 -0
- package/src/monitors/index.ts +1 -0
- package/src/proof-publishing-service.ts +427 -0
- package/src/prover-node-publisher.ts +473 -0
- package/src/prover-node.ts +830 -0
- package/src/prover-publisher-factory.ts +48 -0
- package/src/session-manager.ts +593 -0
- package/src/test/index.ts +14 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { L1ContractsConfig } from '@aztec-labs/ethereum/config';
|
|
2
|
+
import type { Logger } from '@aztec-labs/foundation/log';
|
|
3
|
+
import { type ProverClientConfig } from '@aztec-labs/prover-client';
|
|
4
|
+
import { ProverBrokerConfig } from '@aztec-labs/prover-client/broker';
|
|
5
|
+
import { type CheckpointSubTreeProofs } from '@aztec-labs/prover-client/orchestrator';
|
|
6
|
+
import type { DataStoreConfig } from '@aztec-labs/stdlib/kv-store';
|
|
7
|
+
import type { GenesisData } from '@aztec-labs/stdlib/world-state';
|
|
8
|
+
type RerunConfig = DataStoreConfig & ProverBrokerConfig & ProverClientConfig & Pick<L1ContractsConfig, 'aztecEpochDuration'>;
|
|
9
|
+
/**
|
|
10
|
+
* Given a local folder where `downloadEpochProvingJob` was called, creates a new archiver and world state
|
|
11
|
+
* using the state snapshots, and creates a new epoch proving session to prove the downloaded proving job.
|
|
12
|
+
* Proving is done with a local proving broker and agents as specified by the config.
|
|
13
|
+
*/
|
|
14
|
+
export declare function rerunEpochProvingJob(localPath: string, log: Logger, config: RerunConfig, genesis?: GenesisData): Promise<"awaiting-checkpoints" | "awaiting-predecessor" | "awaiting-root" | "cancelled" | "completed" | "failed" | "initialized" | "publishing-proof" | "stopped" | "superseded" | "timed-out">;
|
|
15
|
+
/**
|
|
16
|
+
* Re-proves a single downloaded checkpoint proving job (as uploaded by a `CheckpointProver` failure).
|
|
17
|
+
* Reconstructs just that checkpoint's sub-tree prover from the snapshot and awaits its block proofs — no
|
|
18
|
+
* epoch top-tree, no L1 submission — so a checkpoint-level failure can be reproduced offline in isolation.
|
|
19
|
+
* Returns the block-rollup proof outputs on success; throws if the checkpoint fails to prove again.
|
|
20
|
+
*/
|
|
21
|
+
export declare function rerunCheckpointProvingJob(localPath: string, log: Logger, config: RerunConfig, genesis?: GenesisData): Promise<CheckpointSubTreeProofs['blockProofOutputs']>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVydW4tZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3JlcnVuLWVwb2NoLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGtCQUFrQixFQUErQixNQUFNLGtDQUFrQyxDQUFDO0FBRW5HLE9BQU8sRUFBRSxLQUFLLHVCQUF1QixFQUFjLE1BQU0sd0NBQXdDLENBQUM7QUFLbEcsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHbkUsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFVbEUsS0FBSyxXQUFXLEdBQUcsZUFBZSxHQUNoQyxrQkFBa0IsR0FDbEIsa0JBQWtCLEdBQ2xCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhEOzs7O0dBSUc7QUFDSCx3QkFBc0Isb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsV0FBVyxtTUFzQ3BIO0FBRUQ7Ozs7O0dBS0c7QUFDSCx3QkFBc0IseUJBQXlCLENBQzdDLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLEdBQUcsRUFBRSxNQUFNLEVBQ1gsTUFBTSxFQUFFLFdBQVcsRUFDbkIsT0FBTyxDQUFDLEVBQUUsV0FBVyxHQUNwQixPQUFPLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQWdCdkQifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rerun-epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/actions/rerun-epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,kCAAkC,CAAC;AAEnG,OAAO,EAAE,KAAK,uBAAuB,EAAc,MAAM,wCAAwC,CAAC;AAKlG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAUlE,KAAK,WAAW,GAAG,eAAe,GAChC,kBAAkB,GAClB,kBAAkB,GAClB,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAEhD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,WAAW,mMAsCpH;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,CAAC,CAgBvD"}
|
|
@@ -0,0 +1,264 @@
|
|
|
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
|
+
}
|
|
66
|
+
import { createArchiverStore, createContractDataSource } from '@aztec-labs/archiver';
|
|
67
|
+
import { BlockNumber } from '@aztec-labs/foundation/branded-types';
|
|
68
|
+
import { DateProvider } from '@aztec-labs/foundation/timer';
|
|
69
|
+
import { createProverClient } from '@aztec-labs/prover-client';
|
|
70
|
+
import { createAndStartProvingBroker } from '@aztec-labs/prover-client/broker';
|
|
71
|
+
import { getLastSiblingPath } from '@aztec-labs/prover-client/helpers';
|
|
72
|
+
import { ChonkCache } from '@aztec-labs/prover-client/orchestrator';
|
|
73
|
+
import { AvmSimulatorPool, PublicProcessorFactory } from '@aztec-labs/simulator/server';
|
|
74
|
+
import { getEpochAtSlot, getSlotRangeForEpoch } from '@aztec-labs/stdlib/epoch-helpers';
|
|
75
|
+
import { MerkleTreeId } from '@aztec-labs/stdlib/trees';
|
|
76
|
+
import { getTelemetryClient } from '@aztec-labs/telemetry-client';
|
|
77
|
+
import { createWorldState } from '@aztec-labs/world-state';
|
|
78
|
+
import { readFileSync } from 'fs';
|
|
79
|
+
import { CheckpointProver } from '../job/checkpoint-prover.js';
|
|
80
|
+
import { deserializeEpochProvingJobData } from '../job/epoch-proving-job-data.js';
|
|
81
|
+
import { EpochSession } from '../job/epoch-session.js';
|
|
82
|
+
import { ProverNodeJobMetrics } from '../metrics.js';
|
|
83
|
+
/**
|
|
84
|
+
* Given a local folder where `downloadEpochProvingJob` was called, creates a new archiver and world state
|
|
85
|
+
* using the state snapshots, and creates a new epoch proving session to prove the downloaded proving job.
|
|
86
|
+
* Proving is done with a local proving broker and agents as specified by the config.
|
|
87
|
+
*/ export async function rerunEpochProvingJob(localPath, log, config, genesis) {
|
|
88
|
+
const env = {
|
|
89
|
+
stack: [],
|
|
90
|
+
error: void 0,
|
|
91
|
+
hasError: false
|
|
92
|
+
};
|
|
93
|
+
try {
|
|
94
|
+
const ctx = _ts_add_disposable_resource(env, await createRerunContext(localPath, log, config, genesis), true);
|
|
95
|
+
const { jobData, prover, metrics } = ctx;
|
|
96
|
+
log.info(`Rerunning epoch proving for epoch ${jobData.epochNumber}`);
|
|
97
|
+
const provers = [];
|
|
98
|
+
for(let i = 0; i < jobData.checkpoints.length; i++){
|
|
99
|
+
provers.push(await buildCheckpointProver(ctx, i, log));
|
|
100
|
+
}
|
|
101
|
+
// Local rerun never publishes — stub the service so submit() always resolves 'published'
|
|
102
|
+
// and withdraw is a no-op.
|
|
103
|
+
const publishingService = {
|
|
104
|
+
submit: ()=>Promise.resolve('published'),
|
|
105
|
+
withdraw: ()=>{}
|
|
106
|
+
};
|
|
107
|
+
const l1Constants = {
|
|
108
|
+
epochDuration: config.aztecEpochDuration
|
|
109
|
+
};
|
|
110
|
+
const [fromSlot, toSlot] = getSlotRangeForEpoch(jobData.epochNumber, l1Constants);
|
|
111
|
+
const spec = {
|
|
112
|
+
kind: 'full',
|
|
113
|
+
epochNumber: jobData.epochNumber,
|
|
114
|
+
fromSlot,
|
|
115
|
+
toSlot
|
|
116
|
+
};
|
|
117
|
+
const session = new EpochSession(spec, provers, {
|
|
118
|
+
proverFactory: prover,
|
|
119
|
+
proverId: prover.getProverId(),
|
|
120
|
+
publishingService,
|
|
121
|
+
metrics,
|
|
122
|
+
dateProvider: new DateProvider(),
|
|
123
|
+
deadline: undefined,
|
|
124
|
+
config: {},
|
|
125
|
+
bindings: log.getBindings()
|
|
126
|
+
});
|
|
127
|
+
const finalState = await session.start();
|
|
128
|
+
log.info(`Completed proving for epoch ${jobData.epochNumber} with status ${finalState}`, {
|
|
129
|
+
derivedEpoch: getEpochAtSlot(provers[0].slotNumber, l1Constants)
|
|
130
|
+
});
|
|
131
|
+
return finalState;
|
|
132
|
+
} catch (e) {
|
|
133
|
+
env.error = e;
|
|
134
|
+
env.hasError = true;
|
|
135
|
+
} finally{
|
|
136
|
+
const result = _ts_dispose_resources(env);
|
|
137
|
+
if (result) await result;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Re-proves a single downloaded checkpoint proving job (as uploaded by a `CheckpointProver` failure).
|
|
142
|
+
* Reconstructs just that checkpoint's sub-tree prover from the snapshot and awaits its block proofs — no
|
|
143
|
+
* epoch top-tree, no L1 submission — so a checkpoint-level failure can be reproduced offline in isolation.
|
|
144
|
+
* Returns the block-rollup proof outputs on success; throws if the checkpoint fails to prove again.
|
|
145
|
+
*/ export async function rerunCheckpointProvingJob(localPath, log, config, genesis) {
|
|
146
|
+
const env = {
|
|
147
|
+
stack: [],
|
|
148
|
+
error: void 0,
|
|
149
|
+
hasError: false
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
const ctx = _ts_add_disposable_resource(env, await createRerunContext(localPath, log, config, genesis), true);
|
|
153
|
+
const { jobData } = ctx;
|
|
154
|
+
const checkpointNumber = jobData.checkpoints[0].number;
|
|
155
|
+
log.info(`Rerunning checkpoint proving for checkpoint ${checkpointNumber} (epoch ${jobData.epochNumber})`);
|
|
156
|
+
const prover = await buildCheckpointProver(ctx, 0, log);
|
|
157
|
+
try {
|
|
158
|
+
const { blockProofOutputs } = await prover.whenSubTreeProofsReady();
|
|
159
|
+
log.info(`Completed proving for checkpoint ${checkpointNumber} with ${blockProofOutputs.length} block proof(s)`);
|
|
160
|
+
return blockProofOutputs;
|
|
161
|
+
} finally{
|
|
162
|
+
prover.cancel({
|
|
163
|
+
routine: true
|
|
164
|
+
});
|
|
165
|
+
await prover.whenDone();
|
|
166
|
+
}
|
|
167
|
+
} catch (e) {
|
|
168
|
+
env.error = e;
|
|
169
|
+
env.hasError = true;
|
|
170
|
+
} finally{
|
|
171
|
+
const result = _ts_dispose_resources(env);
|
|
172
|
+
if (result) await result;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Rebuilds the offline proving environment from a downloaded job: world state + archiver from the
|
|
177
|
+
* snapshots, a local proving broker + client, a chonk cache, and a tx provider that replays the job's txs.
|
|
178
|
+
*/ async function createRerunContext(localPath, log, config, genesis) {
|
|
179
|
+
const jobData = deserializeEpochProvingJobData(readFileSync(localPath));
|
|
180
|
+
log.info(`Loaded proving job data for epoch ${jobData.epochNumber}`);
|
|
181
|
+
const telemetry = getTelemetryClient();
|
|
182
|
+
const metrics = new ProverNodeJobMetrics(telemetry.getMeter('prover-job'), telemetry.getTracer('prover-job'));
|
|
183
|
+
const worldState = await createWorldState(config, genesis);
|
|
184
|
+
const initialBlockHash = await worldState.getInitialHeader().hash();
|
|
185
|
+
const archiver = await createArchiverStore(config, initialBlockHash);
|
|
186
|
+
const avmSimulator = await AvmSimulatorPool.spawn({
|
|
187
|
+
wsdbIpcPath: worldState.getIpcPath()
|
|
188
|
+
});
|
|
189
|
+
const publicProcessorFactory = new PublicProcessorFactory(createContractDataSource(archiver), avmSimulator, undefined, undefined, log.getBindings());
|
|
190
|
+
const broker = await createAndStartProvingBroker(config, telemetry);
|
|
191
|
+
const prover = await createProverClient(config, worldState, broker, telemetry);
|
|
192
|
+
const chonkCache = new ChonkCache(log.getBindings());
|
|
193
|
+
const txProvider = makeReplayingTxProvider(jobData.txs);
|
|
194
|
+
return {
|
|
195
|
+
jobData,
|
|
196
|
+
metrics,
|
|
197
|
+
worldState,
|
|
198
|
+
publicProcessorFactory,
|
|
199
|
+
prover,
|
|
200
|
+
chonkCache,
|
|
201
|
+
txProvider,
|
|
202
|
+
async [Symbol.asyncDispose] () {
|
|
203
|
+
await avmSimulator[Symbol.asyncDispose]();
|
|
204
|
+
await worldState[Symbol.asyncDispose]();
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/** Reconstructs the `CheckpointProver` for the checkpoint at `index` in the job, ready to prove. */ async function buildCheckpointProver(ctx, index, log) {
|
|
209
|
+
const { jobData, worldState, prover, chonkCache, publicProcessorFactory, txProvider, metrics } = ctx;
|
|
210
|
+
const checkpoint = jobData.checkpoints[index];
|
|
211
|
+
const previousBlockHeader = index === 0 ? jobData.previousBlockHeader : jobData.checkpoints[index - 1].blocks.at(-1).header;
|
|
212
|
+
const previousInboxRollingHash = index === 0 ? jobData.previousInboxRollingHash : jobData.checkpoints[index - 1].header.inboxRollingHash;
|
|
213
|
+
const l1ToL2Messages = jobData.l1ToL2Messages[checkpoint.number] ?? [];
|
|
214
|
+
const previousArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, worldState.getSnapshot(BlockNumber(checkpoint.blocks[0].number - 1)));
|
|
215
|
+
const attestations = checkpoint.number === jobData.checkpoints.at(-1).number ? jobData.attestations : [];
|
|
216
|
+
return new CheckpointProver({
|
|
217
|
+
checkpoint,
|
|
218
|
+
epochNumber: jobData.epochNumber,
|
|
219
|
+
attestations,
|
|
220
|
+
previousBlockHeader,
|
|
221
|
+
l1ToL2Messages,
|
|
222
|
+
previousInboxRollingHash,
|
|
223
|
+
previousArchiveSiblingPath
|
|
224
|
+
}, {
|
|
225
|
+
proverFactory: prover,
|
|
226
|
+
chonkCache,
|
|
227
|
+
publicProcessorFactory,
|
|
228
|
+
dbProvider: worldState,
|
|
229
|
+
txProvider,
|
|
230
|
+
dateProvider: new DateProvider(),
|
|
231
|
+
proverId: prover.getProverId(),
|
|
232
|
+
metrics,
|
|
233
|
+
txGatheringTimeoutMs: 120_000,
|
|
234
|
+
deadline: undefined,
|
|
235
|
+
log
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/** Build a synthetic ITxProvider that returns the supplied txs map by lookup. */ function makeReplayingTxProvider(txs) {
|
|
239
|
+
const lookup = (hashes)=>{
|
|
240
|
+
const found = [];
|
|
241
|
+
const missing = [];
|
|
242
|
+
for (const hash of hashes){
|
|
243
|
+
const tx = txs.get(hash.toString());
|
|
244
|
+
if (tx) {
|
|
245
|
+
found.push(tx);
|
|
246
|
+
} else {
|
|
247
|
+
missing.push(hash);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
txs: found,
|
|
252
|
+
missingTxs: missing
|
|
253
|
+
};
|
|
254
|
+
};
|
|
255
|
+
return {
|
|
256
|
+
getAvailableTxs: (hashes)=>Promise.resolve(lookup(hashes)),
|
|
257
|
+
hasTxs: (hashes)=>Promise.resolve(hashes.map((h)=>txs.has(h.toString()))),
|
|
258
|
+
getTxsForBlockProposal: ()=>Promise.resolve({
|
|
259
|
+
txs: [],
|
|
260
|
+
missingTxs: []
|
|
261
|
+
}),
|
|
262
|
+
getTxsForBlock: (block)=>Promise.resolve(lookup(block.body.txEffects.map((e)=>e.txHash)))
|
|
263
|
+
};
|
|
264
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Archiver } from '@aztec-labs/archiver';
|
|
2
|
+
import type { Logger } from '@aztec-labs/foundation/log';
|
|
3
|
+
import type { ChainConfig } from '@aztec-labs/stdlib/config';
|
|
4
|
+
import type { WorldStateSynchronizer } from '@aztec-labs/stdlib/interfaces/server';
|
|
5
|
+
import type { DataStoreConfig } from '@aztec-labs/stdlib/kv-store';
|
|
6
|
+
import { type EpochProvingJobData } from '../job/epoch-proving-job-data.js';
|
|
7
|
+
type UploadEpochProofConfig = Pick<ChainConfig, 'l1ChainId' | 'rollupVersion'> & Pick<DataStoreConfig, 'dataDirectory'>;
|
|
8
|
+
/**
|
|
9
|
+
* Uploads a snapshot of world state and archiver (requires pausing them) along with the proving job data,
|
|
10
|
+
* so we can download and re-run the job later under the same conditions.
|
|
11
|
+
* @param location The location to upload the data to (used to create the `FileStore`).
|
|
12
|
+
*/
|
|
13
|
+
export declare function uploadEpochProofFailure(location: string, jobId: string, jobData: EpochProvingJobData, archiver: Archiver, worldState: WorldStateSynchronizer, config: UploadEpochProofConfig, log: Logger): Promise<string>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWVwb2NoLXByb29mLWZhaWx1cmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3VwbG9hZC1lcG9jaC1wcm9vZi1mYWlsdXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsS0FBSyxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUcxRSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBT25FLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFnQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFHLEtBQUssc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUt4SDs7OztHQUlHO0FBQ0gsd0JBQXNCLHVCQUF1QixDQUMzQyxRQUFRLEVBQUUsTUFBTSxFQUNoQixLQUFLLEVBQUUsTUFBTSxFQUNiLE9BQU8sRUFBRSxtQkFBbUIsRUFDNUIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsVUFBVSxFQUFFLHNCQUFzQixFQUNsQyxNQUFNLEVBQUUsc0JBQXNCLEVBQzlCLEdBQUcsRUFBRSxNQUFNLG1CQXVDWiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-epoch-proof-failure.d.ts","sourceRoot":"","sources":["../../src/actions/upload-epoch-proof-failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAOnE,OAAO,EAAE,KAAK,mBAAmB,EAAgC,MAAM,kCAAkC,CAAC;AAE1G,KAAK,sBAAsB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAKxH;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,sBAAsB,EAClC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,MAAM,mBAuCZ"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ARCHIVER_DB_VERSION } from '@aztec-labs/archiver';
|
|
2
|
+
import { tryRmDir } from '@aztec-labs/foundation/fs';
|
|
3
|
+
import { jsonStringify } from '@aztec-labs/foundation/json-rpc';
|
|
4
|
+
import { isoDate } from '@aztec-labs/foundation/string';
|
|
5
|
+
import { buildSnapshotMetadata, createBackups } from '@aztec-labs/node-lib/actions';
|
|
6
|
+
import { createFileStore } from '@aztec-labs/stdlib/file-store';
|
|
7
|
+
import { getBasePath, uploadSnapshotData } from '@aztec-labs/stdlib/snapshots';
|
|
8
|
+
import { WORLD_STATE_DB_VERSION } from '@aztec-labs/world-state';
|
|
9
|
+
import { mkdtemp } from 'fs/promises';
|
|
10
|
+
import { tmpdir } from 'os';
|
|
11
|
+
import { dirname, join } from 'path';
|
|
12
|
+
import { serializeEpochProvingJobData } from '../job/epoch-proving-job-data.js';
|
|
13
|
+
/** Whether uploaded data to the file store should be of public access. */ const PUBLIC_UPLOADS = true;
|
|
14
|
+
/**
|
|
15
|
+
* Uploads a snapshot of world state and archiver (requires pausing them) along with the proving job data,
|
|
16
|
+
* so we can download and re-run the job later under the same conditions.
|
|
17
|
+
* @param location The location to upload the data to (used to create the `FileStore`).
|
|
18
|
+
*/ export async function uploadEpochProofFailure(location, jobId, jobData, archiver, worldState, config, log) {
|
|
19
|
+
const epochNumber = jobData.epochNumber;
|
|
20
|
+
log.warn(`Uploading epoch proof failure for ${epochNumber} to ${location}`, {
|
|
21
|
+
epochNumber,
|
|
22
|
+
jobId,
|
|
23
|
+
location
|
|
24
|
+
});
|
|
25
|
+
const backupDir = await mkdtemp(join(config.dataDirectory ?? tmpdir(), 'epoch-proof-data-'));
|
|
26
|
+
const store = await createFileStore(location);
|
|
27
|
+
if (!store) {
|
|
28
|
+
throw new Error(`Failed to create file store for epoch proof failure upload for location ${location}.`);
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const versions = {
|
|
32
|
+
archiver: ARCHIVER_DB_VERSION,
|
|
33
|
+
worldState: WORLD_STATE_DB_VERSION
|
|
34
|
+
};
|
|
35
|
+
const uploadMetadata = await buildSnapshotMetadata(archiver, config);
|
|
36
|
+
const paths = await createBackups(backupDir, archiver, worldState, log);
|
|
37
|
+
const basePath = `${getBasePath(uploadMetadata)}/${epochNumber}-${isoDate()}-${jobId}`;
|
|
38
|
+
const pathFor = (key)=>`${basePath}/${key}.db`;
|
|
39
|
+
const [metadata, dataUrl, metadataUrl] = await Promise.all([
|
|
40
|
+
uploadSnapshotData(paths, versions, uploadMetadata, store, {
|
|
41
|
+
pathFor,
|
|
42
|
+
private: !PUBLIC_UPLOADS
|
|
43
|
+
}),
|
|
44
|
+
uploadJobData(jobData, store, basePath),
|
|
45
|
+
uploadSnapshotMetadata(uploadMetadata, store, basePath)
|
|
46
|
+
]);
|
|
47
|
+
const baseUrl = dirname(metadataUrl);
|
|
48
|
+
log.warn(`Uploaded epoch ${epochNumber} proof failure data to ${baseUrl}`, {
|
|
49
|
+
epochNumber,
|
|
50
|
+
location,
|
|
51
|
+
basePath,
|
|
52
|
+
metadataUrl,
|
|
53
|
+
dataUrl,
|
|
54
|
+
metadata,
|
|
55
|
+
jobId
|
|
56
|
+
});
|
|
57
|
+
return baseUrl;
|
|
58
|
+
} finally{
|
|
59
|
+
log.info(`Cleaning up backup dir ${backupDir}`);
|
|
60
|
+
await tryRmDir(backupDir, log);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function uploadJobData(jobData, store, basePath) {
|
|
64
|
+
const data = serializeEpochProvingJobData(jobData);
|
|
65
|
+
const path = `${basePath}/data.bin`;
|
|
66
|
+
return await store.save(path, data, {
|
|
67
|
+
compress: true,
|
|
68
|
+
public: PUBLIC_UPLOADS
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async function uploadSnapshotMetadata(metadata, store, basePath) {
|
|
72
|
+
const data = Buffer.from(jsonStringify(metadata), 'utf-8');
|
|
73
|
+
const path = `${basePath}/metadata.json`;
|
|
74
|
+
return await store.save(path, data, {
|
|
75
|
+
compress: false,
|
|
76
|
+
public: PUBLIC_UPLOADS
|
|
77
|
+
});
|
|
78
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-failed-epoch.d.ts","sourceRoot":"","sources":["../../src/bin/run-failed-epoch.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/* eslint-disable no-console */ import { getL1ContractsConfigEnvVars } from '@aztec-labs/ethereum/config';
|
|
2
|
+
import { EthAddress } from '@aztec-labs/foundation/eth-address';
|
|
3
|
+
import { jsonParseWithSchema, jsonStringify } from '@aztec-labs/foundation/json-rpc';
|
|
4
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
5
|
+
import { downloadEpochProvingJob, getProverNodeConfigFromEnv, rerunEpochProvingJob } from '@aztec-labs/prover-node';
|
|
6
|
+
import { UploadSnapshotMetadataSchema } from '@aztec-labs/stdlib/snapshots';
|
|
7
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
8
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
9
|
+
import { basename, join } from 'path';
|
|
10
|
+
const logger = createLogger('prover-node:run-failed-epoch');
|
|
11
|
+
function printUsage() {
|
|
12
|
+
console.error('Usage: run-failed-epoch <proof-uri> [out-dir=./data]');
|
|
13
|
+
}
|
|
14
|
+
async function rerunFailedEpoch(provingJobUrl, baseLocalDir) {
|
|
15
|
+
const localDir = join(baseLocalDir, basename(provingJobUrl));
|
|
16
|
+
const jobPath = join(localDir, 'data.bin');
|
|
17
|
+
const dataDir = join(localDir, 'state');
|
|
18
|
+
const env = getProverNodeConfigFromEnv();
|
|
19
|
+
const l1Config = getL1ContractsConfigEnvVars();
|
|
20
|
+
const config = {
|
|
21
|
+
...env,
|
|
22
|
+
...l1Config,
|
|
23
|
+
dataDirectory: dataDir,
|
|
24
|
+
dataStoreMapSizeKb: env.dataStoreMapSizeKb ?? 1024 * 1024,
|
|
25
|
+
proverId: env.proverId ?? EthAddress.random()
|
|
26
|
+
};
|
|
27
|
+
let metadata;
|
|
28
|
+
const metadataPath = join(localDir, 'metadata.json');
|
|
29
|
+
if (existsSync(metadataPath)) {
|
|
30
|
+
logger.info(`Using downloaded data`);
|
|
31
|
+
metadata = jsonParseWithSchema(await readFile(metadataPath, 'utf-8'), UploadSnapshotMetadataSchema);
|
|
32
|
+
} else {
|
|
33
|
+
logger.info(`Downloading epoch proving job data and state from ${provingJobUrl} to ${localDir}`);
|
|
34
|
+
metadata = await downloadEpochProvingJob(provingJobUrl, logger, {
|
|
35
|
+
jobDataDownloadPath: jobPath,
|
|
36
|
+
dataDirectory: dataDir
|
|
37
|
+
});
|
|
38
|
+
await writeFile(metadataPath, jsonStringify(metadata, true));
|
|
39
|
+
logger.info(`Download to ${localDir} complete`);
|
|
40
|
+
}
|
|
41
|
+
logger.info(`Rerunning proving job from ${jobPath} with state from ${dataDir}`, metadata);
|
|
42
|
+
const result = await rerunEpochProvingJob(jobPath, logger, {
|
|
43
|
+
...config,
|
|
44
|
+
rollupAddress: metadata.rollupAddress,
|
|
45
|
+
rollupVersion: metadata.rollupVersion
|
|
46
|
+
});
|
|
47
|
+
console.error(`Epoch proving job complete with result ${result}`);
|
|
48
|
+
}
|
|
49
|
+
async function main() {
|
|
50
|
+
if (process.argv[2] === '--help') {
|
|
51
|
+
printUsage();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const uri = process.argv[2];
|
|
55
|
+
const outDir = process.argv[3] || './data';
|
|
56
|
+
if (!uri) {
|
|
57
|
+
printUsage();
|
|
58
|
+
throw new Error('Missing URL to epoch proving job');
|
|
59
|
+
}
|
|
60
|
+
mkdirSync(outDir, {
|
|
61
|
+
recursive: true
|
|
62
|
+
});
|
|
63
|
+
await rerunFailedEpoch(uri, outDir);
|
|
64
|
+
}
|
|
65
|
+
main().catch((err)=>{
|
|
66
|
+
console.error(err);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
});
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { BlockNumber, EpochNumber, SlotNumber } from '@aztec-labs/foundation/branded-types';
|
|
2
|
+
import { type LoggerBindings } from '@aztec-labs/foundation/log';
|
|
3
|
+
import type { L2BlockSource } from '@aztec-labs/stdlib/block';
|
|
4
|
+
import type { Checkpoint } from '@aztec-labs/stdlib/checkpoint';
|
|
5
|
+
import { type L1RollupConstants } from '@aztec-labs/stdlib/epoch-helpers';
|
|
6
|
+
import { CheckpointProver, type CheckpointProverArgs, type CheckpointProverDeps, type CheckpointProverTestHooks } from './job/checkpoint-prover.js';
|
|
7
|
+
/** Register-time data needed to construct a `CheckpointProver` (everything except the checkpoint + epoch). */
|
|
8
|
+
export type RegisterCheckpointData = Omit<CheckpointProverArgs, 'checkpoint' | 'epochNumber'>;
|
|
9
|
+
/** Factory used by the store to construct new provers. Tests can inject a stub. */
|
|
10
|
+
export type CheckpointProverFactory = (args: CheckpointProverArgs, deps: CheckpointProverDeps) => CheckpointProver;
|
|
11
|
+
/**
|
|
12
|
+
* Prover-node-wide registry of `CheckpointProver` instances, content-addressed by
|
|
13
|
+
* `(checkpoint number, slot, checkpoint archive root)`.
|
|
14
|
+
*
|
|
15
|
+
* The store survives every epoch / session boundary. A prover lives from its first
|
|
16
|
+
* `addOrUpdate` call until either:
|
|
17
|
+
* - its checkpoint is pruned by an L1 reorg (`cancelAndRemoveAboveBlock`), or
|
|
18
|
+
* - its epoch's proof-submission window has closed (`reapExpired`), so the proof could no
|
|
19
|
+
* longer be accepted on L1 even if produced.
|
|
20
|
+
*
|
|
21
|
+
* A prover's sub-tree work forks world-state per block and does not survive a prune of a base
|
|
22
|
+
* block, so there is nothing to preserve across a reorg: a pruned prover is cancelled and
|
|
23
|
+
* dropped, and a re-add (even of identical content) constructs a fresh prover.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CheckpointStore {
|
|
26
|
+
private readonly l2BlockSource;
|
|
27
|
+
private readonly proverDeps;
|
|
28
|
+
private readonly proverFactoryFn;
|
|
29
|
+
private readonly provers;
|
|
30
|
+
/**
|
|
31
|
+
* Teardowns of provers already removed from `provers` (by prune or reap), awaited on `stop()`.
|
|
32
|
+
* Keyed by a monotonic id rather than the prover's content id: a prune-then-re-add can leave two
|
|
33
|
+
* teardowns for the same content id in flight at once, which a content-id key would clobber.
|
|
34
|
+
*/
|
|
35
|
+
private readonly pendingTeardowns;
|
|
36
|
+
private nextTeardownId;
|
|
37
|
+
/** Test-only hooks injected into every prover this store constructs. */
|
|
38
|
+
private testHooks;
|
|
39
|
+
private readonly log;
|
|
40
|
+
constructor(l2BlockSource: Pick<L2BlockSource, 'getL1Constants'>, proverDeps: Omit<CheckpointProverDeps, 'log'>, bindings?: LoggerBindings, proverFactoryFn?: CheckpointProverFactory);
|
|
41
|
+
start(): Promise<void>;
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Tracks the teardown of a prover just removed from the store so `stop()` can await it. The entry
|
|
45
|
+
* removes itself once teardown settles, so the map stays bounded by the number in flight.
|
|
46
|
+
*/
|
|
47
|
+
private trackTeardown;
|
|
48
|
+
/**
|
|
49
|
+
* Registers a checkpoint with the store. If a prover already exists for the
|
|
50
|
+
* `(number, slot, archive root)` content key it is reused (an at-least-once re-registration of
|
|
51
|
+
* still-canonical content); otherwise a new prover is constructed.
|
|
52
|
+
*/
|
|
53
|
+
addOrUpdate(checkpoint: Checkpoint, data: RegisterCheckpointData): Promise<CheckpointProver>;
|
|
54
|
+
/**
|
|
55
|
+
* Installs test-only hooks applied to every prover constructed from now on. Used by the e2e harness to
|
|
56
|
+
* force a checkpoint sub-tree failure without monkey-patching the prover factory.
|
|
57
|
+
*/
|
|
58
|
+
setTestHooks(hooks: CheckpointProverTestHooks): void;
|
|
59
|
+
/**
|
|
60
|
+
* Cancels and removes every prover that holds a block above the prune target. A checkpoint is orphaned by a prune to
|
|
61
|
+
* block `targetBlockNumber` iff its last block sits above the target — including a checkpoint whose range straddles
|
|
62
|
+
* the target (partially orphaned), which block-range marking catches without boundary ambiguity. Keying off the
|
|
63
|
+
* surviving block number (rather than a checkpoint number) is correct even when the source has already
|
|
64
|
+
* re-checkpointed past the divergence: the prune event reports the highest surviving block, which by construction
|
|
65
|
+
* survives on the source, whereas the source's current checkpointed tip can sit above the prune target.
|
|
66
|
+
*
|
|
67
|
+
* The prover's in-flight sub-tree work forks world-state per block and faults once its base block is pruned, so it
|
|
68
|
+
* cannot be reused; it is cancelled (aborting the fork reads) and dropped. A subsequent re-add constructs a fresh
|
|
69
|
+
* prover. Returns the removed provers.
|
|
70
|
+
*/
|
|
71
|
+
cancelAndRemoveAboveBlock(targetBlockNumber: BlockNumber): CheckpointProver[];
|
|
72
|
+
/**
|
|
73
|
+
* Drops provers whose epoch is at or below the supplied expired epoch. Once an epoch's
|
|
74
|
+
* proof-submission window has closed, its proof can no longer be accepted on L1, so the
|
|
75
|
+
* prover is no longer needed.
|
|
76
|
+
*/
|
|
77
|
+
reapExpired(expiredEpoch: EpochNumber): void;
|
|
78
|
+
/** Returns the prover with the supplied id, or undefined. */
|
|
79
|
+
get(id: string): CheckpointProver | undefined;
|
|
80
|
+
/** Returns the prover for the supplied checkpoint (by its content-addressed id), or undefined. */
|
|
81
|
+
getByCheckpoint(checkpoint: Checkpoint): CheckpointProver | undefined;
|
|
82
|
+
/** Every prover currently in the store, in insertion order. */
|
|
83
|
+
listAll(): CheckpointProver[];
|
|
84
|
+
/** Provers in the store, sorted by checkpoint number. */
|
|
85
|
+
list(): CheckpointProver[];
|
|
86
|
+
/**
|
|
87
|
+
* Provers whose slot is in the supplied epoch's slot range, sorted by checkpoint number.
|
|
88
|
+
*/
|
|
89
|
+
listForEpoch(epoch: EpochNumber): Promise<CheckpointProver[]>;
|
|
90
|
+
/** Provers whose slot falls within `[fromSlot, toSlot]`, sorted by checkpoint number. */
|
|
91
|
+
listInSlotRange(fromSlot: SlotNumber, toSlot: SlotNumber): CheckpointProver[];
|
|
92
|
+
}
|
|
93
|
+
/** Sub-set of `L1RollupConstants` actually consumed by the store's slot helpers. */
|
|
94
|
+
export type CheckpointStoreL1Constants = Pick<L1RollupConstants, 'epochDuration'>;
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludC1zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NoZWNrcG9pbnQtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFvQixXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkgsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQzVGLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUF3QyxNQUFNLGtDQUFrQyxDQUFDO0FBRWhILE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxvQkFBb0IsRUFDekIsS0FBSyx5QkFBeUIsRUFDL0IsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyw4R0FBOEc7QUFDOUcsTUFBTSxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxZQUFZLEdBQUcsYUFBYSxDQUFDLENBQUM7QUFFOUYsbUZBQW1GO0FBQ25GLE1BQU0sTUFBTSx1QkFBdUIsR0FBRyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEtBQUssZ0JBQWdCLENBQUM7QUFFbkg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILHFCQUFhLGVBQWU7SUFjeEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhO0lBQzlCLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVTtJQUUzQixPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWU7SUFoQmxDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUF1QztJQUMvRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBb0M7SUFDckUsT0FBTyxDQUFDLGNBQWMsQ0FBSztJQUMzQix3RUFBd0U7SUFDeEUsT0FBTyxDQUFDLFNBQVMsQ0FBaUM7SUFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQVM7SUFFN0IsWUFDbUIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsRUFDcEQsVUFBVSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsRUFDOUQsUUFBUSxDQUFDLEVBQUUsY0FBYyxFQUNSLGVBQWUsR0FBRSx1QkFBMEUsRUFHN0c7SUFFTSxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUU1QjtJQUVZLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBU2pDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLGFBQWE7SUFPckI7Ozs7T0FJRztJQUNVLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0E2QnhHO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLEtBQUssRUFBRSx5QkFBeUIsR0FBRyxJQUFJLENBRTFEO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSx5QkFBeUIsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEdBQUcsZ0JBQWdCLEVBQUUsQ0FZbkY7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLFlBQVksRUFBRSxXQUFXLEdBQUcsSUFBSSxDQWlCbEQ7SUFFRCw2REFBNkQ7SUFDdEQsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEdBQUcsZ0JBQWdCLEdBQUcsU0FBUyxDQUVuRDtJQUVELGtHQUFrRztJQUMzRixlQUFlLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRyxTQUFTLENBRTNFO0lBRUQsK0RBQStEO0lBQ3hELE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUVuQztJQUVELHlEQUF5RDtJQUNsRCxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FFaEM7SUFFRDs7T0FFRztJQUNVLFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBSXpFO0lBRUQseUZBQXlGO0lBQ2xGLGVBQWUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FFbkY7Q0FDRjtBQUVELG9GQUFvRjtBQUNwRixNQUFNLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-store.d.ts","sourceRoot":"","sources":["../src/checkpoint-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAoB,WAAW,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AACnH,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,4BAA4B,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,iBAAiB,EAAwC,MAAM,kCAAkC,CAAC;AAEhH,OAAO,EACL,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC,8GAA8G;AAC9G,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,aAAa,CAAC,CAAC;AAE9F,mFAAmF;AACnF,MAAM,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,oBAAoB,KAAK,gBAAgB,CAAC;AAEnH;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAcxB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAhBlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoC;IACrE,OAAO,CAAC,cAAc,CAAK;IAC3B,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YACmB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,EACpD,UAAU,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,EAC9D,QAAQ,CAAC,EAAE,cAAc,EACR,eAAe,GAAE,uBAA0E,EAG7G;IAEM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CASjC;IAED;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;OAIG;IACU,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6BxG;IAED;;;OAGG;IACI,YAAY,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI,CAE1D;IAED;;;;;;;;;;;OAWG;IACI,yBAAyB,CAAC,iBAAiB,EAAE,WAAW,GAAG,gBAAgB,EAAE,CAYnF;IAED;;;;OAIG;IACI,WAAW,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CAiBlD;IAED,6DAA6D;IACtD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEnD;IAED,kGAAkG;IAC3F,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAE3E;IAED,+DAA+D;IACxD,OAAO,IAAI,gBAAgB,EAAE,CAEnC;IAED,yDAAyD;IAClD,IAAI,IAAI,gBAAgB,EAAE,CAEhC;IAED;;OAEG;IACU,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAIzE;IAED,yFAAyF;IAClF,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAEnF;CACF;AAED,oFAAoF;AACpF,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC"}
|