@aztec/archiver 3.0.0-canary.a9708bd → 3.0.0-devnet.3
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 +27 -6
- package/dest/archiver/archiver.d.ts +20 -4
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +85 -29
- package/dest/archiver/archiver_store.d.ts +25 -1
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +196 -8
- package/dest/archiver/config.d.ts +4 -22
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +6 -11
- package/dest/archiver/data_retrieval.d.ts +7 -6
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +32 -24
- package/dest/archiver/instrumentation.d.ts.map +1 -1
- package/dest/archiver/instrumentation.js +3 -0
- package/dest/archiver/kv_archiver_store/block_store.d.ts +36 -1
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +92 -6
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +7 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +19 -0
- package/dest/archiver/validation.d.ts.map +1 -1
- package/dest/archiver/validation.js +45 -31
- package/dest/factory.d.ts +0 -6
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +2 -15
- package/dest/test/mock_l2_block_source.d.ts +10 -11
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +58 -5
- package/package.json +14 -14
- package/src/archiver/archiver.ts +91 -30
- package/src/archiver/archiver_store.ts +31 -1
- package/src/archiver/archiver_store_test_suite.ts +224 -21
- package/src/archiver/config.ts +14 -45
- package/src/archiver/data_retrieval.ts +42 -32
- package/src/archiver/instrumentation.ts +3 -0
- package/src/archiver/kv_archiver_store/block_store.ts +123 -6
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +25 -1
- package/src/archiver/validation.ts +46 -17
- package/src/factory.ts +2 -21
- package/src/test/mock_l2_block_source.ts +80 -14
package/README.md
CHANGED
|
@@ -1,16 +1,37 @@
|
|
|
1
1
|
# Archiver
|
|
2
2
|
|
|
3
|
-
Archiver is a service which is used to fetch data
|
|
4
|
-
|
|
3
|
+
Archiver is a service which is used to fetch data onchain data and present them in a nice-to-consume form.
|
|
4
|
+
|
|
5
|
+
The onchain data specifically are the following events:
|
|
5
6
|
|
|
6
7
|
1. `L2BlockProposed` event emitted on Rollup contract,
|
|
7
8
|
2. `MessageAdded` event emitted on Inbox contract,
|
|
8
9
|
|
|
9
10
|
The interfaces defining how the data can be consumed from the archiver are `L2BlockSource`, `L2LogsSource` and `ContractDataSource`.
|
|
10
11
|
|
|
11
|
-
##
|
|
12
|
+
## Sync process
|
|
13
|
+
|
|
14
|
+
The archiver sync process periodically checks its current state against the Rollup contract on L1 and updates its local state.
|
|
15
|
+
|
|
16
|
+
### Handling invalid blocks
|
|
17
|
+
|
|
18
|
+
After the implementation of [delayed attestation verification](https://github.com/AztecProtocol/engineering-designs/pull/69), the Rollup contract on L1 no longer validates committee attestations. Instead, these are posted in calldata, and L2 nodes are expected to verify them as they download blocks. The archiver handles this validation during its sync process.
|
|
19
|
+
|
|
20
|
+
Whenever the archiver detects a block with invalid attestations, it skips it. These blocks are not meant to be part of the chain, so the archiver ignores them and continues processing the next blocks. It is expected that an honest proposer will eventually invalidate these blocks, removing them from the chain on L1, and then resume the sequence of valid blocks.
|
|
21
|
+
|
|
22
|
+
> [!WARNING]
|
|
23
|
+
> If the committee for the epoch is also malicious and attests to a descendant of an invalid block, nodes should also ignore these descendants, unless they become proven. This is currently not implemented. Nodes assume that the majority of the committee is honest.
|
|
24
|
+
|
|
25
|
+
When the current node is elected as proposer, the `sequencer` needs to know whether there is an invalid block in L1 that needs to be purged before posting their own block. To support this, the archiver exposes a `pendingChainValidationStatus`, which is the state of the tip of the pending chain. This status can be valid in the happy path, or invalid if the tip of the pending chain has invalid attestations. If invalid, this status also contains all the data needed for purging the block from L1 via an `invalidate` call to the Rollup contract. Note that, if the head of the chain has more than one invalid consecutive block, this status will reference the earliest one that needs to be purged, since a call to purge an invalid block will automatically purge all descendants. Refer to the [InvalidateLib.sol](`l1-contracts/src/core/libraries/rollup/InvalidateLib.sol`) for more info.
|
|
26
|
+
|
|
27
|
+
> [!TIP]
|
|
28
|
+
> The archiver can be configured to `skipValidateBlockAttestations`, which will make it skip this validation. This cannot be set via environment variables, only via a call to `nodeAdmin_setConfig`. This setting is only meant for testing purposes.
|
|
12
29
|
|
|
13
|
-
|
|
14
|
-
|
|
30
|
+
As an example, let's say the chain has been progressing normally up until block 10, and then:
|
|
31
|
+
1. Block 11 is posted with invalid attestations. The archiver will report 10 as the latest block, but the `pendingChainValidationStatus` will point to block 11.
|
|
32
|
+
2. Block 11 is purged, but another block 11 with invalid attestations is posted in its place. The archiver will still report 10 as latest, and the `pendingChainValidationStatus` will point to the new block 11 that needs to be purged.
|
|
33
|
+
3. Block 12 with invalid attestations is posted. No changes in the archiver.
|
|
34
|
+
4. Block 13 is posted with valid attestations, due to a malicious committee. The archiver will try to sync it and fail, since 13 does not follow 10. This scenario is not gracefully handled yet.
|
|
35
|
+
5. Blocks 11 to 13 are purged. The archiver status will not yet be changed: 10 will still be the latest block, and the `pendingChainValidationStatus` will point to 11. This is because the archiver does **not** follow `BlockInvalidated` events.
|
|
36
|
+
6. Block 11 with valid attestations is posted. The archiver pending chain now reports 11 as latest, and its status is valid.
|
|
15
37
|
|
|
16
|
-
To start the service export `ETHEREUM_HOSTS` (defaults to `http://127.0.0.1:8545/`), `ARCHIVER_POLLING_INTERVAL_MS` (defaults to `1000 ms`), `ROLLUP_CONTRACT_ADDRESS`, `INBOX_CONTRACT_ADDRESS` environmental variables and start the service with `yarn start`.
|
|
@@ -45,7 +45,7 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
|
|
|
45
45
|
private readonly publicClient;
|
|
46
46
|
private readonly l1Addresses;
|
|
47
47
|
readonly dataStore: ArchiverDataStore;
|
|
48
|
-
private
|
|
48
|
+
private config;
|
|
49
49
|
private readonly blobSinkClient;
|
|
50
50
|
private readonly epochCache;
|
|
51
51
|
private readonly instrumentation;
|
|
@@ -60,7 +60,6 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
|
|
|
60
60
|
private store;
|
|
61
61
|
private l1BlockNumber;
|
|
62
62
|
private l1Timestamp;
|
|
63
|
-
private pendingChainValidationStatus;
|
|
64
63
|
private initialSyncComplete;
|
|
65
64
|
readonly tracer: Tracer;
|
|
66
65
|
/**
|
|
@@ -80,8 +79,10 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
|
|
|
80
79
|
}, dataStore: ArchiverDataStore, config: {
|
|
81
80
|
pollingIntervalMs: number;
|
|
82
81
|
batchSize: number;
|
|
82
|
+
skipValidateBlockAttestations?: boolean;
|
|
83
83
|
}, blobSinkClient: BlobSinkClientInterface, epochCache: EpochCache, instrumentation: ArchiverInstrumentation, l1constants: L1RollupConstants & {
|
|
84
84
|
l1StartBlockHash: Buffer32;
|
|
85
|
+
genesisArchiveRoot: Fr;
|
|
85
86
|
}, log?: Logger);
|
|
86
87
|
/**
|
|
87
88
|
* Creates a new instance of the Archiver and blocks until it syncs from chain.
|
|
@@ -91,6 +92,8 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
|
|
|
91
92
|
* @returns - An instance of the archiver.
|
|
92
93
|
*/
|
|
93
94
|
static createAndSync(config: ArchiverConfig, archiverStore: ArchiverDataStore, deps: ArchiverDeps, blockUntilSynced?: boolean): Promise<Archiver>;
|
|
95
|
+
/** Updates archiver config */
|
|
96
|
+
updateConfig(newConfig: Partial<ArchiverConfig>): void;
|
|
94
97
|
/**
|
|
95
98
|
* Starts sync process.
|
|
96
99
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
@@ -122,6 +125,9 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
|
|
|
122
125
|
stop(): Promise<void>;
|
|
123
126
|
backupTo(destPath: string): Promise<string>;
|
|
124
127
|
getL1Constants(): Promise<L1RollupConstants>;
|
|
128
|
+
getGenesisValues(): Promise<{
|
|
129
|
+
genesisArchiveRoot: Fr;
|
|
130
|
+
}>;
|
|
125
131
|
getRollupAddress(): Promise<EthAddress>;
|
|
126
132
|
getRegistryAddress(): Promise<EthAddress>;
|
|
127
133
|
getL1BlockNumber(): bigint;
|
|
@@ -143,6 +149,10 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
|
|
|
143
149
|
getBlocks(from: number, limit: number, proven?: boolean): Promise<L2Block[]>;
|
|
144
150
|
/** Equivalent to getBlocks but includes publish data. */
|
|
145
151
|
getPublishedBlocks(from: number, limit: number, proven?: boolean): Promise<PublishedL2Block[]>;
|
|
152
|
+
getPublishedBlockByHash(blockHash: Fr): Promise<PublishedL2Block | undefined>;
|
|
153
|
+
getPublishedBlockByArchive(archive: Fr): Promise<PublishedL2Block | undefined>;
|
|
154
|
+
getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined>;
|
|
155
|
+
getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined>;
|
|
146
156
|
/**
|
|
147
157
|
* Gets an l2 block.
|
|
148
158
|
* @param number - The block number to return.
|
|
@@ -215,15 +225,19 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
|
|
|
215
225
|
* I would have preferred to not have this type. But it is useful for handling the logic that any
|
|
216
226
|
* store would need to include otherwise while exposing fewer functions and logic directly to the archiver.
|
|
217
227
|
*/
|
|
218
|
-
export declare class ArchiverStoreHelper implements Omit<ArchiverDataStore, 'addLogs' | 'deleteLogs' | 'addContractClasses' | 'deleteContractClasses' | 'addContractInstances' | 'deleteContractInstances' | 'addContractInstanceUpdates' | 'deleteContractInstanceUpdates' | 'addFunctions' | 'backupTo' | 'close' | 'transactionAsync'> {
|
|
228
|
+
export declare class ArchiverStoreHelper implements Omit<ArchiverDataStore, 'addLogs' | 'deleteLogs' | 'addContractClasses' | 'deleteContractClasses' | 'addContractInstances' | 'deleteContractInstances' | 'addContractInstanceUpdates' | 'deleteContractInstanceUpdates' | 'addFunctions' | 'backupTo' | 'close' | 'transactionAsync' | 'addBlocks'> {
|
|
219
229
|
#private;
|
|
220
230
|
protected readonly store: ArchiverDataStore;
|
|
221
231
|
constructor(store: ArchiverDataStore);
|
|
222
|
-
addBlocks(blocks: PublishedL2Block[]): Promise<boolean>;
|
|
232
|
+
addBlocks(blocks: PublishedL2Block[], pendingChainValidationStatus?: ValidateBlockResult): Promise<boolean>;
|
|
223
233
|
unwindBlocks(from: number, blocksToUnwind: number): Promise<boolean>;
|
|
224
234
|
getPublishedBlocks(from: number, limit: number): Promise<PublishedL2Block[]>;
|
|
225
235
|
getPublishedBlock(number: number): Promise<PublishedL2Block | undefined>;
|
|
236
|
+
getPublishedBlockByHash(blockHash: Fr): Promise<PublishedL2Block | undefined>;
|
|
237
|
+
getPublishedBlockByArchive(archive: Fr): Promise<PublishedL2Block | undefined>;
|
|
226
238
|
getBlockHeaders(from: number, limit: number): Promise<BlockHeader[]>;
|
|
239
|
+
getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined>;
|
|
240
|
+
getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined>;
|
|
227
241
|
getTxEffect(txHash: TxHash): Promise<IndexedTxEffect | undefined>;
|
|
228
242
|
getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
|
|
229
243
|
addL1ToL2Messages(messages: InboxMessage[]): Promise<void>;
|
|
@@ -256,6 +270,8 @@ export declare class ArchiverStoreHelper implements Omit<ArchiverDataStore, 'add
|
|
|
256
270
|
iterateL1ToL2Messages(range?: CustomRange<bigint>): AsyncIterableIterator<InboxMessage>;
|
|
257
271
|
removeL1ToL2Messages(startIndex: bigint): Promise<void>;
|
|
258
272
|
getLastL1ToL2Message(): Promise<InboxMessage | undefined>;
|
|
273
|
+
getPendingChainValidationStatus(): Promise<ValidateBlockResult | undefined>;
|
|
274
|
+
setPendingChainValidationStatus(status: ValidateBlockResult | undefined): Promise<void>;
|
|
259
275
|
}
|
|
260
276
|
export {};
|
|
261
277
|
//# sourceMappingURL=archiver.d.ts.map
|
|
@@ -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,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAGL,KAAK,SAAS,EAEd,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAY,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE9D,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;AAIlE,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAWnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,OAAO,EAEZ,KAAK,aAAa,EAElB,KAAK,MAAM,EACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAMjC,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,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAMjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,iBAAiB,CAAC;AAEtF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAEpG,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,cAAc,EAAE,uBAAuB,CAAC;IACxC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { EpochCache } from '@aztec/epoch-cache';
|
|
|
8
8
|
import { BlockTagTooOldError, InboxContract, RollupContract, createEthereumChain } from '@aztec/ethereum';
|
|
9
9
|
import { maxBigint } from '@aztec/foundation/bigint';
|
|
10
10
|
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
11
|
-
import { pick } from '@aztec/foundation/collection';
|
|
11
|
+
import { merge, pick } from '@aztec/foundation/collection';
|
|
12
12
|
import { Fr } from '@aztec/foundation/fields';
|
|
13
13
|
import { createLogger } from '@aztec/foundation/log';
|
|
14
14
|
import { RunningPromise, makeLoggingErrorHandler } from '@aztec/foundation/running-promise';
|
|
@@ -28,6 +28,13 @@ import { retrieveBlocksFromRollup, retrieveL1ToL2Message, retrieveL1ToL2Messages
|
|
|
28
28
|
import { InitialBlockNumberNotSequentialError, NoBlobBodiesFoundError } from './errors.js';
|
|
29
29
|
import { ArchiverInstrumentation } from './instrumentation.js';
|
|
30
30
|
import { validateBlockAttestations } from './validation.js';
|
|
31
|
+
function mapArchiverConfig(config) {
|
|
32
|
+
return {
|
|
33
|
+
pollingIntervalMs: config.archiverPollingIntervalMS,
|
|
34
|
+
batchSize: config.archiverBatchSize,
|
|
35
|
+
skipValidateBlockAttestations: config.skipValidateBlockAttestations
|
|
36
|
+
};
|
|
37
|
+
}
|
|
31
38
|
/**
|
|
32
39
|
* Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval.
|
|
33
40
|
* Responsible for handling robust L1 polling so that other components do not need to
|
|
@@ -50,7 +57,6 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
50
57
|
store;
|
|
51
58
|
l1BlockNumber;
|
|
52
59
|
l1Timestamp;
|
|
53
|
-
pendingChainValidationStatus;
|
|
54
60
|
initialSyncComplete;
|
|
55
61
|
tracer;
|
|
56
62
|
/**
|
|
@@ -63,9 +69,7 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
63
69
|
* @param store - An archiver data store for storage & retrieval of blocks, encrypted logs & contract data.
|
|
64
70
|
* @param log - A logger.
|
|
65
71
|
*/ constructor(publicClient, l1Addresses, dataStore, config, blobSinkClient, epochCache, instrumentation, l1constants, log = createLogger('archiver')){
|
|
66
|
-
super(), this.publicClient = publicClient, this.l1Addresses = l1Addresses, this.dataStore = dataStore, this.config = config, this.blobSinkClient = blobSinkClient, this.epochCache = epochCache, this.instrumentation = instrumentation, this.l1constants = l1constants, this.log = log, this.
|
|
67
|
-
valid: true
|
|
68
|
-
}, this.initialSyncComplete = false;
|
|
72
|
+
super(), this.publicClient = publicClient, this.l1Addresses = l1Addresses, this.dataStore = dataStore, this.config = config, this.blobSinkClient = blobSinkClient, this.epochCache = epochCache, this.instrumentation = instrumentation, this.l1constants = l1constants, this.log = log, this.initialSyncComplete = false;
|
|
69
73
|
this.tracer = instrumentation.tracer;
|
|
70
74
|
this.store = new ArchiverStoreHelper(dataStore);
|
|
71
75
|
this.rollup = new RollupContract(publicClient, l1Addresses.rollupAddress);
|
|
@@ -85,10 +89,11 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
85
89
|
pollingInterval: config.viemPollingIntervalMS
|
|
86
90
|
});
|
|
87
91
|
const rollup = new RollupContract(publicClient, config.l1Contracts.rollupAddress);
|
|
88
|
-
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs] = await Promise.all([
|
|
92
|
+
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, genesisArchiveRoot] = await Promise.all([
|
|
89
93
|
rollup.getL1StartBlock(),
|
|
90
94
|
rollup.getL1GenesisTime(),
|
|
91
|
-
rollup.getProofSubmissionEpochs()
|
|
95
|
+
rollup.getProofSubmissionEpochs(),
|
|
96
|
+
rollup.getGenesisArchiveTreeRoot()
|
|
92
97
|
]);
|
|
93
98
|
const l1StartBlockHash = await publicClient.getBlock({
|
|
94
99
|
blockNumber: l1StartBlock,
|
|
@@ -102,18 +107,22 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
102
107
|
epochDuration,
|
|
103
108
|
slotDuration,
|
|
104
109
|
ethereumSlotDuration,
|
|
105
|
-
proofSubmissionEpochs: Number(proofSubmissionEpochs)
|
|
106
|
-
|
|
107
|
-
const opts = {
|
|
108
|
-
pollingIntervalMs: config.archiverPollingIntervalMS ?? 10_000,
|
|
109
|
-
batchSize: config.archiverBatchSize ?? 100
|
|
110
|
+
proofSubmissionEpochs: Number(proofSubmissionEpochs),
|
|
111
|
+
genesisArchiveRoot: Fr.fromHexString(genesisArchiveRoot)
|
|
110
112
|
};
|
|
113
|
+
const opts = merge({
|
|
114
|
+
pollingIntervalMs: 10_000,
|
|
115
|
+
batchSize: 100
|
|
116
|
+
}, mapArchiverConfig(config));
|
|
111
117
|
const epochCache = deps.epochCache ?? await EpochCache.create(config.l1Contracts.rollupAddress, config, deps);
|
|
112
118
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
113
119
|
const archiver = new Archiver(publicClient, config.l1Contracts, archiverStore, opts, deps.blobSinkClient, epochCache, await ArchiverInstrumentation.new(telemetry, ()=>archiverStore.estimateSize()), l1Constants);
|
|
114
120
|
await archiver.start(blockUntilSynced);
|
|
115
121
|
return archiver;
|
|
116
122
|
}
|
|
123
|
+
/** Updates archiver config */ updateConfig(newConfig) {
|
|
124
|
+
this.config = merge(this.config, mapArchiverConfig(newConfig));
|
|
125
|
+
}
|
|
117
126
|
/**
|
|
118
127
|
* Starts sync process.
|
|
119
128
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
@@ -208,7 +217,8 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
208
217
|
})).timestamp : this.l1Timestamp;
|
|
209
218
|
// ********** Events that are processed per L2 block **********
|
|
210
219
|
if (currentL1BlockNumber > blocksSynchedTo) {
|
|
211
|
-
// First we retrieve new L2 blocks
|
|
220
|
+
// First we retrieve new L2 blocks and store them in the DB. This will also update the
|
|
221
|
+
// pending chain validation status, proven block number, and synched L1 block number.
|
|
212
222
|
const rollupStatus = await this.handleL2blocks(blocksSynchedTo, currentL1BlockNumber);
|
|
213
223
|
// Then we prune the current epoch if it'd reorg on next submission.
|
|
214
224
|
// Note that we don't do this before retrieving L2 blocks because we may need to retrieve
|
|
@@ -216,17 +226,11 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
216
226
|
// the chain locally before we start unwinding stuff. This can be optimized by figuring out
|
|
217
227
|
// up to which point we're pruning, and then requesting L2 blocks up to that point only.
|
|
218
228
|
const { rollupCanPrune } = await this.handleEpochPrune(rollupStatus.provenBlockNumber, currentL1BlockNumber, currentL1Timestamp);
|
|
219
|
-
// Update the pending chain validation status with the last block validation result.
|
|
220
|
-
// Again, we only update if validation status changed, so in a sequence of invalid blocks
|
|
221
|
-
// we keep track of the first invalid block so we can invalidate that one if needed.
|
|
222
|
-
if (rollupStatus.validationResult && rollupStatus.validationResult?.valid !== this.pendingChainValidationStatus.valid) {
|
|
223
|
-
this.pendingChainValidationStatus = rollupStatus.validationResult;
|
|
224
|
-
}
|
|
225
229
|
// And lastly we check if we are missing any L2 blocks behind us due to a possible L1 reorg.
|
|
226
230
|
// We only do this if rollup cant prune on the next submission. Otherwise we will end up
|
|
227
231
|
// re-syncing the blocks we have just unwound above. We also dont do this if the last block is invalid,
|
|
228
232
|
// since the archiver will rightfully refuse to sync up to it.
|
|
229
|
-
if (!rollupCanPrune &&
|
|
233
|
+
if (!rollupCanPrune && rollupStatus.validationResult?.valid) {
|
|
230
234
|
await this.checkForNewBlocksBeforeL1SyncPoint(rollupStatus, blocksSynchedTo, currentL1BlockNumber);
|
|
231
235
|
}
|
|
232
236
|
this.instrumentation.updateL1BlockHeight(currentL1BlockNumber);
|
|
@@ -453,6 +457,7 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
453
457
|
}
|
|
454
458
|
async handleL2blocks(blocksSynchedTo, currentL1BlockNumber) {
|
|
455
459
|
const localPendingBlockNumber = await this.getBlockNumber();
|
|
460
|
+
const initialValidationResult = await this.store.getPendingChainValidationStatus();
|
|
456
461
|
const [provenBlockNumber, provenArchive, pendingBlockNumber, pendingArchive, archiveForLocalPendingBlockNumber] = await this.rollup.status(BigInt(localPendingBlockNumber), {
|
|
457
462
|
blockNumber: currentL1BlockNumber
|
|
458
463
|
});
|
|
@@ -461,7 +466,7 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
461
466
|
provenArchive,
|
|
462
467
|
pendingBlockNumber: Number(pendingBlockNumber),
|
|
463
468
|
pendingArchive,
|
|
464
|
-
validationResult:
|
|
469
|
+
validationResult: initialValidationResult
|
|
465
470
|
};
|
|
466
471
|
this.log.trace(`Retrieved rollup status at current L1 block ${currentL1BlockNumber}.`, {
|
|
467
472
|
localPendingBlockNumber,
|
|
@@ -588,13 +593,18 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
588
593
|
}
|
|
589
594
|
const lastProcessedL1BlockNumber = retrievedBlocks[retrievedBlocks.length - 1].l1.blockNumber;
|
|
590
595
|
this.log.debug(`Retrieved ${retrievedBlocks.length} new L2 blocks between L1 blocks ${searchStartBlock} and ${searchEndBlock} with last processed L1 block ${lastProcessedL1BlockNumber}.`);
|
|
591
|
-
const publishedBlocks = retrievedBlocks.map((b)=>retrievedBlockToPublishedL2Block(b));
|
|
596
|
+
const publishedBlocks = await Promise.all(retrievedBlocks.map((b)=>retrievedBlockToPublishedL2Block(b)));
|
|
592
597
|
const validBlocks = [];
|
|
593
598
|
for (const block of publishedBlocks){
|
|
594
|
-
const validationResult =
|
|
599
|
+
const validationResult = this.config.skipValidateBlockAttestations ? {
|
|
600
|
+
valid: true
|
|
601
|
+
} : await validateBlockAttestations(block, this.epochCache, this.l1constants, this.log);
|
|
595
602
|
// Only update the validation result if it has changed, so we can keep track of the first invalid block
|
|
596
603
|
// in case there is a sequence of more than one invalid block, as we need to invalidate the first one.
|
|
597
|
-
if
|
|
604
|
+
// There is an exception though: if an invalid block is invalidated and replaced with another invalid block,
|
|
605
|
+
// we need to update the validation result, since we need to be able to invalidate the new one.
|
|
606
|
+
// See test 'chain progresses if an invalid block is invalidated with an invalid one' for more info.
|
|
607
|
+
if (rollupStatus.validationResult?.valid !== validationResult.valid || !rollupStatus.validationResult.valid && !validationResult.valid && rollupStatus.validationResult.block.blockNumber === validationResult.block.blockNumber) {
|
|
598
608
|
rollupStatus.validationResult = validationResult;
|
|
599
609
|
}
|
|
600
610
|
if (!validationResult.valid) {
|
|
@@ -619,7 +629,8 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
619
629
|
});
|
|
620
630
|
}
|
|
621
631
|
try {
|
|
622
|
-
const
|
|
632
|
+
const updatedValidationResult = rollupStatus.validationResult === initialValidationResult ? undefined : rollupStatus.validationResult;
|
|
633
|
+
const [processDuration] = await elapsed(()=>this.store.addBlocks(validBlocks, updatedValidationResult));
|
|
623
634
|
this.instrumentation.processNewBlocks(processDuration / validBlocks.length, validBlocks.map((b)=>b.block));
|
|
624
635
|
} catch (err) {
|
|
625
636
|
if (err instanceof InitialBlockNumberNotSequentialError) {
|
|
@@ -709,6 +720,11 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
709
720
|
getL1Constants() {
|
|
710
721
|
return Promise.resolve(this.l1constants);
|
|
711
722
|
}
|
|
723
|
+
getGenesisValues() {
|
|
724
|
+
return Promise.resolve({
|
|
725
|
+
genesisArchiveRoot: this.l1constants.genesisArchiveRoot
|
|
726
|
+
});
|
|
727
|
+
}
|
|
712
728
|
getRollupAddress() {
|
|
713
729
|
return Promise.resolve(this.l1Addresses.rollupAddress);
|
|
714
730
|
}
|
|
@@ -806,6 +822,18 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
806
822
|
const limitWithProven = proven ? Math.min(limit, Math.max(await this.store.getProvenL2BlockNumber() - from + 1, 0)) : limit;
|
|
807
823
|
return limitWithProven === 0 ? [] : await this.store.getPublishedBlocks(from, limitWithProven);
|
|
808
824
|
}
|
|
825
|
+
getPublishedBlockByHash(blockHash) {
|
|
826
|
+
return this.store.getPublishedBlockByHash(blockHash);
|
|
827
|
+
}
|
|
828
|
+
getPublishedBlockByArchive(archive) {
|
|
829
|
+
return this.store.getPublishedBlockByArchive(archive);
|
|
830
|
+
}
|
|
831
|
+
getBlockHeaderByHash(blockHash) {
|
|
832
|
+
return this.store.getBlockHeaderByHash(blockHash);
|
|
833
|
+
}
|
|
834
|
+
getBlockHeaderByArchive(archive) {
|
|
835
|
+
return this.store.getBlockHeaderByArchive(archive);
|
|
836
|
+
}
|
|
809
837
|
/**
|
|
810
838
|
* Gets an l2 block.
|
|
811
839
|
* @param number - The block number to return.
|
|
@@ -919,11 +947,13 @@ import { validateBlockAttestations } from './validation.js';
|
|
|
919
947
|
getDebugFunctionName(address, selector) {
|
|
920
948
|
return this.store.getDebugFunctionName(address, selector);
|
|
921
949
|
}
|
|
922
|
-
getPendingChainValidationStatus() {
|
|
923
|
-
return
|
|
950
|
+
async getPendingChainValidationStatus() {
|
|
951
|
+
return await this.store.getPendingChainValidationStatus() ?? {
|
|
952
|
+
valid: true
|
|
953
|
+
};
|
|
924
954
|
}
|
|
925
955
|
isPendingChainInvalid() {
|
|
926
|
-
return
|
|
956
|
+
return this.getPendingChainValidationStatus().then((status)=>!status.valid);
|
|
927
957
|
}
|
|
928
958
|
async getL2Tips() {
|
|
929
959
|
const [latestBlockNumber, provenBlockNumber] = await Promise.all([
|
|
@@ -1124,12 +1154,15 @@ var Operation = /*#__PURE__*/ function(Operation) {
|
|
|
1124
1154
|
}
|
|
1125
1155
|
return true;
|
|
1126
1156
|
}
|
|
1127
|
-
addBlocks(blocks) {
|
|
1157
|
+
addBlocks(blocks, pendingChainValidationStatus) {
|
|
1128
1158
|
// Add the blocks to the store. Store will throw if the blocks are not in order, there are gaps,
|
|
1129
1159
|
// or if the previous block is not in the store.
|
|
1130
1160
|
return this.store.transactionAsync(async ()=>{
|
|
1131
1161
|
await this.store.addBlocks(blocks);
|
|
1132
1162
|
const opResults = await Promise.all([
|
|
1163
|
+
// Update the pending chain validation status if provided
|
|
1164
|
+
pendingChainValidationStatus && this.store.setPendingChainValidationStatus(pendingChainValidationStatus),
|
|
1165
|
+
// Add any logs emitted during the retrieved blocks
|
|
1133
1166
|
this.store.addLogs(blocks.map((block)=>block.block)),
|
|
1134
1167
|
// Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them
|
|
1135
1168
|
...blocks.map(async (block)=>{
|
|
@@ -1159,6 +1192,10 @@ var Operation = /*#__PURE__*/ function(Operation) {
|
|
|
1159
1192
|
// from - blocksToUnwind = the new head, so + 1 for what we need to remove
|
|
1160
1193
|
const blocks = await this.getPublishedBlocks(from - blocksToUnwind + 1, blocksToUnwind);
|
|
1161
1194
|
const opResults = await Promise.all([
|
|
1195
|
+
// Prune rolls back to the last proven block, which is by definition valid
|
|
1196
|
+
this.store.setPendingChainValidationStatus({
|
|
1197
|
+
valid: true
|
|
1198
|
+
}),
|
|
1162
1199
|
// Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them
|
|
1163
1200
|
...blocks.map(async (block)=>{
|
|
1164
1201
|
const contractClassLogs = block.block.body.txEffects.flatMap((txEffect)=>txEffect.contractClassLogs);
|
|
@@ -1182,9 +1219,21 @@ var Operation = /*#__PURE__*/ function(Operation) {
|
|
|
1182
1219
|
getPublishedBlock(number) {
|
|
1183
1220
|
return this.store.getPublishedBlock(number);
|
|
1184
1221
|
}
|
|
1222
|
+
getPublishedBlockByHash(blockHash) {
|
|
1223
|
+
return this.store.getPublishedBlockByHash(blockHash);
|
|
1224
|
+
}
|
|
1225
|
+
getPublishedBlockByArchive(archive) {
|
|
1226
|
+
return this.store.getPublishedBlockByArchive(archive);
|
|
1227
|
+
}
|
|
1185
1228
|
getBlockHeaders(from, limit) {
|
|
1186
1229
|
return this.store.getBlockHeaders(from, limit);
|
|
1187
1230
|
}
|
|
1231
|
+
getBlockHeaderByHash(blockHash) {
|
|
1232
|
+
return this.store.getBlockHeaderByHash(blockHash);
|
|
1233
|
+
}
|
|
1234
|
+
getBlockHeaderByArchive(archive) {
|
|
1235
|
+
return this.store.getBlockHeaderByArchive(archive);
|
|
1236
|
+
}
|
|
1188
1237
|
getTxEffect(txHash) {
|
|
1189
1238
|
return this.store.getTxEffect(txHash);
|
|
1190
1239
|
}
|
|
@@ -1266,4 +1315,11 @@ var Operation = /*#__PURE__*/ function(Operation) {
|
|
|
1266
1315
|
getLastL1ToL2Message() {
|
|
1267
1316
|
return this.store.getLastL1ToL2Message();
|
|
1268
1317
|
}
|
|
1318
|
+
getPendingChainValidationStatus() {
|
|
1319
|
+
return this.store.getPendingChainValidationStatus();
|
|
1320
|
+
}
|
|
1321
|
+
setPendingChainValidationStatus(status) {
|
|
1322
|
+
this.#log.debug(`Setting pending chain validation status to valid ${status?.valid}`, status);
|
|
1323
|
+
return this.store.setPendingChainValidationStatus(status);
|
|
1324
|
+
}
|
|
1269
1325
|
}
|
|
@@ -3,7 +3,7 @@ import type { Fr } from '@aztec/foundation/fields';
|
|
|
3
3
|
import type { CustomRange } from '@aztec/kv-store';
|
|
4
4
|
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
5
5
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
|
-
import type { L2Block } from '@aztec/stdlib/block';
|
|
6
|
+
import type { L2Block, ValidateBlockResult } from '@aztec/stdlib/block';
|
|
7
7
|
import type { ContractClassPublic, ContractInstanceUpdateWithAddress, ContractInstanceWithAddress, ExecutablePrivateFunctionWithMembershipProof, UtilityFunctionWithMembershipProof } from '@aztec/stdlib/contract';
|
|
8
8
|
import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client';
|
|
9
9
|
import type { LogFilter, PrivateLog, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
@@ -50,6 +50,16 @@ export interface ArchiverDataStore {
|
|
|
50
50
|
* @param number - The block number to return.
|
|
51
51
|
*/
|
|
52
52
|
getPublishedBlock(number: number): Promise<PublishedL2Block | undefined>;
|
|
53
|
+
/**
|
|
54
|
+
* Returns the block for the given hash, or undefined if not exists.
|
|
55
|
+
* @param blockHash - The block hash to return.
|
|
56
|
+
*/
|
|
57
|
+
getPublishedBlockByHash(blockHash: Fr): Promise<PublishedL2Block | undefined>;
|
|
58
|
+
/**
|
|
59
|
+
* Returns the block for the given archive root, or undefined if not exists.
|
|
60
|
+
* @param archive - The archive root to return.
|
|
61
|
+
*/
|
|
62
|
+
getPublishedBlockByArchive(archive: Fr): Promise<PublishedL2Block | undefined>;
|
|
53
63
|
/**
|
|
54
64
|
* Gets up to `limit` amount of published L2 blocks starting from `from`.
|
|
55
65
|
* @param from - Number of the first block to return (inclusive).
|
|
@@ -64,6 +74,16 @@ export interface ArchiverDataStore {
|
|
|
64
74
|
* @returns The requested L2 block headers.
|
|
65
75
|
*/
|
|
66
76
|
getBlockHeaders(from: number, limit: number): Promise<BlockHeader[]>;
|
|
77
|
+
/**
|
|
78
|
+
* Returns the block header for the given hash, or undefined if not exists.
|
|
79
|
+
* @param blockHash - The block hash to return.
|
|
80
|
+
*/
|
|
81
|
+
getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined>;
|
|
82
|
+
/**
|
|
83
|
+
* Returns the block header for the given archive root, or undefined if not exists.
|
|
84
|
+
* @param archive - The archive root to return.
|
|
85
|
+
*/
|
|
86
|
+
getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined>;
|
|
67
87
|
/**
|
|
68
88
|
* Gets a tx effect.
|
|
69
89
|
* @param txHash - The hash of the tx corresponding to the tx effect.
|
|
@@ -227,5 +247,9 @@ export interface ArchiverDataStore {
|
|
|
227
247
|
removeL1ToL2Messages(startIndex: bigint): Promise<void>;
|
|
228
248
|
/** Returns the last L1 to L2 message stored. */
|
|
229
249
|
getLastL1ToL2Message(): Promise<InboxMessage | undefined>;
|
|
250
|
+
/** Returns the last synced validation status of the pending chain. */
|
|
251
|
+
getPendingChainValidationStatus(): Promise<ValidateBlockResult | undefined>;
|
|
252
|
+
/** Sets the last synced validation status of the pending chain. */
|
|
253
|
+
setPendingChainValidationStatus(status: ValidateBlockResult | undefined): Promise<void>;
|
|
230
254
|
}
|
|
231
255
|
//# sourceMappingURL=archiver_store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver_store.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"archiver_store.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver_store_test_suite.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver_store_test_suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"archiver_store_test_suite.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver_store_test_suite.ts"],"names":[],"mappings":"AAoCA,OAAO,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,qBAAqB,CAAC;AAKnF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,QA2rC/D"}
|