@aztec/archiver 0.0.1-commit.d3ec352c → 0.0.1-commit.d58ff9d0
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 +164 -22
- package/dest/archiver.d.ts +194 -0
- package/dest/archiver.d.ts.map +1 -0
- package/dest/archiver.js +949 -0
- package/dest/config.d.ts +34 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +95 -0
- package/dest/errors.d.ts +87 -0
- package/dest/errors.d.ts.map +1 -0
- package/dest/errors.js +129 -0
- package/dest/factory.d.ts +16 -10
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +117 -20
- package/dest/index.d.ts +19 -4
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +17 -3
- package/dest/interfaces.d.ts +9 -0
- package/dest/interfaces.d.ts.map +1 -0
- package/dest/interfaces.js +3 -0
- package/dest/l1/bin/retrieve-calldata.d.ts +3 -0
- package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
- package/dest/l1/bin/retrieve-calldata.js +152 -0
- package/dest/l1/calldata_retriever.d.ts +143 -0
- package/dest/l1/calldata_retriever.d.ts.map +1 -0
- package/dest/l1/calldata_retriever.js +413 -0
- package/dest/l1/data_retrieval.d.ts +102 -0
- package/dest/l1/data_retrieval.d.ts.map +1 -0
- package/dest/{archiver → l1}/data_retrieval.js +85 -165
- package/dest/l1/debug_tx.d.ts +19 -0
- package/dest/l1/debug_tx.d.ts.map +1 -0
- package/dest/l1/debug_tx.js +73 -0
- package/dest/l1/spire_proposer.d.ts +70 -0
- package/dest/l1/spire_proposer.d.ts.map +1 -0
- package/dest/l1/spire_proposer.js +149 -0
- package/dest/l1/trace_tx.d.ts +43 -0
- package/dest/l1/trace_tx.d.ts.map +1 -0
- package/dest/l1/trace_tx.js +91 -0
- package/dest/l1/types.d.ts +12 -0
- package/dest/l1/types.d.ts.map +1 -0
- package/dest/l1/types.js +3 -0
- 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/l1/validate_trace.d.ts +32 -0
- package/dest/l1/validate_trace.d.ts.map +1 -0
- package/dest/l1/validate_trace.js +154 -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 +32 -0
- package/dest/modules/data_source_base.d.ts +112 -0
- package/dest/modules/data_source_base.d.ts.map +1 -0
- package/dest/modules/data_source_base.js +322 -0
- package/dest/modules/data_store_updater.d.ts +105 -0
- package/dest/modules/data_store_updater.d.ts.map +1 -0
- package/dest/modules/data_store_updater.js +393 -0
- package/dest/modules/instrumentation.d.ts +63 -0
- package/dest/modules/instrumentation.d.ts.map +1 -0
- package/dest/modules/instrumentation.js +166 -0
- package/dest/modules/l1_synchronizer.d.ts +77 -0
- package/dest/modules/l1_synchronizer.d.ts.map +1 -0
- package/dest/modules/l1_synchronizer.js +1381 -0
- package/dest/modules/outbox_trees_resolver.d.ts +62 -0
- package/dest/modules/outbox_trees_resolver.d.ts.map +1 -0
- package/dest/modules/outbox_trees_resolver.js +162 -0
- package/dest/modules/validation.d.ts +40 -0
- package/dest/modules/validation.d.ts.map +1 -0
- package/dest/{archiver → modules}/validation.js +41 -17
- package/dest/store/block_store.d.ts +303 -0
- package/dest/store/block_store.d.ts.map +1 -0
- package/dest/store/block_store.js +1206 -0
- package/dest/store/contract_class_store.d.ts +31 -0
- package/dest/store/contract_class_store.d.ts.map +1 -0
- package/dest/store/contract_class_store.js +98 -0
- package/dest/store/contract_instance_store.d.ts +51 -0
- package/dest/store/contract_instance_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +55 -3
- 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 +54 -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 +25 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +26 -0
- package/dest/store/log_store.d.ts +59 -0
- package/dest/store/log_store.d.ts.map +1 -0
- package/dest/store/log_store.js +310 -0
- package/dest/store/log_store_codec.d.ts +78 -0
- package/dest/store/log_store_codec.d.ts.map +1 -0
- package/dest/store/log_store_codec.js +110 -0
- package/dest/store/message_store.d.ts +50 -0
- package/dest/store/message_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/message_store.js +66 -23
- package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
- package/dest/structs/data_retrieval.d.ts.map +1 -0
- package/dest/structs/inbox_message.d.ts +15 -0
- package/dest/structs/inbox_message.d.ts.map +1 -0
- package/dest/{archiver/structs → structs}/inbox_message.js +6 -6
- package/dest/structs/published.d.ts +2 -0
- package/dest/structs/published.d.ts.map +1 -0
- package/dest/test/fake_l1_state.d.ts +214 -0
- package/dest/test/fake_l1_state.d.ts.map +1 -0
- package/dest/test/fake_l1_state.js +517 -0
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +4 -1
- package/dest/test/mock_archiver.d.ts +5 -6
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +8 -12
- package/dest/test/mock_l1_to_l2_message_source.d.ts +6 -7
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +19 -14
- package/dest/test/mock_l2_block_source.d.ts +68 -40
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +347 -145
- package/dest/test/mock_structs.d.ts +83 -4
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +157 -12
- package/dest/test/noop_l1_archiver.d.ts +34 -0
- package/dest/test/noop_l1_archiver.d.ts.map +1 -0
- package/dest/test/noop_l1_archiver.js +88 -0
- package/package.json +18 -18
- package/src/archiver.ts +785 -0
- package/src/config.ts +125 -0
- package/src/errors.ts +203 -0
- package/src/factory.ts +185 -22
- package/src/index.ts +27 -3
- package/src/interfaces.ts +9 -0
- package/src/l1/README.md +55 -0
- package/src/l1/bin/retrieve-calldata.ts +194 -0
- package/src/l1/calldata_retriever.ts +529 -0
- package/src/{archiver → l1}/data_retrieval.ts +157 -243
- package/src/l1/debug_tx.ts +99 -0
- package/src/l1/spire_proposer.ts +152 -0
- package/src/l1/trace_tx.ts +128 -0
- package/src/l1/types.ts +13 -0
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/l1/validate_trace.ts +229 -0
- package/src/modules/contract_data_source_adapter.ts +46 -0
- package/src/modules/data_source_base.ts +466 -0
- package/src/modules/data_store_updater.ts +519 -0
- package/src/modules/instrumentation.ts +217 -0
- package/src/modules/l1_synchronizer.ts +1320 -0
- package/src/modules/outbox_trees_resolver.ts +199 -0
- package/src/modules/validation.ts +186 -0
- package/src/store/block_store.ts +1551 -0
- package/src/store/contract_class_store.ts +126 -0
- package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +70 -7
- package/src/store/data_stores.ts +104 -0
- package/src/store/function_names_cache.ts +37 -0
- package/src/store/l2_tips_cache.ts +35 -0
- package/src/store/log_store.ts +380 -0
- package/src/store/log_store_codec.ts +143 -0
- package/src/{archiver/kv_archiver_store → store}/message_store.ts +81 -28
- package/src/{archiver/structs → structs}/inbox_message.ts +8 -9
- package/src/{archiver/structs → structs}/published.ts +0 -1
- package/src/test/fake_l1_state.ts +770 -0
- package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
- package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
- package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
- package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
- package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
- package/src/test/fixtures/trace_transaction-proxied.json +128 -0
- package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
- package/src/test/index.ts +4 -0
- package/src/test/mock_archiver.ts +10 -14
- package/src/test/mock_l1_to_l2_message_source.ts +16 -15
- package/src/test/mock_l2_block_source.ts +416 -161
- package/src/test/mock_structs.ts +292 -14
- package/src/test/noop_l1_archiver.ts +158 -0
- package/dest/archiver/archiver.d.ts +0 -290
- package/dest/archiver/archiver.d.ts.map +0 -1
- package/dest/archiver/archiver.js +0 -1434
- package/dest/archiver/archiver_store.d.ts +0 -256
- package/dest/archiver/archiver_store.d.ts.map +0 -1
- package/dest/archiver/archiver_store.js +0 -4
- package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
- package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
- package/dest/archiver/archiver_store_test_suite.js +0 -1289
- package/dest/archiver/config.d.ts +0 -21
- package/dest/archiver/config.d.ts.map +0 -1
- package/dest/archiver/config.js +0 -55
- package/dest/archiver/data_retrieval.d.ts +0 -80
- package/dest/archiver/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/errors.d.ts +0 -12
- package/dest/archiver/errors.d.ts.map +0 -1
- package/dest/archiver/errors.js +0 -17
- package/dest/archiver/index.d.ts +0 -7
- package/dest/archiver/index.d.ts.map +0 -1
- package/dest/archiver/index.js +0 -4
- package/dest/archiver/instrumentation.d.ts +0 -35
- package/dest/archiver/instrumentation.d.ts.map +0 -1
- package/dest/archiver/instrumentation.js +0 -140
- package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -125
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_store.js +0 -371
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_class_store.js +0 -120
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -169
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -296
- package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -49
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/log_store.js +0 -337
- package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -39
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
- package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/structs/inbox_message.d.ts +0 -15
- package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
- package/dest/archiver/structs/published.d.ts +0 -3
- package/dest/archiver/structs/published.d.ts.map +0 -1
- package/dest/archiver/validation.d.ts +0 -17
- package/dest/archiver/validation.d.ts.map +0 -1
- package/dest/rpc/index.d.ts +0 -9
- package/dest/rpc/index.d.ts.map +0 -1
- package/dest/rpc/index.js +0 -15
- package/src/archiver/archiver.ts +0 -1880
- package/src/archiver/archiver_store.ts +0 -310
- package/src/archiver/archiver_store_test_suite.ts +0 -1295
- package/src/archiver/config.ts +0 -79
- package/src/archiver/errors.ts +0 -26
- package/src/archiver/index.ts +0 -6
- package/src/archiver/instrumentation.ts +0 -187
- package/src/archiver/kv_archiver_store/block_store.ts +0 -482
- package/src/archiver/kv_archiver_store/contract_class_store.ts +0 -176
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -423
- package/src/archiver/kv_archiver_store/log_store.ts +0 -407
- package/src/archiver/validation.ts +0 -124
- package/src/rpc/index.ts +0 -16
- /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
- /package/dest/{archiver/structs → structs}/published.js +0 -0
- /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { L1BlockId } from '@aztec/ethereum';
|
|
1
|
+
import type { L1BlockId } from '@aztec/ethereum/l1-types';
|
|
2
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
3
|
-
import { Fr } from '@aztec/foundation/
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
5
|
import { toArray } from '@aztec/foundation/iterable';
|
|
5
6
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
7
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
@@ -13,6 +14,7 @@ import {
|
|
|
13
14
|
} from '@aztec/kv-store';
|
|
14
15
|
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
15
16
|
|
|
17
|
+
import { L1ToL2MessagesNotReadyError } from '../errors.js';
|
|
16
18
|
import {
|
|
17
19
|
type InboxMessage,
|
|
18
20
|
deserializeInboxMessage,
|
|
@@ -39,6 +41,10 @@ export class MessageStore {
|
|
|
39
41
|
#lastSynchedL1Block: AztecAsyncSingleton<Buffer>;
|
|
40
42
|
/** Stores total messages stored */
|
|
41
43
|
#totalMessageCount: AztecAsyncSingleton<bigint>;
|
|
44
|
+
/** Stores the checkpoint number whose message tree is currently being filled on L1. */
|
|
45
|
+
#inboxTreeInProgress: AztecAsyncSingleton<bigint>;
|
|
46
|
+
/** Stores the L1 finalized block as of the last successful message sync. */
|
|
47
|
+
#messagesFinalizedL1Block: AztecAsyncSingleton<Buffer>;
|
|
42
48
|
|
|
43
49
|
#log = createLogger('archiver:message_store');
|
|
44
50
|
|
|
@@ -47,6 +53,8 @@ export class MessageStore {
|
|
|
47
53
|
this.#l1ToL2MessageIndices = db.openMap('archiver_l1_to_l2_message_indices');
|
|
48
54
|
this.#lastSynchedL1Block = db.openSingleton('archiver_last_l1_block_id');
|
|
49
55
|
this.#totalMessageCount = db.openSingleton('archiver_l1_to_l2_message_count');
|
|
56
|
+
this.#inboxTreeInProgress = db.openSingleton('archiver_inbox_tree_in_progress');
|
|
57
|
+
this.#messagesFinalizedL1Block = db.openSingleton('archiver_messages_finalized_l1_block');
|
|
50
58
|
}
|
|
51
59
|
|
|
52
60
|
public async getTotalL1ToL2MessageCount(): Promise<bigint> {
|
|
@@ -70,6 +78,26 @@ export class MessageStore {
|
|
|
70
78
|
await this.#lastSynchedL1Block.set(buffer);
|
|
71
79
|
}
|
|
72
80
|
|
|
81
|
+
/** Gets the L1 finalized block as of the last successful message sync. */
|
|
82
|
+
public async getMessagesFinalizedL1Block(): Promise<L1BlockId | undefined> {
|
|
83
|
+
const buffer = await this.#messagesFinalizedL1Block.getAsync();
|
|
84
|
+
if (!buffer) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
const reader = BufferReader.asReader(buffer);
|
|
88
|
+
return { l1BlockNumber: reader.readUInt256(), l1BlockHash: Buffer32.fromBuffer(reader.readBytes(Buffer32.SIZE)) };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Monotonically advances the persisted L1 finalized block for message sync. Never regresses. */
|
|
92
|
+
private async maybeAdvanceFinalizedL1Block(l1Block: L1BlockId): Promise<void> {
|
|
93
|
+
const existing = await this.getMessagesFinalizedL1Block();
|
|
94
|
+
if (existing && l1Block.l1BlockNumber <= existing.l1BlockNumber) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const buffer = serializeToBuffer([l1Block.l1BlockNumber, l1Block.l1BlockHash]);
|
|
98
|
+
await this.#messagesFinalizedL1Block.set(buffer);
|
|
99
|
+
}
|
|
100
|
+
|
|
73
101
|
/**
|
|
74
102
|
* Append L1 to L2 messages to the store.
|
|
75
103
|
* Requires new messages to be in order and strictly after the last message added.
|
|
@@ -113,20 +141,20 @@ export class MessageStore {
|
|
|
113
141
|
);
|
|
114
142
|
}
|
|
115
143
|
|
|
116
|
-
// Check index corresponds to the
|
|
117
|
-
const [expectedStart, expectedEnd] = InboxLeaf.
|
|
144
|
+
// Check index corresponds to the checkpoint number.
|
|
145
|
+
const [expectedStart, expectedEnd] = InboxLeaf.indexRangeForCheckpoint(message.checkpointNumber);
|
|
118
146
|
if (message.index < expectedStart || message.index >= expectedEnd) {
|
|
119
147
|
throw new MessageStoreError(
|
|
120
148
|
`Invalid index ${message.index} for incoming L1 to L2 message ${message.leaf.toString()} ` +
|
|
121
|
-
`at
|
|
149
|
+
`at checkpoint ${message.checkpointNumber} (expected value in range [${expectedStart}, ${expectedEnd}))`,
|
|
122
150
|
message,
|
|
123
151
|
);
|
|
124
152
|
}
|
|
125
153
|
|
|
126
|
-
// Check there are no gaps in the indices within the same
|
|
154
|
+
// Check there are no gaps in the indices within the same checkpoint.
|
|
127
155
|
if (
|
|
128
156
|
lastMessage &&
|
|
129
|
-
message.
|
|
157
|
+
message.checkpointNumber === lastMessage.checkpointNumber &&
|
|
130
158
|
message.index !== lastMessage.index + 1n
|
|
131
159
|
) {
|
|
132
160
|
throw new MessageStoreError(
|
|
@@ -136,14 +164,14 @@ export class MessageStore {
|
|
|
136
164
|
);
|
|
137
165
|
}
|
|
138
166
|
|
|
139
|
-
// Check the first message in a
|
|
167
|
+
// Check the first message in a checkpoint has the correct index.
|
|
140
168
|
if (
|
|
141
|
-
(!lastMessage || message.
|
|
142
|
-
message.index !==
|
|
169
|
+
(!lastMessage || message.checkpointNumber > lastMessage.checkpointNumber) &&
|
|
170
|
+
message.index !== expectedStart
|
|
143
171
|
) {
|
|
144
172
|
throw new MessageStoreError(
|
|
145
|
-
`Message ${message.leaf.toString()} for
|
|
146
|
-
`${message.index} (expected ${
|
|
173
|
+
`Message ${message.leaf.toString()} for checkpoint ${message.checkpointNumber} has wrong index ` +
|
|
174
|
+
`${message.index} (expected ${expectedStart})`,
|
|
147
175
|
message,
|
|
148
176
|
);
|
|
149
177
|
}
|
|
@@ -156,15 +184,6 @@ export class MessageStore {
|
|
|
156
184
|
lastMessage = message;
|
|
157
185
|
}
|
|
158
186
|
|
|
159
|
-
// Update the L1 sync point to that of the last message added.
|
|
160
|
-
const currentSyncPoint = await this.getSynchedL1Block();
|
|
161
|
-
if (!currentSyncPoint || currentSyncPoint.l1BlockNumber < lastMessage!.l1BlockNumber) {
|
|
162
|
-
await this.setSynchedL1Block({
|
|
163
|
-
l1BlockNumber: lastMessage!.l1BlockNumber,
|
|
164
|
-
l1BlockHash: lastMessage!.l1BlockHash,
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
|
|
168
187
|
// Update total message count with the number of inserted messages.
|
|
169
188
|
await this.increaseTotalMessageCount(messageCount);
|
|
170
189
|
});
|
|
@@ -184,10 +203,42 @@ export class MessageStore {
|
|
|
184
203
|
return msg ? deserializeInboxMessage(msg) : undefined;
|
|
185
204
|
}
|
|
186
205
|
|
|
187
|
-
|
|
206
|
+
/** Returns the inbox tree-in-progress checkpoint number from L1, or undefined if not yet set. */
|
|
207
|
+
public getInboxTreeInProgress(): Promise<bigint | undefined> {
|
|
208
|
+
return this.#inboxTreeInProgress.getAsync();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Atomically updates the message sync state: the L1 sync point, the inbox tree-in-progress marker, and
|
|
213
|
+
* (optionally) the L1 finalized block as of this sync. The finalized block is advanced monotonically.
|
|
214
|
+
*/
|
|
215
|
+
public setMessageSyncState(
|
|
216
|
+
l1Block: L1BlockId,
|
|
217
|
+
treeInProgress: bigint | undefined,
|
|
218
|
+
finalizedL1Block?: L1BlockId,
|
|
219
|
+
): Promise<void> {
|
|
220
|
+
return this.db.transactionAsync(async () => {
|
|
221
|
+
await this.setSynchedL1Block(l1Block);
|
|
222
|
+
if (treeInProgress !== undefined) {
|
|
223
|
+
await this.#inboxTreeInProgress.set(treeInProgress);
|
|
224
|
+
} else {
|
|
225
|
+
await this.#inboxTreeInProgress.delete();
|
|
226
|
+
}
|
|
227
|
+
if (finalizedL1Block !== undefined) {
|
|
228
|
+
await this.maybeAdvanceFinalizedL1Block(finalizedL1Block);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public async getL1ToL2Messages(checkpointNumber: CheckpointNumber): Promise<Fr[]> {
|
|
234
|
+
const treeInProgress = await this.#inboxTreeInProgress.getAsync();
|
|
235
|
+
if (treeInProgress !== undefined && BigInt(checkpointNumber) >= treeInProgress) {
|
|
236
|
+
throw new L1ToL2MessagesNotReadyError(checkpointNumber, treeInProgress);
|
|
237
|
+
}
|
|
238
|
+
|
|
188
239
|
const messages: Fr[] = [];
|
|
189
240
|
|
|
190
|
-
const [startIndex, endIndex] = InboxLeaf.
|
|
241
|
+
const [startIndex, endIndex] = InboxLeaf.indexRangeForCheckpoint(checkpointNumber);
|
|
191
242
|
let lastIndex = startIndex - 1n;
|
|
192
243
|
|
|
193
244
|
for await (const msgBuffer of this.#l1ToL2Messages.valuesAsync({
|
|
@@ -195,8 +246,10 @@ export class MessageStore {
|
|
|
195
246
|
end: this.indexToKey(endIndex),
|
|
196
247
|
})) {
|
|
197
248
|
const msg = deserializeInboxMessage(msgBuffer);
|
|
198
|
-
if (msg.
|
|
199
|
-
throw new Error(
|
|
249
|
+
if (msg.checkpointNumber !== checkpointNumber) {
|
|
250
|
+
throw new Error(
|
|
251
|
+
`L1 to L2 message with index ${msg.index} has invalid checkpoint number ${msg.checkpointNumber}`,
|
|
252
|
+
);
|
|
200
253
|
} else if (msg.index !== lastIndex + 1n) {
|
|
201
254
|
throw new Error(`Expected L1 to L2 message with index ${lastIndex + 1n} but got ${msg.index}`);
|
|
202
255
|
}
|
|
@@ -232,9 +285,9 @@ export class MessageStore {
|
|
|
232
285
|
});
|
|
233
286
|
}
|
|
234
287
|
|
|
235
|
-
public
|
|
236
|
-
this.#log.debug(`Deleting L1 to L2 messages up to target
|
|
237
|
-
const startIndex = InboxLeaf.
|
|
288
|
+
public rollbackL1ToL2MessagesToCheckpoint(targetCheckpointNumber: CheckpointNumber): Promise<void> {
|
|
289
|
+
this.#log.debug(`Deleting L1 to L2 messages up to target checkpoint ${targetCheckpointNumber}`);
|
|
290
|
+
const startIndex = InboxLeaf.smallestIndexForCheckpoint(CheckpointNumber(targetCheckpointNumber + 1));
|
|
238
291
|
return this.removeL1ToL2Messages(startIndex);
|
|
239
292
|
}
|
|
240
293
|
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
3
|
-
import { keccak256 } from '@aztec/foundation/crypto';
|
|
4
|
-
import { Fr } from '@aztec/foundation/
|
|
3
|
+
import { keccak256 } from '@aztec/foundation/crypto/keccak';
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { BufferReader, bigintToUInt64BE, numToUInt32BE, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
6
6
|
|
|
7
7
|
export type InboxMessage = {
|
|
8
8
|
index: bigint;
|
|
9
9
|
leaf: Fr;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
l1BlockNumber: bigint; // L1 block number - NOT Aztec L2
|
|
10
|
+
checkpointNumber: CheckpointNumber;
|
|
11
|
+
l1BlockNumber: bigint;
|
|
13
12
|
l1BlockHash: Buffer32;
|
|
14
13
|
rollingHash: Buffer16;
|
|
15
14
|
};
|
|
@@ -25,7 +24,7 @@ export function serializeInboxMessage(message: InboxMessage): Buffer {
|
|
|
25
24
|
message.leaf,
|
|
26
25
|
message.l1BlockHash,
|
|
27
26
|
numToUInt32BE(Number(message.l1BlockNumber)),
|
|
28
|
-
numToUInt32BE(message.
|
|
27
|
+
numToUInt32BE(message.checkpointNumber),
|
|
29
28
|
message.rollingHash,
|
|
30
29
|
]);
|
|
31
30
|
}
|
|
@@ -36,7 +35,7 @@ export function deserializeInboxMessage(buffer: Buffer): InboxMessage {
|
|
|
36
35
|
const leaf = reader.readObject(Fr);
|
|
37
36
|
const l1BlockHash = reader.readObject(Buffer32);
|
|
38
37
|
const l1BlockNumber = BigInt(reader.readNumber());
|
|
39
|
-
const
|
|
38
|
+
const checkpointNumber = CheckpointNumber(reader.readNumber());
|
|
40
39
|
const rollingHash = reader.readObject(Buffer16);
|
|
41
|
-
return { index, leaf, l1BlockHash, l1BlockNumber,
|
|
40
|
+
return { index, leaf, l1BlockHash, l1BlockNumber, checkpointNumber, rollingHash };
|
|
42
41
|
}
|