@aztec/archiver 0.0.1-commit.e558bd1c → 0.0.1-commit.e5a3663dd
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 +12 -6
- package/dest/archiver.d.ts +26 -15
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +161 -153
- package/dest/config.d.ts +5 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +16 -4
- package/dest/errors.d.ts +61 -10
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +88 -14
- package/dest/factory.d.ts +6 -7
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +40 -32
- package/dest/index.d.ts +11 -3
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +10 -2
- package/dest/l1/bin/retrieve-calldata.js +32 -28
- package/dest/l1/calldata_retriever.d.ts +74 -50
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +197 -260
- package/dest/l1/data_retrieval.d.ts +26 -17
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +42 -47
- package/dest/l1/spire_proposer.d.ts +5 -5
- package/dest/l1/spire_proposer.d.ts.map +1 -1
- package/dest/l1/spire_proposer.js +9 -17
- package/dest/l1/validate_historical_logs.d.ts +23 -0
- package/dest/l1/validate_historical_logs.d.ts.map +1 -0
- package/dest/l1/validate_historical_logs.js +108 -0
- package/dest/modules/contract_data_source_adapter.d.ts +25 -0
- package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
- package/dest/modules/contract_data_source_adapter.js +42 -0
- package/dest/modules/data_source_base.d.ts +27 -14
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +98 -125
- package/dest/modules/data_store_updater.d.ts +37 -17
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +155 -112
- package/dest/modules/instrumentation.d.ts +21 -3
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +41 -8
- package/dest/modules/l1_synchronizer.d.ts +13 -11
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +355 -182
- package/dest/modules/validation.d.ts +4 -3
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +6 -6
- package/dest/store/block_store.d.ts +107 -31
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +477 -141
- package/dest/store/contract_class_store.d.ts +17 -4
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +24 -68
- package/dest/store/contract_instance_store.d.ts +28 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +37 -2
- package/dest/store/data_stores.d.ts +68 -0
- package/dest/store/data_stores.d.ts.map +1 -0
- package/dest/store/data_stores.js +50 -0
- package/dest/store/function_names_cache.d.ts +17 -0
- package/dest/store/function_names_cache.d.ts.map +1 -0
- package/dest/store/function_names_cache.js +30 -0
- package/dest/store/l2_tips_cache.d.ts +20 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +109 -0
- package/dest/store/log_store.d.ts +6 -3
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +95 -20
- package/dest/store/message_store.d.ts +11 -1
- package/dest/store/message_store.d.ts.map +1 -1
- package/dest/store/message_store.js +51 -9
- package/dest/test/fake_l1_state.d.ts +25 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +166 -32
- package/dest/test/mock_archiver.d.ts +1 -1
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +3 -2
- 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 +2 -1
- package/dest/test/mock_l2_block_source.d.ts +35 -5
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +182 -89
- package/dest/test/mock_structs.d.ts +4 -1
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +13 -1
- package/dest/test/noop_l1_archiver.d.ts +7 -4
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +14 -8
- package/package.json +13 -13
- package/src/archiver.ts +199 -174
- package/src/config.ts +23 -2
- package/src/errors.ts +133 -22
- package/src/factory.ts +53 -30
- package/src/index.ts +18 -2
- package/src/l1/README.md +25 -68
- package/src/l1/bin/retrieve-calldata.ts +40 -27
- package/src/l1/calldata_retriever.ts +261 -379
- package/src/l1/data_retrieval.ts +58 -69
- package/src/l1/spire_proposer.ts +7 -15
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/modules/contract_data_source_adapter.ts +59 -0
- package/src/modules/data_source_base.ts +142 -144
- package/src/modules/data_store_updater.ts +187 -141
- package/src/modules/instrumentation.ts +56 -9
- package/src/modules/l1_synchronizer.ts +463 -218
- package/src/modules/validation.ts +10 -9
- package/src/store/block_store.ts +587 -177
- package/src/store/contract_class_store.ts +31 -103
- package/src/store/contract_instance_store.ts +51 -5
- package/src/store/data_stores.ts +108 -0
- package/src/store/function_names_cache.ts +37 -0
- package/src/store/l2_tips_cache.ts +134 -0
- package/src/store/log_store.ts +128 -32
- package/src/store/message_store.ts +60 -10
- package/src/structs/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +213 -42
- package/src/test/mock_archiver.ts +3 -2
- package/src/test/mock_l1_to_l2_message_source.ts +1 -0
- package/src/test/mock_l2_block_source.ts +230 -82
- package/src/test/mock_structs.ts +20 -6
- package/src/test/noop_l1_archiver.ts +16 -8
- package/dest/store/kv_archiver_store.d.ts +0 -340
- package/dest/store/kv_archiver_store.d.ts.map +0 -1
- package/dest/store/kv_archiver_store.js +0 -446
- package/src/store/kv_archiver_store.ts +0 -639
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
2
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
4
|
import { L2Block } from '@aztec/stdlib/block';
|
|
@@ -24,20 +25,22 @@ export declare class LogStore {
|
|
|
24
25
|
* array implies no logs match that tag.
|
|
25
26
|
* @param tags - The tags to search for.
|
|
26
27
|
* @param page - The page number (0-indexed) for pagination.
|
|
28
|
+
* @param upToBlockNumber - If set, only return logs from blocks up to and including this block number.
|
|
27
29
|
* @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
|
|
28
30
|
* MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
|
|
29
31
|
*/
|
|
30
|
-
getPrivateLogsByTags(tags: SiloedTag[], page?: number): Promise<TxScopedL2Log[][]>;
|
|
32
|
+
getPrivateLogsByTags(tags: SiloedTag[], page?: number, upToBlockNumber?: BlockNumber): Promise<TxScopedL2Log[][]>;
|
|
31
33
|
/**
|
|
32
34
|
* Gets public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
|
|
33
35
|
* logs is returned. An empty array implies no logs match that tag.
|
|
34
36
|
* @param contractAddress - The contract address to search logs for.
|
|
35
37
|
* @param tags - The tags to search for.
|
|
36
38
|
* @param page - The page number (0-indexed) for pagination.
|
|
39
|
+
* @param upToBlockNumber - If set, only return logs from blocks up to and including this block number.
|
|
37
40
|
* @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
|
|
38
41
|
* MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
|
|
39
42
|
*/
|
|
40
|
-
getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[], page?: number): Promise<TxScopedL2Log[][]>;
|
|
43
|
+
getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[], page?: number, upToBlockNumber?: BlockNumber): Promise<TxScopedL2Log[][]>;
|
|
41
44
|
/**
|
|
42
45
|
* Gets public logs based on the provided filter.
|
|
43
46
|
* @param filter - The filter to apply to the logs.
|
|
@@ -51,4 +54,4 @@ export declare class LogStore {
|
|
|
51
54
|
*/
|
|
52
55
|
getContractClassLogs(filter: LogFilter): Promise<GetContractClassLogsResponse>;
|
|
53
56
|
}
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3N0b3JlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmUvbG9nX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUk5RCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQWEsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxLQUFLLEVBQUUsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRyxPQUFPLEVBSUwsS0FBSyxTQUFTLEVBR2QsS0FBSyxTQUFTLEVBQ2QsR0FBRyxFQUNILGFBQWEsRUFDZCxNQUFNLG9CQUFvQixDQUFDO0FBSTVCLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5EOztHQUVHO0FBQ0gscUJBQWEsUUFBUTs7SUFhakIsT0FBTyxDQUFDLEVBQUU7SUFDVixPQUFPLENBQUMsVUFBVTtJQUZwQixZQUNVLEVBQUUsRUFBRSxpQkFBaUIsRUFDckIsVUFBVSxFQUFFLFVBQVUsRUFDOUIsZUFBZSxHQUFFLE1BQWEsRUFVL0I7SUFvT0Q7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQVMzQztJQWNELFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQTBEOUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNHLG9CQUFvQixDQUN4QixJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQ2pCLElBQUksR0FBRSxNQUFVLEVBQ2hCLGVBQWUsQ0FBQyxFQUFFLFdBQVcsR0FDNUIsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FnQjVCO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0csK0JBQStCLENBQ25DLGVBQWUsRUFBRSxZQUFZLEVBQzdCLElBQUksRUFBRSxHQUFHLEVBQUUsRUFDWCxJQUFJLEdBQUUsTUFBVSxFQUNoQixlQUFlLENBQUMsRUFBRSxXQUFXLEdBQzVCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBb0I1QjtJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsTUFBTSxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FRL0Q7SUErRkQ7Ozs7T0FJRztJQUNILG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBUTdFO0NBNktGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log_store.d.ts","sourceRoot":"","sources":["../../src/store/log_store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"log_store.d.ts","sourceRoot":"","sources":["../../src/store/log_store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAI9D,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAa,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC3G,OAAO,EAIL,KAAK,SAAS,EAGd,KAAK,SAAS,EACd,GAAG,EACH,aAAa,EACd,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;GAEG;AACH,qBAAa,QAAQ;;IAajB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IAFpB,YACU,EAAE,EAAE,iBAAiB,EACrB,UAAU,EAAE,UAAU,EAC9B,eAAe,GAAE,MAAa,EAU/B;IAoOD;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAS3C;IAcD,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CA0D9C;IAED;;;;;;;;OAQG;IACG,oBAAoB,CACxB,IAAI,EAAE,SAAS,EAAE,EACjB,IAAI,GAAE,MAAU,EAChB,eAAe,CAAC,EAAE,WAAW,GAC5B,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAgB5B;IAED;;;;;;;;;OASG;IACG,+BAA+B,CACnC,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,GAAG,EAAE,EACX,IAAI,GAAE,MAAU,EAChB,eAAe,CAAC,EAAE,WAAW,GAC5B,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAoB5B;IAED;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAQ/D;IA+FD;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAQ7E;CA6KF"}
|
package/dest/store/log_store.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
-
import { filterAsync } from '@aztec/foundation/collection';
|
|
4
|
-
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import { compactArray, filterAsync } from '@aztec/foundation/collection';
|
|
5
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
5
|
import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize';
|
|
7
6
|
import { BlockHash } from '@aztec/stdlib/block';
|
|
8
7
|
import { MAX_LOGS_PER_TAG } from '@aztec/stdlib/interfaces/api-limit';
|
|
9
8
|
import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, PublicLog, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
10
9
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
10
|
+
import { OutOfOrderLogInsertionError } from '../errors.js';
|
|
11
11
|
/**
|
|
12
12
|
* A store for logs
|
|
13
13
|
*/ export class LogStore {
|
|
@@ -108,7 +108,16 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
108
108
|
})));
|
|
109
109
|
for (const taggedLogBuffer of currentPrivateTaggedLogs){
|
|
110
110
|
if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
|
|
111
|
-
|
|
111
|
+
const newLogs = privateTaggedLogs.get(taggedLogBuffer.tag);
|
|
112
|
+
if (newLogs.length === 0) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const lastExisting = TxScopedL2Log.fromBuffer(taggedLogBuffer.logBuffers.at(-1));
|
|
116
|
+
const firstNew = TxScopedL2Log.fromBuffer(newLogs[0]);
|
|
117
|
+
if (lastExisting.blockNumber > firstNew.blockNumber) {
|
|
118
|
+
throw new OutOfOrderLogInsertionError('private', taggedLogBuffer.tag, lastExisting.blockNumber, firstNew.blockNumber);
|
|
119
|
+
}
|
|
120
|
+
privateTaggedLogs.set(taggedLogBuffer.tag, taggedLogBuffer.logBuffers.concat(newLogs));
|
|
112
121
|
}
|
|
113
122
|
}
|
|
114
123
|
for (const block of newBlocks){
|
|
@@ -130,7 +139,16 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
130
139
|
})));
|
|
131
140
|
for (const taggedLogBuffer of currentPublicTaggedLogs){
|
|
132
141
|
if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
|
|
133
|
-
|
|
142
|
+
const newLogs = publicTaggedLogs.get(taggedLogBuffer.tag);
|
|
143
|
+
if (newLogs.length === 0) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const lastExisting = TxScopedL2Log.fromBuffer(taggedLogBuffer.logBuffers.at(-1));
|
|
147
|
+
const firstNew = TxScopedL2Log.fromBuffer(newLogs[0]);
|
|
148
|
+
if (lastExisting.blockNumber > firstNew.blockNumber) {
|
|
149
|
+
throw new OutOfOrderLogInsertionError('public', taggedLogBuffer.tag, lastExisting.blockNumber, firstNew.blockNumber);
|
|
150
|
+
}
|
|
151
|
+
publicTaggedLogs.set(taggedLogBuffer.tag, taggedLogBuffer.logBuffers.concat(newLogs));
|
|
134
152
|
}
|
|
135
153
|
}
|
|
136
154
|
for (const block of newBlocks){
|
|
@@ -184,22 +202,41 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
184
202
|
]);
|
|
185
203
|
}
|
|
186
204
|
#unpackBlockHash(reader) {
|
|
187
|
-
|
|
188
|
-
if (!blockHash) {
|
|
205
|
+
if (reader.remainingBytes() === 0) {
|
|
189
206
|
throw new Error('Failed to read block hash from log entry buffer');
|
|
190
207
|
}
|
|
191
|
-
return
|
|
208
|
+
return BlockHash.fromBuffer(reader);
|
|
192
209
|
}
|
|
193
210
|
deleteLogs(blocks) {
|
|
194
211
|
return this.db.transactionAsync(async ()=>{
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
212
|
+
const blockNumbers = new Set(blocks.map((block)=>block.number));
|
|
213
|
+
const firstBlockToDelete = Math.min(...blockNumbers);
|
|
214
|
+
// Collect all unique private tags across all blocks being deleted
|
|
215
|
+
const allPrivateTags = new Set(compactArray(await Promise.all(blocks.map((block)=>this.#privateLogKeysByBlock.getAsync(block.number)))).flat());
|
|
216
|
+
// Trim private logs: for each tag, delete all instances including and after the first block being deleted.
|
|
217
|
+
// This hinges on the invariant that logs for a given tag are always inserted in order of block number, which is enforced in #addPrivateLogs.
|
|
218
|
+
for (const tag of allPrivateTags){
|
|
219
|
+
const existing = await this.#privateLogsByTag.getAsync(tag);
|
|
220
|
+
if (existing === undefined || existing.length === 0) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const lastIndexToKeep = existing.findLastIndex((buf)=>TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete);
|
|
224
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
225
|
+
await (remaining.length > 0 ? this.#privateLogsByTag.set(tag, remaining) : this.#privateLogsByTag.delete(tag));
|
|
226
|
+
}
|
|
227
|
+
// Collect all unique public keys across all blocks being deleted
|
|
228
|
+
const allPublicKeys = new Set(compactArray(await Promise.all(blocks.map((block)=>this.#publicLogKeysByBlock.getAsync(block.number)))).flat());
|
|
229
|
+
// And do the same as we did with private logs
|
|
230
|
+
for (const key of allPublicKeys){
|
|
231
|
+
const existing = await this.#publicLogsByContractAndTag.getAsync(key);
|
|
232
|
+
if (existing === undefined || existing.length === 0) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const lastIndexToKeep = existing.findLastIndex((buf)=>TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete);
|
|
236
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
237
|
+
await (remaining.length > 0 ? this.#publicLogsByContractAndTag.set(key, remaining) : this.#publicLogsByContractAndTag.delete(key));
|
|
238
|
+
}
|
|
239
|
+
// After trimming the tagged logs, we can delete the block-level keys that track which tags are in which blocks.
|
|
203
240
|
await Promise.all(blocks.map((block)=>Promise.all([
|
|
204
241
|
this.#publicLogsByBlock.delete(block.number),
|
|
205
242
|
this.#privateLogKeysByBlock.delete(block.number),
|
|
@@ -214,13 +251,23 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
214
251
|
* array implies no logs match that tag.
|
|
215
252
|
* @param tags - The tags to search for.
|
|
216
253
|
* @param page - The page number (0-indexed) for pagination.
|
|
254
|
+
* @param upToBlockNumber - If set, only return logs from blocks up to and including this block number.
|
|
217
255
|
* @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
|
|
218
256
|
* MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
|
|
219
|
-
*/ async getPrivateLogsByTags(tags, page = 0) {
|
|
257
|
+
*/ async getPrivateLogsByTags(tags, page = 0, upToBlockNumber) {
|
|
220
258
|
const logs = await Promise.all(tags.map((tag)=>this.#privateLogsByTag.getAsync(tag.toString())));
|
|
221
259
|
const start = page * MAX_LOGS_PER_TAG;
|
|
222
260
|
const end = start + MAX_LOGS_PER_TAG;
|
|
223
|
-
return logs.map((logBuffers)=>
|
|
261
|
+
return logs.map((logBuffers)=>{
|
|
262
|
+
const deserialized = logBuffers?.slice(start, end).map((buf)=>TxScopedL2Log.fromBuffer(buf)) ?? [];
|
|
263
|
+
if (upToBlockNumber !== undefined) {
|
|
264
|
+
const cutoff = deserialized.findIndex((log)=>log.blockNumber > upToBlockNumber);
|
|
265
|
+
if (cutoff !== -1) {
|
|
266
|
+
return deserialized.slice(0, cutoff);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return deserialized;
|
|
270
|
+
});
|
|
224
271
|
}
|
|
225
272
|
/**
|
|
226
273
|
* Gets public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
|
|
@@ -228,16 +275,26 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
228
275
|
* @param contractAddress - The contract address to search logs for.
|
|
229
276
|
* @param tags - The tags to search for.
|
|
230
277
|
* @param page - The page number (0-indexed) for pagination.
|
|
278
|
+
* @param upToBlockNumber - If set, only return logs from blocks up to and including this block number.
|
|
231
279
|
* @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
|
|
232
280
|
* MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
|
|
233
|
-
*/ async getPublicLogsByTagsFromContract(contractAddress, tags, page = 0) {
|
|
281
|
+
*/ async getPublicLogsByTagsFromContract(contractAddress, tags, page = 0, upToBlockNumber) {
|
|
234
282
|
const logs = await Promise.all(tags.map((tag)=>{
|
|
235
283
|
const key = `${contractAddress.toString()}_${tag.value.toString()}`;
|
|
236
284
|
return this.#publicLogsByContractAndTag.getAsync(key);
|
|
237
285
|
}));
|
|
238
286
|
const start = page * MAX_LOGS_PER_TAG;
|
|
239
287
|
const end = start + MAX_LOGS_PER_TAG;
|
|
240
|
-
return logs.map((logBuffers)=>
|
|
288
|
+
return logs.map((logBuffers)=>{
|
|
289
|
+
const deserialized = logBuffers?.slice(start, end).map((buf)=>TxScopedL2Log.fromBuffer(buf)) ?? [];
|
|
290
|
+
if (upToBlockNumber !== undefined) {
|
|
291
|
+
const cutoff = deserialized.findIndex((log)=>log.blockNumber > upToBlockNumber);
|
|
292
|
+
if (cutoff !== -1) {
|
|
293
|
+
return deserialized.slice(0, cutoff);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return deserialized;
|
|
297
|
+
});
|
|
241
298
|
}
|
|
242
299
|
/**
|
|
243
300
|
* Gets public logs based on the provided filter.
|
|
@@ -424,11 +481,20 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
424
481
|
};
|
|
425
482
|
}
|
|
426
483
|
#accumulatePublicLogs(results, blockNumber, blockHash, txIndex, txHash, txLogs, filter = {}) {
|
|
484
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
485
|
+
return false;
|
|
486
|
+
}
|
|
487
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
427
493
|
let maxLogsHit = false;
|
|
428
494
|
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
429
495
|
for(; logIndex < txLogs.length; logIndex++){
|
|
430
496
|
const log = txLogs[logIndex];
|
|
431
|
-
if (!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) {
|
|
497
|
+
if ((!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) && (!filter.tag || log.fields[0]?.equals(filter.tag))) {
|
|
432
498
|
results.push(new ExtendedPublicLog(new LogId(BlockNumber(blockNumber), blockHash, txHash, txIndex, logIndex), log));
|
|
433
499
|
if (results.length >= this.#logsMaxPageSize) {
|
|
434
500
|
maxLogsHit = true;
|
|
@@ -439,6 +505,15 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
439
505
|
return maxLogsHit;
|
|
440
506
|
}
|
|
441
507
|
#accumulateContractClassLogs(results, blockNumber, blockHash, txIndex, txHash, txLogs, filter = {}) {
|
|
508
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
511
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
515
|
+
return false;
|
|
516
|
+
}
|
|
442
517
|
let maxLogsHit = false;
|
|
443
518
|
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
444
519
|
for(; logIndex < txLogs.length; logIndex++){
|
|
@@ -16,6 +16,9 @@ export declare class MessageStore {
|
|
|
16
16
|
getSynchedL1Block(): Promise<L1BlockId | undefined>;
|
|
17
17
|
/** Sets the last L1 block synced */
|
|
18
18
|
setSynchedL1Block(l1Block: L1BlockId): Promise<void>;
|
|
19
|
+
/** Gets the L1 finalized block as of the last successful message sync. */
|
|
20
|
+
getMessagesFinalizedL1Block(): Promise<L1BlockId | undefined>;
|
|
21
|
+
private maybeAdvanceFinalizedL1Block;
|
|
19
22
|
/**
|
|
20
23
|
* Append L1 to L2 messages to the store.
|
|
21
24
|
* Requires new messages to be in order and strictly after the last message added.
|
|
@@ -29,6 +32,13 @@ export declare class MessageStore {
|
|
|
29
32
|
*/
|
|
30
33
|
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined>;
|
|
31
34
|
getLastMessage(): Promise<InboxMessage | undefined>;
|
|
35
|
+
/** Returns the inbox tree-in-progress checkpoint number from L1, or undefined if not yet set. */
|
|
36
|
+
getInboxTreeInProgress(): Promise<bigint | undefined>;
|
|
37
|
+
/**
|
|
38
|
+
* Atomically updates the message sync state: the L1 sync point, the inbox tree-in-progress marker, and
|
|
39
|
+
* (optionally) the L1 finalized block as of this sync. The finalized block is advanced monotonically.
|
|
40
|
+
*/
|
|
41
|
+
setMessageSyncState(l1Block: L1BlockId, treeInProgress: bigint | undefined, finalizedL1Block?: L1BlockId): Promise<void>;
|
|
32
42
|
getL1ToL2Messages(checkpointNumber: CheckpointNumber): Promise<Fr[]>;
|
|
33
43
|
iterateL1ToL2Messages(range?: CustomRange<bigint>): AsyncIterableIterator<InboxMessage>;
|
|
34
44
|
removeL1ToL2Messages(startIndex: bigint): Promise<void>;
|
|
@@ -37,4 +47,4 @@ export declare class MessageStore {
|
|
|
37
47
|
private leafToIndexKey;
|
|
38
48
|
private increaseTotalMessageCount;
|
|
39
49
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZV9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3JlL21lc3NhZ2Vfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSXBELE9BQU8sRUFDTCxLQUFLLGlCQUFpQixFQUd0QixLQUFLLFdBQVcsRUFFakIsTUFBTSxpQkFBaUIsQ0FBQztBQUl6QixPQUFPLEVBQ0wsS0FBSyxZQUFZLEVBSWxCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMscUJBQWEsaUJBQWtCLFNBQVEsS0FBSzthQUd4QixZQUFZLEVBQUUsWUFBWTtJQUY1QyxZQUNFLE9BQU8sRUFBRSxNQUFNLEVBQ0MsWUFBWSxFQUFFLFlBQVksRUFJM0M7Q0FDRjtBQUVELHFCQUFhLFlBQVk7O0lBZ0JYLE9BQU8sQ0FBQyxFQUFFO0lBQXRCLFlBQW9CLEVBQUUsRUFBRSxpQkFBaUIsRUFPeEM7SUFFWSwwQkFBMEIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBRXpEO0lBRUQscUNBQXFDO0lBQ3hCLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBUS9EO0lBRUQsb0NBQW9DO0lBQ3ZCLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUdoRTtJQUVELDBFQUEwRTtJQUM3RCwyQkFBMkIsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQU96RTtZQUdhLDRCQUE0QjtJQVMxQzs7OztPQUlHO0lBQ0ksaUJBQWlCLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FvRmhFO0lBRUQ7Ozs7T0FJRztJQUNJLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FFM0U7SUFFWSxjQUFjLElBQUksT0FBTyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FHL0Q7SUFFRCxpR0FBaUc7SUFDMUYsc0JBQXNCLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FFM0Q7SUFFRDs7O09BR0c7SUFDSSxtQkFBbUIsQ0FDeEIsT0FBTyxFQUFFLFNBQVMsRUFDbEIsY0FBYyxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQ2xDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxHQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLENBWWY7SUFFWSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0E0QmhGO0lBRWEscUJBQXFCLENBQUMsS0FBSyxHQUFFLFdBQVcsQ0FBQyxNQUFNLENBQU0sR0FBRyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FLeEc7SUFFTSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FnQjdEO0lBRU0sa0NBQWtDLENBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUlqRztJQUVELE9BQU8sQ0FBQyxVQUFVO0lBSWxCLE9BQU8sQ0FBQyxjQUFjO1lBSVIseUJBQXlCO0NBU3hDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_store.d.ts","sourceRoot":"","sources":["../../src/store/message_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIpD,OAAO,EACL,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"message_store.d.ts","sourceRoot":"","sources":["../../src/store/message_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIpD,OAAO,EACL,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,6BAA6B,CAAC;AAErC,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,YAAY,EAAE,YAAY;IAF5C,YACE,OAAO,EAAE,MAAM,EACC,YAAY,EAAE,YAAY,EAI3C;CACF;AAED,qBAAa,YAAY;;IAgBX,OAAO,CAAC,EAAE;IAAtB,YAAoB,EAAE,EAAE,iBAAiB,EAOxC;IAEY,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAEzD;IAED,qCAAqC;IACxB,iBAAiB,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAQ/D;IAED,oCAAoC;IACvB,iBAAiB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;IAED,0EAA0E;IAC7D,2BAA2B,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAOzE;YAGa,4BAA4B;IAS1C;;;;OAIG;IACI,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFhE;IAED;;;;OAIG;IACI,qBAAqB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE3E;IAEY,cAAc,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAG/D;IAED,iGAAiG;IAC1F,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE3D;IAED;;;OAGG;IACI,mBAAmB,CACxB,OAAO,EAAE,SAAS,EAClB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,gBAAgB,CAAC,EAAE,SAAS,GAC3B,OAAO,CAAC,IAAI,CAAC,CAYf;IAEY,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CA4BhF;IAEa,qBAAqB,CAAC,KAAK,GAAE,WAAW,CAAC,MAAM,CAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAKxG;IAEM,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7D;IAEM,kCAAkC,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjG;IAED,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,cAAc;YAIR,yBAAyB;CASxC"}
|
|
@@ -5,6 +5,7 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
5
5
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
6
6
|
import { mapRange } from '@aztec/kv-store';
|
|
7
7
|
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
8
|
+
import { L1ToL2MessagesNotReadyError } from '../errors.js';
|
|
8
9
|
import { deserializeInboxMessage, serializeInboxMessage, updateRollingHash } from '../structs/inbox_message.js';
|
|
9
10
|
export class MessageStoreError extends Error {
|
|
10
11
|
inboxMessage;
|
|
@@ -19,6 +20,8 @@ export class MessageStore {
|
|
|
19
20
|
/** Maps from hex-stringified message leaf to its index */ #l1ToL2MessageIndices;
|
|
20
21
|
/** Stores L1 block number and hash of the L1 synchpoint */ #lastSynchedL1Block;
|
|
21
22
|
/** Stores total messages stored */ #totalMessageCount;
|
|
23
|
+
/** Stores the checkpoint number whose message tree is currently being filled on L1. */ #inboxTreeInProgress;
|
|
24
|
+
/** Stores the L1 finalized block as of the last successful message sync. */ #messagesFinalizedL1Block;
|
|
22
25
|
#log;
|
|
23
26
|
constructor(db){
|
|
24
27
|
this.db = db;
|
|
@@ -27,6 +30,8 @@ export class MessageStore {
|
|
|
27
30
|
this.#l1ToL2MessageIndices = db.openMap('archiver_l1_to_l2_message_indices');
|
|
28
31
|
this.#lastSynchedL1Block = db.openSingleton('archiver_last_l1_block_id');
|
|
29
32
|
this.#totalMessageCount = db.openSingleton('archiver_l1_to_l2_message_count');
|
|
33
|
+
this.#inboxTreeInProgress = db.openSingleton('archiver_inbox_tree_in_progress');
|
|
34
|
+
this.#messagesFinalizedL1Block = db.openSingleton('archiver_messages_finalized_l1_block');
|
|
30
35
|
}
|
|
31
36
|
async getTotalL1ToL2MessageCount() {
|
|
32
37
|
return await this.#totalMessageCount.getAsync() ?? 0n;
|
|
@@ -49,6 +54,28 @@ export class MessageStore {
|
|
|
49
54
|
]);
|
|
50
55
|
await this.#lastSynchedL1Block.set(buffer);
|
|
51
56
|
}
|
|
57
|
+
/** Gets the L1 finalized block as of the last successful message sync. */ async getMessagesFinalizedL1Block() {
|
|
58
|
+
const buffer = await this.#messagesFinalizedL1Block.getAsync();
|
|
59
|
+
if (!buffer) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const reader = BufferReader.asReader(buffer);
|
|
63
|
+
return {
|
|
64
|
+
l1BlockNumber: reader.readUInt256(),
|
|
65
|
+
l1BlockHash: Buffer32.fromBuffer(reader.readBytes(Buffer32.SIZE))
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** Monotonically advances the persisted L1 finalized block for message sync. Never regresses. */ async maybeAdvanceFinalizedL1Block(l1Block) {
|
|
69
|
+
const existing = await this.getMessagesFinalizedL1Block();
|
|
70
|
+
if (existing && l1Block.l1BlockNumber <= existing.l1BlockNumber) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const buffer = serializeToBuffer([
|
|
74
|
+
l1Block.l1BlockNumber,
|
|
75
|
+
l1Block.l1BlockHash
|
|
76
|
+
]);
|
|
77
|
+
await this.#messagesFinalizedL1Block.set(buffer);
|
|
78
|
+
}
|
|
52
79
|
/**
|
|
53
80
|
* Append L1 to L2 messages to the store.
|
|
54
81
|
* Requires new messages to be in order and strictly after the last message added.
|
|
@@ -87,7 +114,7 @@ export class MessageStore {
|
|
|
87
114
|
if (lastMessage && message.checkpointNumber === lastMessage.checkpointNumber && message.index !== lastMessage.index + 1n) {
|
|
88
115
|
throw new MessageStoreError(`Missing prior message for incoming L1 to L2 message ${message.leaf.toString()} ` + `with index ${message.index}`, message);
|
|
89
116
|
}
|
|
90
|
-
// Check the first message in a
|
|
117
|
+
// Check the first message in a checkpoint has the correct index.
|
|
91
118
|
if ((!lastMessage || message.checkpointNumber > lastMessage.checkpointNumber) && message.index !== expectedStart) {
|
|
92
119
|
throw new MessageStoreError(`Message ${message.leaf.toString()} for checkpoint ${message.checkpointNumber} has wrong index ` + `${message.index} (expected ${expectedStart})`, message);
|
|
93
120
|
}
|
|
@@ -98,14 +125,6 @@ export class MessageStore {
|
|
|
98
125
|
this.#log.trace(`Inserted L1 to L2 message ${message.leaf} with index ${message.index} into the store`);
|
|
99
126
|
lastMessage = message;
|
|
100
127
|
}
|
|
101
|
-
// Update the L1 sync point to that of the last message added.
|
|
102
|
-
const currentSyncPoint = await this.getSynchedL1Block();
|
|
103
|
-
if (!currentSyncPoint || currentSyncPoint.l1BlockNumber < lastMessage.l1BlockNumber) {
|
|
104
|
-
await this.setSynchedL1Block({
|
|
105
|
-
l1BlockNumber: lastMessage.l1BlockNumber,
|
|
106
|
-
l1BlockHash: lastMessage.l1BlockHash
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
128
|
// Update total message count with the number of inserted messages.
|
|
110
129
|
await this.increaseTotalMessageCount(messageCount);
|
|
111
130
|
});
|
|
@@ -124,7 +143,30 @@ export class MessageStore {
|
|
|
124
143
|
}));
|
|
125
144
|
return msg ? deserializeInboxMessage(msg) : undefined;
|
|
126
145
|
}
|
|
146
|
+
/** Returns the inbox tree-in-progress checkpoint number from L1, or undefined if not yet set. */ getInboxTreeInProgress() {
|
|
147
|
+
return this.#inboxTreeInProgress.getAsync();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Atomically updates the message sync state: the L1 sync point, the inbox tree-in-progress marker, and
|
|
151
|
+
* (optionally) the L1 finalized block as of this sync. The finalized block is advanced monotonically.
|
|
152
|
+
*/ setMessageSyncState(l1Block, treeInProgress, finalizedL1Block) {
|
|
153
|
+
return this.db.transactionAsync(async ()=>{
|
|
154
|
+
await this.setSynchedL1Block(l1Block);
|
|
155
|
+
if (treeInProgress !== undefined) {
|
|
156
|
+
await this.#inboxTreeInProgress.set(treeInProgress);
|
|
157
|
+
} else {
|
|
158
|
+
await this.#inboxTreeInProgress.delete();
|
|
159
|
+
}
|
|
160
|
+
if (finalizedL1Block !== undefined) {
|
|
161
|
+
await this.maybeAdvanceFinalizedL1Block(finalizedL1Block);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
127
165
|
async getL1ToL2Messages(checkpointNumber) {
|
|
166
|
+
const treeInProgress = await this.#inboxTreeInProgress.getAsync();
|
|
167
|
+
if (treeInProgress !== undefined && BigInt(checkpointNumber) >= treeInProgress) {
|
|
168
|
+
throw new L1ToL2MessagesNotReadyError(checkpointNumber, treeInProgress);
|
|
169
|
+
}
|
|
128
170
|
const messages = [];
|
|
129
171
|
const [startIndex, endIndex] = InboxLeaf.indexRangeForCheckpoint(checkpointNumber);
|
|
130
172
|
let lastIndex = startIndex - 1n;
|
|
@@ -91,7 +91,9 @@ export declare class FakeL1State {
|
|
|
91
91
|
private provenCheckpointNumber;
|
|
92
92
|
private targetCommitteeSize;
|
|
93
93
|
private version;
|
|
94
|
+
private canPruneResult;
|
|
94
95
|
private pendingCheckpointNumber;
|
|
96
|
+
private finalizedL1BlockNumber;
|
|
95
97
|
constructor(config: FakeL1StateConfig);
|
|
96
98
|
/**
|
|
97
99
|
* Adds messages for a checkpoint. Returns the message leaves.
|
|
@@ -124,16 +126,34 @@ export declare class FakeL1State {
|
|
|
124
126
|
* Auto-updates pending checkpoint number based on visible checkpoints.
|
|
125
127
|
*/
|
|
126
128
|
setL1BlockNumber(blockNumber: bigint): void;
|
|
129
|
+
/**
|
|
130
|
+
* Sets the L1 block number that will be reported as "finalized". Pass `undefined` to
|
|
131
|
+
* simulate a chain that does not yet have a finalized block (devnet startup).
|
|
132
|
+
*/
|
|
133
|
+
setFinalizedL1BlockNumber(blockNumber: bigint | undefined): void;
|
|
127
134
|
/** Marks a checkpoint as proven. Updates provenCheckpointNumber. */
|
|
128
135
|
markCheckpointAsProven(checkpointNumber: CheckpointNumber): void;
|
|
136
|
+
/**
|
|
137
|
+
* Simulates what `rollup.getProvenCheckpointNumber({ blockNumber: atL1Block })` would return.
|
|
138
|
+
*/
|
|
139
|
+
getProvenCheckpointNumberAtL1Block(atL1Block: bigint): CheckpointNumber;
|
|
129
140
|
/** Sets the target committee size for attestation validation. */
|
|
130
141
|
setTargetCommitteeSize(size: number): void;
|
|
142
|
+
/** Sets whether the rollup contract would allow pruning at the next block. */
|
|
143
|
+
setCanPrune(value: boolean): void;
|
|
131
144
|
/**
|
|
132
145
|
* Removes all entries for a checkpoint number (simulates L1 reorg or prune).
|
|
133
146
|
* Note: Does NOT remove messages for this checkpoint (use numL1ToL2Messages: 0 when re-adding).
|
|
134
147
|
* Auto-updates pending status.
|
|
135
148
|
*/
|
|
136
149
|
removeCheckpoint(checkpointNumber: CheckpointNumber): void;
|
|
150
|
+
/**
|
|
151
|
+
* Moves a checkpoint to a different L1 block number (simulates L1 reorg that
|
|
152
|
+
* re-includes the same checkpoint transaction in a different block).
|
|
153
|
+
* The checkpoint content stays the same — only the L1 metadata changes.
|
|
154
|
+
* Auto-updates pending status.
|
|
155
|
+
*/
|
|
156
|
+
moveCheckpointToL1Block(checkpointNumber: CheckpointNumber, newL1BlockNumber: bigint): void;
|
|
137
157
|
/**
|
|
138
158
|
* Removes messages after a given total index (simulates L1 reorg).
|
|
139
159
|
* Auto-updates rolling hash.
|
|
@@ -182,9 +202,13 @@ export declare class FakeL1State {
|
|
|
182
202
|
private getNextBlockNumber;
|
|
183
203
|
private getCheckpointProposedLogs;
|
|
184
204
|
private getMessageSentLogs;
|
|
205
|
+
private getMessageSentLogByHash;
|
|
185
206
|
private makeRollupTx;
|
|
207
|
+
private getSignatureContext;
|
|
208
|
+
/** Extracts the CommitteeAttestations struct definition from RollupAbi for hash computation. */
|
|
209
|
+
private getCommitteeAttestationsStructDef;
|
|
186
210
|
private makeVersionedBlobHashes;
|
|
187
211
|
private makeBlobsFromCheckpoint;
|
|
188
212
|
}
|
|
189
213
|
export {};
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFrZV9sMV9zdGF0ZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvZmFrZV9sMV9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBcUQsTUFBTSxpQkFBaUIsQ0FBQztBQUUvRixPQUFPLEtBQUssRUFBeUIsYUFBYSxFQUFrQixjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV0SCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBb0IsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUF5RCxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFjMUQsMkNBQTJDO0FBQzNDLE1BQU0sTUFBTSxpQkFBaUIsR0FBRztJQUM5Qiw0QkFBNEI7SUFDNUIsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLDZCQUE2QjtJQUM3QixZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLGtDQUFrQztJQUNsQyxhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLHlDQUF5QztJQUN6QyxvQkFBb0IsRUFBRSxNQUFNLENBQUM7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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake_l1_state.d.ts","sourceRoot":"","sources":["../../src/test/fake_l1_state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,KAAK,IAAI,EAAqD,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"fake_l1_state.d.ts","sourceRoot":"","sources":["../../src/test/fake_l1_state.ts"],"names":[],"mappings":"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"}
|