@aztec/archiver 5.0.0-rc.1 → 5.0.0-rc.2
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.d.ts +1 -1
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +11 -5
- package/dest/l1/data_retrieval.d.ts +1 -1
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/modules/contract_data_source_adapter.d.ts +2 -2
- package/dest/modules/contract_data_source_adapter.d.ts.map +1 -1
- package/dest/modules/contract_data_source_adapter.js +1 -9
- package/dest/modules/data_source_base.d.ts +2 -2
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +1 -10
- package/dest/modules/l1_synchronizer.d.ts +1 -1
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +62 -39
- package/dest/modules/validation.d.ts +21 -3
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +36 -11
- package/dest/store/block_store.d.ts +8 -9
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +11 -21
- package/dest/store/contract_class_store.d.ts +1 -1
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +12 -0
- package/dest/store/contract_instance_store.d.ts +1 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +11 -0
- package/dest/store/log_store.d.ts +1 -1
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +3 -3
- package/dest/store/log_store_codec.d.ts +9 -1
- package/dest/store/log_store_codec.d.ts.map +1 -1
- package/dest/store/log_store_codec.js +9 -0
- package/dest/test/mock_l1_to_l2_message_source.d.ts +1 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +1 -2
- package/dest/test/mock_l2_block_source.d.ts +1 -4
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +3 -22
- package/dest/test/mock_structs.d.ts +1 -1
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +2 -2
- package/package.json +13 -13
- package/src/archiver.ts +12 -8
- package/src/l1/data_retrieval.ts +2 -1
- package/src/modules/contract_data_source_adapter.ts +1 -10
- package/src/modules/data_source_base.ts +1 -12
- package/src/modules/l1_synchronizer.ts +91 -53
- package/src/modules/validation.ts +72 -13
- package/src/store/block_store.ts +11 -26
- package/src/store/contract_class_store.ts +12 -0
- package/src/store/contract_instance_store.ts +11 -0
- package/src/store/log_store.ts +3 -2
- package/src/store/log_store_codec.ts +11 -0
- package/src/test/mock_l1_to_l2_message_source.ts +0 -1
- package/src/test/mock_l2_block_source.ts +1 -22
- package/src/test/mock_structs.ts +5 -2
|
@@ -20,7 +20,6 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
20
20
|
provenBlockNumber = 0;
|
|
21
21
|
finalizedBlockNumber = 0;
|
|
22
22
|
checkpointedBlockNumber = 0;
|
|
23
|
-
proposedCheckpointBlockNumber = 0;
|
|
24
23
|
initialHeader = BlockHeader.empty();
|
|
25
24
|
initialHeaderHash = GENESIS_BLOCK_HEADER_HASH;
|
|
26
25
|
genesisArchiveRoot;
|
|
@@ -98,7 +97,6 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
98
97
|
});
|
|
99
98
|
// Keep tip numbers consistent with remaining blocks.
|
|
100
99
|
this.checkpointedBlockNumber = Math.min(this.checkpointedBlockNumber, maxBlockNum);
|
|
101
|
-
this.proposedCheckpointBlockNumber = Math.min(this.proposedCheckpointBlockNumber, maxBlockNum);
|
|
102
100
|
this.provenBlockNumber = Math.min(this.provenBlockNumber, maxBlockNum);
|
|
103
101
|
this.finalizedBlockNumber = Math.min(this.finalizedBlockNumber, maxBlockNum);
|
|
104
102
|
this.log.verbose(`Removed ${numBlocks} blocks from the mock L2 block source`);
|
|
@@ -112,16 +110,9 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
112
110
|
}
|
|
113
111
|
this.finalizedBlockNumber = finalizedBlockNumber;
|
|
114
112
|
}
|
|
115
|
-
setProposedCheckpointBlockNumber(blockNumber) {
|
|
116
|
-
this.proposedCheckpointBlockNumber = blockNumber;
|
|
117
|
-
}
|
|
118
113
|
setCheckpointedBlockNumber(checkpointedBlockNumber) {
|
|
119
114
|
const prevCheckpointed = this.checkpointedBlockNumber;
|
|
120
115
|
this.checkpointedBlockNumber = checkpointedBlockNumber;
|
|
121
|
-
// Proposed checkpoint is always at least as advanced as checkpointed
|
|
122
|
-
if (this.proposedCheckpointBlockNumber < checkpointedBlockNumber) {
|
|
123
|
-
this.proposedCheckpointBlockNumber = checkpointedBlockNumber;
|
|
124
|
-
}
|
|
125
116
|
// Auto-create single-block checkpoints for newly checkpointed blocks that don't have one yet.
|
|
126
117
|
// This handles blocks added via addProposedBlocks that are now being marked as checkpointed.
|
|
127
118
|
const newCheckpoints = [];
|
|
@@ -172,9 +163,6 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
172
163
|
const block = await this.getBlock(query);
|
|
173
164
|
return block ? block.header.globalVariables.blockNumber : undefined;
|
|
174
165
|
}
|
|
175
|
-
getProposedCheckpointL2BlockNumber() {
|
|
176
|
-
return Promise.resolve(BlockNumber(this.proposedCheckpointBlockNumber));
|
|
177
|
-
}
|
|
178
166
|
getCheckpoint(query) {
|
|
179
167
|
const checkpoint = this.resolveCheckpointQuery(query);
|
|
180
168
|
if (!checkpoint) {
|
|
@@ -272,18 +260,16 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
272
260
|
return Promise.resolve(undefined);
|
|
273
261
|
}
|
|
274
262
|
async getL2Tips() {
|
|
275
|
-
const [latest, proven, finalized, checkpointed
|
|
263
|
+
const [latest, proven, finalized, checkpointed] = [
|
|
276
264
|
await this.getBlockNumber(),
|
|
277
265
|
this.provenBlockNumber,
|
|
278
266
|
this.finalizedBlockNumber,
|
|
279
|
-
this.checkpointedBlockNumber
|
|
280
|
-
await this.getProposedCheckpointL2BlockNumber()
|
|
267
|
+
this.checkpointedBlockNumber
|
|
281
268
|
];
|
|
282
269
|
const latestBlock = this.l2Blocks[latest - 1];
|
|
283
270
|
const provenBlock = this.l2Blocks[proven - 1];
|
|
284
271
|
const finalizedBlock = this.l2Blocks[finalized - 1];
|
|
285
272
|
const checkpointedBlock = this.l2Blocks[checkpointed - 1];
|
|
286
|
-
const proposedCheckpointBlock = this.l2Blocks[proposedCheckpoint - 1];
|
|
287
273
|
// For genesis tips (block number 0) report the dynamic initial header hash so consumers
|
|
288
274
|
// running L2BlockStream against this mock agree at block 0 with their local tip store.
|
|
289
275
|
const genesisHash = (await this.initialHeader.hash()).toString();
|
|
@@ -309,10 +295,6 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
309
295
|
number: BlockNumber(checkpointed),
|
|
310
296
|
hash: await tipHash(checkpointedBlock, checkpointed)
|
|
311
297
|
};
|
|
312
|
-
const proposedCheckpointBlockId = {
|
|
313
|
-
number: BlockNumber(proposedCheckpoint),
|
|
314
|
-
hash: await tipHash(proposedCheckpointBlock, proposedCheckpoint)
|
|
315
|
-
};
|
|
316
298
|
const makeTipId = (blockId)=>{
|
|
317
299
|
const checkpointNumber = this.findCheckpointNumberForBlock(blockId.number) ?? CheckpointNumber(0);
|
|
318
300
|
// Match production semantics: checkpoint 0 is fully synthetic (no real checkpoint header
|
|
@@ -331,8 +313,7 @@ import { BlockHeader } from '@aztec/stdlib/tx';
|
|
|
331
313
|
proposed: latestBlockId,
|
|
332
314
|
checkpointed: makeTipId(checkpointedBlockId),
|
|
333
315
|
proven: makeTipId(provenBlockId),
|
|
334
|
-
finalized: makeTipId(finalizedBlockId)
|
|
335
|
-
proposedCheckpoint: makeTipId(proposedCheckpointBlockId)
|
|
316
|
+
finalized: makeTipId(finalizedBlockId)
|
|
336
317
|
};
|
|
337
318
|
}
|
|
338
319
|
getSyncedL2EpochNumber() {
|
|
@@ -85,4 +85,4 @@ export interface MockCheckpointWithLogsOptions {
|
|
|
85
85
|
}
|
|
86
86
|
/** Creates a checkpoint with specified logs on each tx effect. */
|
|
87
87
|
export declare function makeCheckpointWithLogs(blockNumber: number, options?: MockCheckpointWithLogsOptions): Promise<PublishedCheckpoint>;
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19zdHJ1Y3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9tb2NrX3N0cnVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFlLGdCQUFnQixFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFLM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUF5QixjQUFjLEVBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUVuRixPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQXFCLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsd0JBQWdCLGdCQUFnQixDQUM5QixtQkFBbUIsV0FBZ0IsRUFDbkMsU0FBUyxHQUFFLE9BQU8sQ0FBQyxZQUFZLENBQU0sR0FDcEMsWUFBWSxDQWdCZDtBQUVELHdCQUFnQixpQkFBaUIsQ0FDL0IsVUFBVSxFQUFFLE1BQU0sRUFDbEIsSUFBSSxHQUFFO0lBQ0osV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3ZCLHVCQUF1QixDQUFDLEVBQUUsZ0JBQWdCLENBQUM7SUFDM0MscUJBQXFCLENBQUMsRUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"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"}
|
|
@@ -147,13 +147,13 @@ export function makeInboxMessages(totalCount, opts = {}) {
|
|
|
147
147
|
/** Creates a deterministic Tag for public log testing. */ export function makePublicLogTag(blockNumber, txIndex, logIndex) {
|
|
148
148
|
return new Tag(blockNumber === 1 && txIndex === 0 && logIndex === 0 ? Fr.ZERO : new Fr((blockNumber * 100 + txIndex * 10 + logIndex) * 123));
|
|
149
149
|
}
|
|
150
|
-
/** Creates a PublicLog with fields derived from the tag. */ export function makePublicLog(tag, contractAddress = AztecAddress.
|
|
150
|
+
/** Creates a PublicLog with fields derived from the tag. */ export function makePublicLog(tag, contractAddress = AztecAddress.fromNumberUnsafe(543254)) {
|
|
151
151
|
return PublicLog.from({
|
|
152
152
|
contractAddress,
|
|
153
153
|
fields: new Array(10).fill(null).map((_, i)=>!i ? tag.value : new Fr(tag.value.toBigInt() + BigInt(i)))
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
|
-
/** Creates multiple public logs for a transaction. */ export function makePublicLogs(blockNumber, txIndex, numLogsPerTx, contractAddress = AztecAddress.
|
|
156
|
+
/** Creates multiple public logs for a transaction. */ export function makePublicLogs(blockNumber, txIndex, numLogsPerTx, contractAddress = AztecAddress.fromNumberUnsafe(543254)) {
|
|
157
157
|
return times(numLogsPerTx, (logIndex)=>{
|
|
158
158
|
const tag = makePublicLogTag(blockNumber, txIndex, logIndex);
|
|
159
159
|
return makePublicLog(tag, contractAddress);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "5.0.0-rc.
|
|
3
|
+
"version": "5.0.0-rc.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -65,18 +65,18 @@
|
|
|
65
65
|
]
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@aztec/blob-client": "5.0.0-rc.
|
|
69
|
-
"@aztec/blob-lib": "5.0.0-rc.
|
|
70
|
-
"@aztec/constants": "5.0.0-rc.
|
|
71
|
-
"@aztec/epoch-cache": "5.0.0-rc.
|
|
72
|
-
"@aztec/ethereum": "5.0.0-rc.
|
|
73
|
-
"@aztec/foundation": "5.0.0-rc.
|
|
74
|
-
"@aztec/kv-store": "5.0.0-rc.
|
|
75
|
-
"@aztec/l1-artifacts": "5.0.0-rc.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "5.0.0-rc.
|
|
77
|
-
"@aztec/protocol-contracts": "5.0.0-rc.
|
|
78
|
-
"@aztec/stdlib": "5.0.0-rc.
|
|
79
|
-
"@aztec/telemetry-client": "5.0.0-rc.
|
|
68
|
+
"@aztec/blob-client": "5.0.0-rc.2",
|
|
69
|
+
"@aztec/blob-lib": "5.0.0-rc.2",
|
|
70
|
+
"@aztec/constants": "5.0.0-rc.2",
|
|
71
|
+
"@aztec/epoch-cache": "5.0.0-rc.2",
|
|
72
|
+
"@aztec/ethereum": "5.0.0-rc.2",
|
|
73
|
+
"@aztec/foundation": "5.0.0-rc.2",
|
|
74
|
+
"@aztec/kv-store": "5.0.0-rc.2",
|
|
75
|
+
"@aztec/l1-artifacts": "5.0.0-rc.2",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "5.0.0-rc.2",
|
|
77
|
+
"@aztec/protocol-contracts": "5.0.0-rc.2",
|
|
78
|
+
"@aztec/stdlib": "5.0.0-rc.2",
|
|
79
|
+
"@aztec/telemetry-client": "5.0.0-rc.2",
|
|
80
80
|
"lodash.groupby": "^4.6.0",
|
|
81
81
|
"lodash.omit": "^4.5.0",
|
|
82
82
|
"tslib": "^2.5.0",
|
package/src/archiver.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses'
|
|
|
5
5
|
import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
|
|
6
6
|
import { BlockNumber, CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
7
7
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
8
|
-
import { merge
|
|
8
|
+
import { merge } from '@aztec/foundation/collection';
|
|
9
9
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
10
10
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
11
11
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
@@ -435,19 +435,23 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
435
435
|
const tips = await this.getL2Tips();
|
|
436
436
|
const now = BigInt(this.dateProvider.nowInSeconds());
|
|
437
437
|
|
|
438
|
+
// Frontier block covered by a proposed (or, falling back, confirmed) checkpoint. Blocks beyond it
|
|
439
|
+
// have no enclosing checkpoint proposal and are the orphan-pruning candidates.
|
|
440
|
+
const proposedCheckpointBlockNumber = await this.stores.blocks.getProposedCheckpointL2BlockNumber();
|
|
441
|
+
|
|
438
442
|
// The proposed tip is a proposed-checkpointed block, so there are no orphan proposed blocks to prune
|
|
439
|
-
if (
|
|
440
|
-
this.log.trace(
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
);
|
|
443
|
+
if (proposedCheckpointBlockNumber === tips.proposed.number) {
|
|
444
|
+
this.log.trace(`No orphan proposed blocks to prune: proposed tip ${tips.proposed.number} is checkpointed`, {
|
|
445
|
+
proposed: tips.proposed,
|
|
446
|
+
proposedCheckpointBlockNumber,
|
|
447
|
+
});
|
|
444
448
|
return;
|
|
445
449
|
}
|
|
446
450
|
|
|
447
451
|
// Load the blocks that are candidates for pruning (ie blocks without a proposed checkpoint covering them)
|
|
448
452
|
const blocksWithoutProposedCheckpoint = await this.stores.blocks.getBlocksData({
|
|
449
|
-
from: BlockNumber(
|
|
450
|
-
limit: tips.proposed.number -
|
|
453
|
+
from: BlockNumber(proposedCheckpointBlockNumber + 1),
|
|
454
|
+
limit: tips.proposed.number - proposedCheckpointBlockNumber,
|
|
451
455
|
});
|
|
452
456
|
|
|
453
457
|
// Iterate through them in order, the first one with a slot that should have received a proposed checkpoint
|
package/src/l1/data_retrieval.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type {
|
|
|
12
12
|
InboxContract,
|
|
13
13
|
MessageSentLog,
|
|
14
14
|
RollupContract,
|
|
15
|
+
ViemHeader,
|
|
15
16
|
} from '@aztec/ethereum/contracts';
|
|
16
17
|
import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
|
|
17
18
|
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
@@ -460,7 +461,7 @@ export async function getProofFromSubmitProofTx(
|
|
|
460
461
|
start: bigint;
|
|
461
462
|
end: bigint;
|
|
462
463
|
args: EpochProofPublicInputArgs;
|
|
463
|
-
|
|
464
|
+
headers: readonly ViemHeader[];
|
|
464
465
|
proof: Hex;
|
|
465
466
|
},
|
|
466
467
|
];
|
|
@@ -28,16 +28,7 @@ export class ArchiverContractDataSourceAdapter implements ContractDataSource {
|
|
|
28
28
|
return this.stores.contractClasses.getBytecodeCommitment(id);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
public
|
|
32
|
-
address: AztecAddress,
|
|
33
|
-
maybeTimestamp?: UInt64,
|
|
34
|
-
): Promise<ContractInstanceWithAddress | undefined> {
|
|
35
|
-
let timestamp = maybeTimestamp;
|
|
36
|
-
if (timestamp === undefined) {
|
|
37
|
-
const latest = await this.stores.blocks.getLatestL2BlockNumber();
|
|
38
|
-
const blockData = latest > 0 ? await this.stores.blocks.getBlockData({ number: latest }) : undefined;
|
|
39
|
-
timestamp = blockData ? blockData.header.globalVariables.timestamp : 0n;
|
|
40
|
-
}
|
|
31
|
+
public getContract(address: AztecAddress, timestamp: UInt64): Promise<ContractInstanceWithAddress | undefined> {
|
|
41
32
|
return this.stores.contractInstances.getContractInstance(address, timestamp);
|
|
42
33
|
}
|
|
43
34
|
|
|
@@ -316,18 +316,7 @@ export abstract class ArchiverDataSourceBase
|
|
|
316
316
|
return this.stores.contractClasses.getBytecodeCommitment(id);
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
-
public
|
|
320
|
-
address: AztecAddress,
|
|
321
|
-
maybeTimestamp?: UInt64,
|
|
322
|
-
): Promise<ContractInstanceWithAddress | undefined> {
|
|
323
|
-
let timestamp;
|
|
324
|
-
if (maybeTimestamp === undefined) {
|
|
325
|
-
const latestBlockData = await this.getBlockData({ tag: 'proposed' });
|
|
326
|
-
timestamp = latestBlockData ? latestBlockData.header.globalVariables.timestamp : 0n;
|
|
327
|
-
} else {
|
|
328
|
-
timestamp = maybeTimestamp;
|
|
329
|
-
}
|
|
330
|
-
|
|
319
|
+
public getContract(address: AztecAddress, timestamp: UInt64): Promise<ContractInstanceWithAddress | undefined> {
|
|
331
320
|
return this.stores.contractInstances.getContractInstance(address, timestamp);
|
|
332
321
|
}
|
|
333
322
|
|
|
@@ -17,7 +17,13 @@ import { count } from '@aztec/foundation/string';
|
|
|
17
17
|
import { DateProvider, Timer, elapsed } from '@aztec/foundation/timer';
|
|
18
18
|
import { isDefined, isErrorClass } from '@aztec/foundation/types';
|
|
19
19
|
import { type ArchiverEmitter, L2BlockSourceEvents, type ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
Checkpoint,
|
|
22
|
+
type CheckpointData,
|
|
23
|
+
type CheckpointInfo,
|
|
24
|
+
type L1PublishedData,
|
|
25
|
+
PublishedCheckpoint,
|
|
26
|
+
} from '@aztec/stdlib/checkpoint';
|
|
21
27
|
import { type L1RollupConstants, getEpochAtSlot, getSlotAtNextL1Block } from '@aztec/stdlib/epoch-helpers';
|
|
22
28
|
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
23
29
|
import type { CoordinationSignatureContext } from '@aztec/stdlib/p2p';
|
|
@@ -39,7 +45,7 @@ import { MessageStoreError } from '../store/message_store.js';
|
|
|
39
45
|
import type { InboxMessage } from '../structs/inbox_message.js';
|
|
40
46
|
import { ArchiverDataStoreUpdater } from './data_store_updater.js';
|
|
41
47
|
import type { ArchiverInstrumentation } from './instrumentation.js';
|
|
42
|
-
import {
|
|
48
|
+
import { validateCheckpointAttestationsFromCalldata } from './validation.js';
|
|
43
49
|
|
|
44
50
|
type RollupStatus = {
|
|
45
51
|
provenCheckpointNumber: CheckpointNumber;
|
|
@@ -50,7 +56,7 @@ type RollupStatus = {
|
|
|
50
56
|
/** Last valid checkpoint observed on L1 and synced on this iteration */
|
|
51
57
|
lastRetrievedCheckpoint?: PublishedCheckpoint;
|
|
52
58
|
/** Last checkpoint observed on L1 across both valid and rejected entries on this iteration */
|
|
53
|
-
lastSeenCheckpoint?:
|
|
59
|
+
lastSeenCheckpoint?: { checkpointNumber: CheckpointNumber; l1: L1PublishedData };
|
|
54
60
|
};
|
|
55
61
|
|
|
56
62
|
/**
|
|
@@ -790,7 +796,7 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
790
796
|
let searchStartBlock: bigint = blocksSynchedTo;
|
|
791
797
|
let searchEndBlock: bigint = blocksSynchedTo;
|
|
792
798
|
let lastRetrievedCheckpoint: PublishedCheckpoint | undefined;
|
|
793
|
-
let lastSeenCheckpoint:
|
|
799
|
+
let lastSeenCheckpoint: { checkpointNumber: CheckpointNumber; l1: L1PublishedData } | undefined;
|
|
794
800
|
|
|
795
801
|
do {
|
|
796
802
|
[searchStartBlock, searchEndBlock] = this.nextRange(searchEndBlock, currentL1BlockNumber);
|
|
@@ -835,37 +841,21 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
835
841
|
const evictProposedFrom =
|
|
836
842
|
promoteResult && 'diverged' in promoteResult ? promoteResult.fromCheckpointNumber : undefined;
|
|
837
843
|
|
|
838
|
-
//
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
this.blobClient,
|
|
845
|
-
checkpoint.l1.blockHash,
|
|
846
|
-
checkpoint.blobHashes,
|
|
847
|
-
checkpoint.checkpointNumber,
|
|
848
|
-
this.log,
|
|
849
|
-
!initialSyncComplete,
|
|
850
|
-
checkpoint.parentBeaconBlockRoot,
|
|
851
|
-
checkpoint.l1.timestamp,
|
|
852
|
-
),
|
|
853
|
-
}),
|
|
854
|
-
);
|
|
844
|
+
// Validate attestations from CALLDATA before fetching any blobs. A checkpoint with invalid
|
|
845
|
+
// attestations (or one descending from a rejected ancestor) is rejected here without fetching its
|
|
846
|
+
// blobs, so a malformed blob does not throw during decode before the rejection path runs and
|
|
847
|
+
// stall sync. The signed consensus payload (header, archive root, fee asset price
|
|
848
|
+
// modifier) is fully available from calldata.
|
|
849
|
+
const checkpointsToIngest: RetrievedCheckpointFromCalldata[] = [];
|
|
855
850
|
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
const validCheckpoints: PublishedCheckpoint[] = [];
|
|
859
|
-
|
|
860
|
-
// Now loop through all checkpoints and validate their attestations
|
|
861
|
-
for (const published of publishedCheckpoints) {
|
|
862
|
-
// Check the attestations uploaded by the publisher to L1 are correct
|
|
851
|
+
for (const calldataCheckpoint of calldataCheckpoints) {
|
|
852
|
+
// Check the attestations uploaded by the publisher to L1 are correct.
|
|
863
853
|
// Rollup contract does not validate attestations to save on gas, so this
|
|
864
854
|
// falls on the nodes to verify offchain and skip those checkpoints.
|
|
865
855
|
const validationResult = this.config.skipValidateCheckpointAttestations
|
|
866
856
|
? { valid: true as const }
|
|
867
|
-
: await
|
|
868
|
-
|
|
857
|
+
: await validateCheckpointAttestationsFromCalldata(
|
|
858
|
+
calldataCheckpoint,
|
|
869
859
|
this.epochCache,
|
|
870
860
|
this.l1Constants,
|
|
871
861
|
this.getSignatureContext(),
|
|
@@ -877,7 +867,7 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
877
867
|
// ancestor was skipped earlier (e.g. due to invalid attestations), the catch handler
|
|
878
868
|
// would roll back the L1 sync point, and the next iteration would re-fetch and re-throw.
|
|
879
869
|
const rejectedAncestor = await this.stores.blocks.getRejectedCheckpointByArchiveRoot(
|
|
880
|
-
|
|
870
|
+
calldataCheckpoint.header.lastArchiveRoot,
|
|
881
871
|
);
|
|
882
872
|
|
|
883
873
|
// Update the validation result if it has changed, so we can keep track of the first invalid checkpoint
|
|
@@ -899,9 +889,9 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
899
889
|
}
|
|
900
890
|
|
|
901
891
|
if (!validationResult.valid) {
|
|
902
|
-
this.log.warn(`Skipping checkpoint ${
|
|
903
|
-
|
|
904
|
-
l1BlockNumber:
|
|
892
|
+
this.log.warn(`Skipping checkpoint ${calldataCheckpoint.checkpointNumber} due to invalid attestations`, {
|
|
893
|
+
checkpointNumber: calldataCheckpoint.checkpointNumber,
|
|
894
|
+
l1BlockNumber: calldataCheckpoint.l1.blockNumber,
|
|
905
895
|
...pick(validationResult, 'reason'),
|
|
906
896
|
});
|
|
907
897
|
|
|
@@ -915,11 +905,11 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
915
905
|
// is detected and skipped (rather than tripping the addCheckpoints consecutive-number
|
|
916
906
|
// check and causing the sync point to roll back in a loop).
|
|
917
907
|
await this.stores.blocks.addRejectedCheckpoint({
|
|
918
|
-
checkpointNumber:
|
|
919
|
-
archiveRoot:
|
|
920
|
-
parentArchiveRoot:
|
|
921
|
-
slotNumber:
|
|
922
|
-
l1:
|
|
908
|
+
checkpointNumber: calldataCheckpoint.checkpointNumber,
|
|
909
|
+
archiveRoot: calldataCheckpoint.archiveRoot,
|
|
910
|
+
parentArchiveRoot: calldataCheckpoint.header.lastArchiveRoot,
|
|
911
|
+
slotNumber: calldataCheckpoint.header.slotNumber,
|
|
912
|
+
l1: calldataCheckpoint.l1,
|
|
923
913
|
reason: 'invalid-attestations' as const,
|
|
924
914
|
});
|
|
925
915
|
|
|
@@ -927,15 +917,20 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
927
917
|
}
|
|
928
918
|
|
|
929
919
|
if (rejectedAncestor) {
|
|
930
|
-
const descendantInfo =
|
|
920
|
+
const descendantInfo: CheckpointInfo = {
|
|
921
|
+
archive: calldataCheckpoint.archiveRoot,
|
|
922
|
+
lastArchive: calldataCheckpoint.header.lastArchiveRoot,
|
|
923
|
+
slotNumber: calldataCheckpoint.header.slotNumber,
|
|
924
|
+
checkpointNumber: calldataCheckpoint.checkpointNumber,
|
|
925
|
+
timestamp: calldataCheckpoint.header.timestamp,
|
|
926
|
+
};
|
|
931
927
|
this.log.warn(
|
|
932
|
-
`Skipping checkpoint ${
|
|
928
|
+
`Skipping checkpoint ${calldataCheckpoint.checkpointNumber} as it is a descendant of ` +
|
|
933
929
|
`rejected checkpoint ${rejectedAncestor.checkpointNumber} (${rejectedAncestor.reason})`,
|
|
934
930
|
{
|
|
935
|
-
checkpointNumber:
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
l1BlockHash: published.l1.blockHash,
|
|
931
|
+
checkpointNumber: calldataCheckpoint.checkpointNumber,
|
|
932
|
+
l1BlockNumber: calldataCheckpoint.l1.blockNumber,
|
|
933
|
+
l1BlockHash: calldataCheckpoint.l1.blockHash,
|
|
939
934
|
ancestorCheckpointNumber: rejectedAncestor.checkpointNumber,
|
|
940
935
|
ancestorArchiveRoot: rejectedAncestor.archiveRoot.toString(),
|
|
941
936
|
ancestorReason: rejectedAncestor.reason,
|
|
@@ -952,17 +947,54 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
952
947
|
// Persist this chainpoint as rejected as well, so we can construct a chain of
|
|
953
948
|
// skipped checkpoints starting from the first one with invalid attestations.
|
|
954
949
|
await this.stores.blocks.addRejectedCheckpoint({
|
|
955
|
-
checkpointNumber:
|
|
956
|
-
archiveRoot:
|
|
957
|
-
parentArchiveRoot:
|
|
958
|
-
slotNumber:
|
|
959
|
-
l1:
|
|
950
|
+
checkpointNumber: calldataCheckpoint.checkpointNumber,
|
|
951
|
+
archiveRoot: calldataCheckpoint.archiveRoot,
|
|
952
|
+
parentArchiveRoot: calldataCheckpoint.header.lastArchiveRoot,
|
|
953
|
+
slotNumber: calldataCheckpoint.header.slotNumber,
|
|
954
|
+
l1: calldataCheckpoint.l1,
|
|
960
955
|
reason: 'descends-from-invalid-attestations' as const,
|
|
961
956
|
});
|
|
962
957
|
|
|
963
958
|
continue;
|
|
964
959
|
}
|
|
965
960
|
|
|
961
|
+
checkpointsToIngest.push(calldataCheckpoint);
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
// Fetch blobs in parallel only for the surviving (attestation-valid, non-descendant) checkpoints,
|
|
965
|
+
// then build the full published checkpoints. The last calldata checkpoint may be promotable from a
|
|
966
|
+
// local proposed block (checkpointToPromote), in which case it carries no blob to fetch. A missing or
|
|
967
|
+
// undecodable blob throws and propagates, rolling back the L1 sync point so the fetch is retried.
|
|
968
|
+
const toFetchBlobs = checkpointToPromote
|
|
969
|
+
? checkpointsToIngest.filter(c => c.checkpointNumber !== checkpointToPromote.checkpoint.number)
|
|
970
|
+
: checkpointsToIngest;
|
|
971
|
+
const blobFetched = await asyncPool(10, toFetchBlobs, async checkpoint =>
|
|
972
|
+
retrievedToPublishedCheckpoint({
|
|
973
|
+
...checkpoint,
|
|
974
|
+
checkpointBlobData: await getCheckpointBlobDataFromBlobs(
|
|
975
|
+
this.blobClient,
|
|
976
|
+
checkpoint.l1.blockHash,
|
|
977
|
+
checkpoint.blobHashes,
|
|
978
|
+
checkpoint.checkpointNumber,
|
|
979
|
+
this.log,
|
|
980
|
+
!initialSyncComplete,
|
|
981
|
+
checkpoint.parentBeaconBlockRoot,
|
|
982
|
+
checkpoint.l1.timestamp,
|
|
983
|
+
),
|
|
984
|
+
}),
|
|
985
|
+
);
|
|
986
|
+
|
|
987
|
+
// Index the built checkpoints by number so we can ingest them in calldata order, slotting in the
|
|
988
|
+
// promoted checkpoint (built from a local proposed block rather than blobs).
|
|
989
|
+
const publishedByNumber = new Map(blobFetched.map(published => [published.checkpoint.number, published]));
|
|
990
|
+
if (checkpointToPromote) {
|
|
991
|
+
publishedByNumber.set(checkpointToPromote.checkpoint.number, checkpointToPromote);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
const validCheckpoints: PublishedCheckpoint[] = [];
|
|
995
|
+
for (const calldataCheckpoint of checkpointsToIngest) {
|
|
996
|
+
const published = publishedByNumber.get(calldataCheckpoint.checkpointNumber)!;
|
|
997
|
+
|
|
966
998
|
// Check the inHash of the checkpoint against the l1->l2 messages.
|
|
967
999
|
// The messages should've been synced up to the currentL1BlockNumber and must be available for the published
|
|
968
1000
|
// checkpoints we just retrieved.
|
|
@@ -1095,7 +1127,9 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
1095
1127
|
});
|
|
1096
1128
|
}
|
|
1097
1129
|
lastRetrievedCheckpoint = validCheckpoints.at(-1) ?? lastRetrievedCheckpoint;
|
|
1098
|
-
|
|
1130
|
+
// The last checkpoint seen on L1 this batch (valid or rejected), tracked from calldata since
|
|
1131
|
+
// rejected checkpoints are no longer built into PublishedCheckpoints.
|
|
1132
|
+
lastSeenCheckpoint = lastCalldataCheckpoint;
|
|
1099
1133
|
} while (searchEndBlock < currentL1BlockNumber);
|
|
1100
1134
|
|
|
1101
1135
|
// Important that we update AFTER inserting the blocks.
|
|
@@ -1205,7 +1239,7 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
1205
1239
|
// Compare the last checkpoint (valid or not) we have (either retrieved in this round or loaded from store)
|
|
1206
1240
|
// with what the rollup contract told us was the latest one (pinned at the currentL1BlockNumber).
|
|
1207
1241
|
const latestLocalCheckpointNumber =
|
|
1208
|
-
lastSeenCheckpoint?.
|
|
1242
|
+
lastSeenCheckpoint?.checkpointNumber ??
|
|
1209
1243
|
CheckpointNumber.max(
|
|
1210
1244
|
await this.stores.blocks.getLatestCheckpointNumber(),
|
|
1211
1245
|
await this.stores.blocks.getLatestRejectedCheckpointNumber(),
|
|
@@ -1218,7 +1252,11 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
1218
1252
|
// We suspect an L1 reorg that added checkpoints *behind* us. If that is the case, it must have happened between
|
|
1219
1253
|
// the last checkpoint we saw and the current one, so we reset the last synched L1 block number. In the edge case
|
|
1220
1254
|
// we don't have one, we go back 2 L1 epochs, which is the deepest possible reorg (assuming Casper is working).
|
|
1221
|
-
const latestLocalCheckpoint:
|
|
1255
|
+
const latestLocalCheckpoint:
|
|
1256
|
+
| { checkpointNumber: CheckpointNumber; l1: L1PublishedData }
|
|
1257
|
+
| CheckpointData
|
|
1258
|
+
| RejectedCheckpoint
|
|
1259
|
+
| undefined =
|
|
1222
1260
|
lastSeenCheckpoint ??
|
|
1223
1261
|
(await this.stores.blocks.getCheckpointData(latestLocalCheckpointNumber)) ??
|
|
1224
1262
|
(await this.stores.blocks.getRejectedCheckpointByNumber(latestLocalCheckpointNumber));
|