@aztec/archiver 0.78.1 → 0.79.0
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/archiver/archiver.d.ts +2 -2
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +15 -13
- package/package.json +14 -14
- package/src/archiver/archiver.ts +20 -14
|
@@ -44,8 +44,8 @@ export declare class Archiver extends EventEmitter implements ArchiveSource, Tra
|
|
|
44
44
|
private rollup;
|
|
45
45
|
private inbox;
|
|
46
46
|
private store;
|
|
47
|
-
l1BlockNumber
|
|
48
|
-
l1Timestamp
|
|
47
|
+
private l1BlockNumber;
|
|
48
|
+
private l1Timestamp;
|
|
49
49
|
readonly tracer: Tracer;
|
|
50
50
|
/**
|
|
51
51
|
* Creates a new instance of the Archiver.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,KAAK,gBAAgB,EAAuB,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAclE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,OAAO,EAEZ,KAAK,aAAa,EAElB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAEhC,KAAK,cAAc,EAKpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,iBAAiB,EAMvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC3G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,UAAU,EAAkB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,KAAK,EAAa,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,KAAK,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAc,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAEnH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAI/D;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GACvC,YAAY,GACZ,kBAAkB,GAClB,mBAAmB,GACnB,wBAAwB,CAAC;AAE3B;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,YAAa,YAAW,aAAa,EAAE,SAAS;IA2B1E,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,QAAQ,CAAC,SAAS,EAAE,iBAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAjCtB;;OAEG;IACH,OAAO,CAAC,cAAc,CAAC,CAAiB;IAExC,OAAO,CAAC,MAAM,CAA4D;IAC1E,OAAO,CAAC,KAAK,CAA2D;IAExE,OAAO,CAAC,KAAK,CAAsB;
|
|
1
|
+
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -167,13 +167,10 @@ import { ArchiverInstrumentation } from './instrumentation.js';
|
|
|
167
167
|
* in future but for the time being it should give us the guarantees that we need
|
|
168
168
|
*/ // ********** Events that are processed per L1 block **********
|
|
169
169
|
await this.handleL1ToL2Messages(messagesSynchedTo, currentL1BlockNumber);
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
})).timestamp;
|
|
175
|
-
this.l1BlockNumber = currentL1BlockNumber;
|
|
176
|
-
}
|
|
170
|
+
// Get L1 timestamp for the current block
|
|
171
|
+
const currentL1Timestamp = !this.l1Timestamp || !this.l1BlockNumber || this.l1BlockNumber !== currentL1BlockNumber ? (await this.publicClient.getBlock({
|
|
172
|
+
blockNumber: currentL1BlockNumber
|
|
173
|
+
})).timestamp : this.l1Timestamp;
|
|
177
174
|
// ********** Events that are processed per L2 block **********
|
|
178
175
|
if (currentL1BlockNumber > blocksSynchedTo) {
|
|
179
176
|
// First we retrieve new L2 blocks
|
|
@@ -183,9 +180,14 @@ import { ArchiverInstrumentation } from './instrumentation.js';
|
|
|
183
180
|
// blocks from more than 2 epochs ago, so we want to make sure we have the latest view of
|
|
184
181
|
// the chain locally before we start unwinding stuff. This can be optimized by figuring out
|
|
185
182
|
// up to which point we're pruning, and then requesting L2 blocks up to that point only.
|
|
186
|
-
await this.handleEpochPrune(provenBlockNumber, currentL1BlockNumber);
|
|
183
|
+
await this.handleEpochPrune(provenBlockNumber, currentL1BlockNumber, currentL1Timestamp);
|
|
187
184
|
this.instrumentation.updateL1BlockHeight(currentL1BlockNumber);
|
|
188
185
|
}
|
|
186
|
+
// After syncing has completed, update the current l1 block number and timestamp,
|
|
187
|
+
// otherwise we risk announcing to the world that we've synced to a given point,
|
|
188
|
+
// but the corresponding blocks have not been processed (see #12631).
|
|
189
|
+
this.l1Timestamp = currentL1Timestamp;
|
|
190
|
+
this.l1BlockNumber = currentL1BlockNumber;
|
|
189
191
|
if (initialRun) {
|
|
190
192
|
this.log.info(`Initial archiver sync to L1 block ${currentL1BlockNumber} complete.`, {
|
|
191
193
|
l1BlockNumber: currentL1BlockNumber,
|
|
@@ -194,19 +196,19 @@ import { ArchiverInstrumentation } from './instrumentation.js';
|
|
|
194
196
|
});
|
|
195
197
|
}
|
|
196
198
|
}
|
|
197
|
-
/** Queries the rollup contract on whether a prune can be executed on the immediatenext L1 block. */ async canPrune(currentL1BlockNumber) {
|
|
198
|
-
const time = (
|
|
199
|
+
/** Queries the rollup contract on whether a prune can be executed on the immediatenext L1 block. */ async canPrune(currentL1BlockNumber, currentL1Timestamp) {
|
|
200
|
+
const time = (currentL1Timestamp ?? 0n) + BigInt(this.l1constants.ethereumSlotDuration);
|
|
199
201
|
return await this.rollup.read.canPruneAtTime([
|
|
200
202
|
time
|
|
201
203
|
], {
|
|
202
204
|
blockNumber: currentL1BlockNumber
|
|
203
205
|
});
|
|
204
206
|
}
|
|
205
|
-
/** Checks if there'd be a reorg for the next block submission and start pruning now. */ async handleEpochPrune(provenBlockNumber, currentL1BlockNumber) {
|
|
207
|
+
/** Checks if there'd be a reorg for the next block submission and start pruning now. */ async handleEpochPrune(provenBlockNumber, currentL1BlockNumber, currentL1Timestamp) {
|
|
206
208
|
const localPendingBlockNumber = BigInt(await this.getBlockNumber());
|
|
207
|
-
const canPrune = localPendingBlockNumber > provenBlockNumber && await this.canPrune(currentL1BlockNumber);
|
|
209
|
+
const canPrune = localPendingBlockNumber > provenBlockNumber && await this.canPrune(currentL1BlockNumber, currentL1Timestamp);
|
|
208
210
|
if (canPrune) {
|
|
209
|
-
const localPendingSlotNumber =
|
|
211
|
+
const localPendingSlotNumber = getSlotAtTimestamp(currentL1Timestamp, this.l1constants);
|
|
210
212
|
const localPendingEpochNumber = getEpochAtSlot(localPendingSlotNumber, this.l1constants);
|
|
211
213
|
// Emit an event for listening services to react to the chain prune
|
|
212
214
|
this.emit(L2BlockSourceEvents.L2PruneDetected, {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.79.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -64,24 +64,24 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/blob-lib": "0.
|
|
68
|
-
"@aztec/blob-sink": "0.
|
|
69
|
-
"@aztec/constants": "0.
|
|
70
|
-
"@aztec/ethereum": "0.
|
|
71
|
-
"@aztec/foundation": "0.
|
|
72
|
-
"@aztec/kv-store": "0.
|
|
73
|
-
"@aztec/l1-artifacts": "0.
|
|
74
|
-
"@aztec/noir-contracts.js": "0.
|
|
75
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
76
|
-
"@aztec/protocol-contracts": "0.
|
|
77
|
-
"@aztec/stdlib": "0.
|
|
78
|
-
"@aztec/telemetry-client": "0.
|
|
67
|
+
"@aztec/blob-lib": "0.79.0",
|
|
68
|
+
"@aztec/blob-sink": "0.79.0",
|
|
69
|
+
"@aztec/constants": "0.79.0",
|
|
70
|
+
"@aztec/ethereum": "0.79.0",
|
|
71
|
+
"@aztec/foundation": "0.79.0",
|
|
72
|
+
"@aztec/kv-store": "0.79.0",
|
|
73
|
+
"@aztec/l1-artifacts": "0.79.0",
|
|
74
|
+
"@aztec/noir-contracts.js": "0.79.0",
|
|
75
|
+
"@aztec/noir-protocol-circuits-types": "0.79.0",
|
|
76
|
+
"@aztec/protocol-contracts": "0.79.0",
|
|
77
|
+
"@aztec/stdlib": "0.79.0",
|
|
78
|
+
"@aztec/telemetry-client": "0.79.0",
|
|
79
79
|
"debug": "^4.3.4",
|
|
80
80
|
"lodash.groupby": "^4.6.0",
|
|
81
81
|
"lodash.omit": "^4.5.0",
|
|
82
82
|
"tsc-watch": "^6.0.0",
|
|
83
83
|
"tslib": "^2.5.0",
|
|
84
|
-
"viem": "2.
|
|
84
|
+
"viem": "2.23.7",
|
|
85
85
|
"ws": "^8.13.0"
|
|
86
86
|
},
|
|
87
87
|
"devDependencies": {
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -90,8 +90,8 @@ export class Archiver extends EventEmitter implements ArchiveSource, Traceable {
|
|
|
90
90
|
|
|
91
91
|
private store: ArchiverStoreHelper;
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
private l1BlockNumber: bigint | undefined;
|
|
94
|
+
private l1Timestamp: bigint | undefined;
|
|
95
95
|
|
|
96
96
|
public readonly tracer: Tracer;
|
|
97
97
|
|
|
@@ -270,11 +270,11 @@ export class Archiver extends EventEmitter implements ArchiveSource, Traceable {
|
|
|
270
270
|
// ********** Events that are processed per L1 block **********
|
|
271
271
|
await this.handleL1ToL2Messages(messagesSynchedTo, currentL1BlockNumber);
|
|
272
272
|
|
|
273
|
-
//
|
|
274
|
-
|
|
275
|
-
this.l1Timestamp
|
|
276
|
-
|
|
277
|
-
|
|
273
|
+
// Get L1 timestamp for the current block
|
|
274
|
+
const currentL1Timestamp =
|
|
275
|
+
!this.l1Timestamp || !this.l1BlockNumber || this.l1BlockNumber !== currentL1BlockNumber
|
|
276
|
+
? (await this.publicClient.getBlock({ blockNumber: currentL1BlockNumber })).timestamp
|
|
277
|
+
: this.l1Timestamp;
|
|
278
278
|
|
|
279
279
|
// ********** Events that are processed per L2 block **********
|
|
280
280
|
if (currentL1BlockNumber > blocksSynchedTo) {
|
|
@@ -285,11 +285,16 @@ export class Archiver extends EventEmitter implements ArchiveSource, Traceable {
|
|
|
285
285
|
// blocks from more than 2 epochs ago, so we want to make sure we have the latest view of
|
|
286
286
|
// the chain locally before we start unwinding stuff. This can be optimized by figuring out
|
|
287
287
|
// up to which point we're pruning, and then requesting L2 blocks up to that point only.
|
|
288
|
-
await this.handleEpochPrune(provenBlockNumber, currentL1BlockNumber);
|
|
289
|
-
|
|
288
|
+
await this.handleEpochPrune(provenBlockNumber, currentL1BlockNumber, currentL1Timestamp);
|
|
290
289
|
this.instrumentation.updateL1BlockHeight(currentL1BlockNumber);
|
|
291
290
|
}
|
|
292
291
|
|
|
292
|
+
// After syncing has completed, update the current l1 block number and timestamp,
|
|
293
|
+
// otherwise we risk announcing to the world that we've synced to a given point,
|
|
294
|
+
// but the corresponding blocks have not been processed (see #12631).
|
|
295
|
+
this.l1Timestamp = currentL1Timestamp;
|
|
296
|
+
this.l1BlockNumber = currentL1BlockNumber;
|
|
297
|
+
|
|
293
298
|
if (initialRun) {
|
|
294
299
|
this.log.info(`Initial archiver sync to L1 block ${currentL1BlockNumber} complete.`, {
|
|
295
300
|
l1BlockNumber: currentL1BlockNumber,
|
|
@@ -300,18 +305,19 @@ export class Archiver extends EventEmitter implements ArchiveSource, Traceable {
|
|
|
300
305
|
}
|
|
301
306
|
|
|
302
307
|
/** Queries the rollup contract on whether a prune can be executed on the immediatenext L1 block. */
|
|
303
|
-
private async canPrune(currentL1BlockNumber: bigint) {
|
|
304
|
-
const time = (
|
|
308
|
+
private async canPrune(currentL1BlockNumber: bigint, currentL1Timestamp: bigint) {
|
|
309
|
+
const time = (currentL1Timestamp ?? 0n) + BigInt(this.l1constants.ethereumSlotDuration);
|
|
305
310
|
return await this.rollup.read.canPruneAtTime([time], { blockNumber: currentL1BlockNumber });
|
|
306
311
|
}
|
|
307
312
|
|
|
308
313
|
/** Checks if there'd be a reorg for the next block submission and start pruning now. */
|
|
309
|
-
private async handleEpochPrune(provenBlockNumber: bigint, currentL1BlockNumber: bigint) {
|
|
314
|
+
private async handleEpochPrune(provenBlockNumber: bigint, currentL1BlockNumber: bigint, currentL1Timestamp: bigint) {
|
|
310
315
|
const localPendingBlockNumber = BigInt(await this.getBlockNumber());
|
|
311
|
-
const canPrune =
|
|
316
|
+
const canPrune =
|
|
317
|
+
localPendingBlockNumber > provenBlockNumber && (await this.canPrune(currentL1BlockNumber, currentL1Timestamp));
|
|
312
318
|
|
|
313
319
|
if (canPrune) {
|
|
314
|
-
const localPendingSlotNumber =
|
|
320
|
+
const localPendingSlotNumber = getSlotAtTimestamp(currentL1Timestamp, this.l1constants);
|
|
315
321
|
const localPendingEpochNumber = getEpochAtSlot(localPendingSlotNumber, this.l1constants);
|
|
316
322
|
|
|
317
323
|
// Emit an event for listening services to react to the chain prune
|