@aztec/archiver 0.0.0-test.1 → 0.0.1-commit.1142ef1
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 +204 -94
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +1616 -414
- package/dest/archiver/archiver_store.d.ts +178 -83
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +2373 -397
- package/dest/archiver/config.d.ts +7 -22
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +30 -14
- package/dest/archiver/errors.d.ts +33 -1
- package/dest/archiver/errors.d.ts.map +1 -1
- package/dest/archiver/errors.js +49 -0
- package/dest/archiver/index.d.ts +3 -4
- package/dest/archiver/index.d.ts.map +1 -1
- package/dest/archiver/index.js +1 -2
- package/dest/archiver/instrumentation.d.ts +14 -6
- package/dest/archiver/instrumentation.d.ts.map +1 -1
- package/dest/archiver/instrumentation.js +45 -41
- package/dest/archiver/kv_archiver_store/block_store.d.ts +98 -21
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +495 -86
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +4 -4
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/contract_class_store.js +13 -19
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +12 -9
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/contract_instance_store.js +30 -16
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +81 -75
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +145 -83
- package/dest/archiver/kv_archiver_store/log_store.d.ts +12 -16
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/log_store.js +151 -114
- package/dest/archiver/kv_archiver_store/message_store.d.ts +25 -18
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/message_store.js +152 -49
- package/dest/archiver/l1/bin/retrieve-calldata.d.ts +3 -0
- package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +1 -0
- package/dest/archiver/l1/bin/retrieve-calldata.js +149 -0
- package/dest/archiver/l1/calldata_retriever.d.ts +112 -0
- package/dest/archiver/l1/calldata_retriever.d.ts.map +1 -0
- package/dest/archiver/l1/calldata_retriever.js +471 -0
- package/dest/archiver/l1/data_retrieval.d.ts +90 -0
- package/dest/archiver/l1/data_retrieval.d.ts.map +1 -0
- package/dest/archiver/l1/data_retrieval.js +331 -0
- package/dest/archiver/l1/debug_tx.d.ts +19 -0
- package/dest/archiver/l1/debug_tx.d.ts.map +1 -0
- package/dest/archiver/l1/debug_tx.js +73 -0
- package/dest/archiver/l1/spire_proposer.d.ts +70 -0
- package/dest/archiver/l1/spire_proposer.d.ts.map +1 -0
- package/dest/archiver/l1/spire_proposer.js +157 -0
- package/dest/archiver/l1/trace_tx.d.ts +97 -0
- package/dest/archiver/l1/trace_tx.d.ts.map +1 -0
- package/dest/archiver/l1/trace_tx.js +91 -0
- package/dest/archiver/l1/types.d.ts +12 -0
- package/dest/archiver/l1/types.d.ts.map +1 -0
- package/dest/archiver/l1/types.js +3 -0
- package/dest/archiver/l1/validate_trace.d.ts +29 -0
- package/dest/archiver/l1/validate_trace.d.ts.map +1 -0
- package/dest/archiver/l1/validate_trace.js +150 -0
- package/dest/archiver/structs/data_retrieval.d.ts +1 -1
- package/dest/archiver/structs/inbox_message.d.ts +15 -0
- package/dest/archiver/structs/inbox_message.d.ts.map +1 -0
- package/dest/archiver/structs/inbox_message.js +39 -0
- package/dest/archiver/structs/published.d.ts +2 -11
- package/dest/archiver/structs/published.d.ts.map +1 -1
- package/dest/archiver/structs/published.js +1 -1
- package/dest/archiver/validation.d.ts +17 -0
- package/dest/archiver/validation.d.ts.map +1 -0
- package/dest/archiver/validation.js +98 -0
- package/dest/factory.d.ts +9 -14
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +22 -52
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/rpc/index.d.ts +2 -3
- package/dest/rpc/index.d.ts.map +1 -1
- package/dest/rpc/index.js +1 -4
- package/dest/test/index.d.ts +1 -1
- package/dest/test/mock_archiver.d.ts +16 -8
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +19 -14
- package/dest/test/mock_l1_to_l2_message_source.d.ts +9 -6
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +30 -7
- package/dest/test/mock_l2_block_source.d.ts +56 -13
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +196 -25
- package/dest/test/mock_structs.d.ts +10 -0
- package/dest/test/mock_structs.d.ts.map +1 -0
- package/dest/test/mock_structs.js +38 -0
- package/package.json +29 -30
- package/src/archiver/archiver.ts +1596 -512
- package/src/archiver/archiver_store.ts +205 -88
- package/src/archiver/archiver_store_test_suite.ts +2386 -354
- package/src/archiver/config.ts +38 -46
- package/src/archiver/errors.ts +85 -0
- package/src/archiver/index.ts +2 -3
- package/src/archiver/instrumentation.ts +65 -45
- package/src/archiver/kv_archiver_store/block_store.ts +668 -101
- package/src/archiver/kv_archiver_store/contract_class_store.ts +14 -24
- package/src/archiver/kv_archiver_store/contract_instance_store.ts +36 -28
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +197 -113
- package/src/archiver/kv_archiver_store/log_store.ts +204 -132
- package/src/archiver/kv_archiver_store/message_store.ts +213 -54
- package/src/archiver/l1/README.md +98 -0
- package/src/archiver/l1/bin/retrieve-calldata.ts +182 -0
- package/src/archiver/l1/calldata_retriever.ts +641 -0
- package/src/archiver/l1/data_retrieval.ts +512 -0
- package/src/archiver/l1/debug_tx.ts +99 -0
- package/src/archiver/l1/spire_proposer.ts +160 -0
- package/src/archiver/l1/trace_tx.ts +128 -0
- package/src/archiver/l1/types.ts +13 -0
- package/src/archiver/l1/validate_trace.ts +211 -0
- package/src/archiver/structs/inbox_message.ts +41 -0
- package/src/archiver/structs/published.ts +1 -11
- package/src/archiver/validation.ts +124 -0
- package/src/factory.ts +28 -69
- package/src/index.ts +1 -1
- package/src/rpc/index.ts +1 -5
- 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/mock_archiver.ts +22 -16
- package/src/test/mock_l1_to_l2_message_source.ts +26 -8
- package/src/test/mock_l2_block_source.ts +254 -31
- package/src/test/mock_structs.ts +50 -0
- package/dest/archiver/data_retrieval.d.ts +0 -74
- package/dest/archiver/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/data_retrieval.js +0 -283
- package/dest/archiver/kv_archiver_store/nullifier_store.d.ts +0 -12
- package/dest/archiver/kv_archiver_store/nullifier_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/nullifier_store.js +0 -73
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +0 -23
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +0 -1
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +0 -49
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +0 -175
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +0 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +0 -636
- package/src/archiver/data_retrieval.ts +0 -422
- package/src/archiver/kv_archiver_store/nullifier_store.ts +0 -97
- package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +0 -61
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +0 -801
|
@@ -1,24 +1,44 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GENESIS_ARCHIVE_ROOT } from '@aztec/constants';
|
|
2
|
+
import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
|
|
3
|
+
import { BlockNumber, CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
5
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
6
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
8
|
+
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
9
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
10
|
+
import {
|
|
11
|
+
CheckpointedL2Block,
|
|
12
|
+
L2Block,
|
|
13
|
+
L2BlockHash,
|
|
14
|
+
L2BlockNew,
|
|
15
|
+
type L2BlockSource,
|
|
16
|
+
type L2Tips,
|
|
17
|
+
PublishedL2Block,
|
|
18
|
+
type ValidateCheckpointResult,
|
|
19
|
+
} from '@aztec/stdlib/block';
|
|
20
|
+
import { type Checkpoint, L1PublishedData } from '@aztec/stdlib/checkpoint';
|
|
21
|
+
import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
22
|
+
import { EmptyL1RollupConstants, type L1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
6
23
|
import { type BlockHeader, TxHash, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
24
|
+
import type { UInt64 } from '@aztec/stdlib/types';
|
|
7
25
|
|
|
8
26
|
/**
|
|
9
27
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
10
28
|
*/
|
|
11
|
-
export class MockL2BlockSource implements L2BlockSource {
|
|
29
|
+
export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
|
|
12
30
|
protected l2Blocks: L2Block[] = [];
|
|
13
31
|
|
|
14
32
|
private provenBlockNumber: number = 0;
|
|
33
|
+
private finalizedBlockNumber: number = 0;
|
|
34
|
+
private checkpointedBlockNumber: number = 0;
|
|
15
35
|
|
|
16
36
|
private log = createLogger('archiver:mock_l2_block_source');
|
|
17
37
|
|
|
18
38
|
public async createBlocks(numBlocks: number) {
|
|
19
39
|
for (let i = 0; i < numBlocks; i++) {
|
|
20
40
|
const blockNum = this.l2Blocks.length + 1;
|
|
21
|
-
const block = await L2Block.random(blockNum);
|
|
41
|
+
const block = await L2Block.random(BlockNumber(blockNum));
|
|
22
42
|
this.l2Blocks.push(block);
|
|
23
43
|
}
|
|
24
44
|
|
|
@@ -39,6 +59,17 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
39
59
|
this.provenBlockNumber = provenBlockNumber;
|
|
40
60
|
}
|
|
41
61
|
|
|
62
|
+
public setFinalizedBlockNumber(finalizedBlockNumber: number) {
|
|
63
|
+
if (finalizedBlockNumber > this.provenBlockNumber) {
|
|
64
|
+
this.provenBlockNumber = finalizedBlockNumber;
|
|
65
|
+
}
|
|
66
|
+
this.finalizedBlockNumber = finalizedBlockNumber;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public setCheckpointedBlockNumber(checkpointedBlockNumber: number) {
|
|
70
|
+
this.checkpointedBlockNumber = checkpointedBlockNumber;
|
|
71
|
+
}
|
|
72
|
+
|
|
42
73
|
/**
|
|
43
74
|
* Method to fetch the rollup contract address at the base-layer.
|
|
44
75
|
* @returns The rollup address.
|
|
@@ -60,11 +91,47 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
60
91
|
* @returns In this mock instance, returns the number of L2 blocks that we've mocked.
|
|
61
92
|
*/
|
|
62
93
|
public getBlockNumber() {
|
|
63
|
-
return Promise.resolve(this.l2Blocks.length);
|
|
94
|
+
return Promise.resolve(BlockNumber(this.l2Blocks.length));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public getProvenBlockNumber() {
|
|
98
|
+
return Promise.resolve(BlockNumber(this.provenBlockNumber));
|
|
64
99
|
}
|
|
65
100
|
|
|
66
|
-
public
|
|
67
|
-
|
|
101
|
+
public getCheckpointedBlock(number: BlockNumber): Promise<CheckpointedL2Block | undefined> {
|
|
102
|
+
if (number > this.checkpointedBlockNumber) {
|
|
103
|
+
return Promise.resolve(undefined);
|
|
104
|
+
}
|
|
105
|
+
const block = this.l2Blocks[number - 1];
|
|
106
|
+
if (!block) {
|
|
107
|
+
return Promise.resolve(undefined);
|
|
108
|
+
}
|
|
109
|
+
const checkpointedBlock = new CheckpointedL2Block(
|
|
110
|
+
CheckpointNumber(number),
|
|
111
|
+
block.toL2Block(),
|
|
112
|
+
new L1PublishedData(BigInt(number), BigInt(number), `0x${number.toString(16).padStart(64, '0')}`),
|
|
113
|
+
[],
|
|
114
|
+
);
|
|
115
|
+
return Promise.resolve(checkpointedBlock);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public async getCheckpointedBlocks(
|
|
119
|
+
from: BlockNumber,
|
|
120
|
+
limit: number,
|
|
121
|
+
_proven?: boolean,
|
|
122
|
+
): Promise<CheckpointedL2Block[]> {
|
|
123
|
+
const result: CheckpointedL2Block[] = [];
|
|
124
|
+
for (let i = 0; i < limit; i++) {
|
|
125
|
+
const blockNum = from + i;
|
|
126
|
+
if (blockNum > this.checkpointedBlockNumber) {
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
const block = await this.getCheckpointedBlock(BlockNumber(blockNum));
|
|
130
|
+
if (block) {
|
|
131
|
+
result.push(block);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
68
135
|
}
|
|
69
136
|
|
|
70
137
|
/**
|
|
@@ -76,6 +143,16 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
76
143
|
return Promise.resolve(this.l2Blocks[number - 1]);
|
|
77
144
|
}
|
|
78
145
|
|
|
146
|
+
/**
|
|
147
|
+
* Gets an L2 block (new format).
|
|
148
|
+
* @param number - The block number to return.
|
|
149
|
+
* @returns The requested L2 block.
|
|
150
|
+
*/
|
|
151
|
+
public getL2BlockNew(number: BlockNumber): Promise<L2BlockNew | undefined> {
|
|
152
|
+
const block = this.l2Blocks[number - 1];
|
|
153
|
+
return Promise.resolve(block?.toL2Block());
|
|
154
|
+
}
|
|
155
|
+
|
|
79
156
|
/**
|
|
80
157
|
* Gets up to `limit` amount of L2 blocks starting from `from`.
|
|
81
158
|
* @param from - Number of the first block to return (inclusive).
|
|
@@ -90,24 +167,103 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
90
167
|
);
|
|
91
168
|
}
|
|
92
169
|
|
|
170
|
+
public async getPublishedCheckpoints(from: CheckpointNumber, limit: number) {
|
|
171
|
+
// TODO: Implement this properly. This only works when we have one block per checkpoint.
|
|
172
|
+
return (await this.getPublishedBlocks(from, limit)).map(block => block.toPublishedCheckpoint());
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public async getCheckpointByArchive(archive: Fr): Promise<Checkpoint | undefined> {
|
|
176
|
+
// TODO: Implement this properly. This only works when we have one block per checkpoint.
|
|
177
|
+
return (await this.getPublishedBlockByArchive(archive))?.block.toCheckpoint();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public async getPublishedBlocks(from: number, limit: number, proven?: boolean) {
|
|
181
|
+
const blocks = await this.getBlocks(from, limit, proven);
|
|
182
|
+
return blocks.map(block =>
|
|
183
|
+
PublishedL2Block.fromFields({
|
|
184
|
+
block,
|
|
185
|
+
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
186
|
+
attestations: [],
|
|
187
|
+
}),
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async getL2BlocksNew(from: BlockNumber, limit: number, proven?: boolean): Promise<L2BlockNew[]> {
|
|
192
|
+
const blocks = await this.getBlocks(from, limit, proven);
|
|
193
|
+
return blocks.map(x => x.toL2Block());
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public async getPublishedBlockByHash(blockHash: Fr): Promise<PublishedL2Block | undefined> {
|
|
197
|
+
for (const block of this.l2Blocks) {
|
|
198
|
+
const hash = await block.hash();
|
|
199
|
+
if (hash.equals(blockHash)) {
|
|
200
|
+
return PublishedL2Block.fromFields({
|
|
201
|
+
block,
|
|
202
|
+
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
203
|
+
attestations: [],
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
public getPublishedBlockByArchive(archive: Fr): Promise<PublishedL2Block | undefined> {
|
|
211
|
+
const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
|
|
212
|
+
if (!block) {
|
|
213
|
+
return Promise.resolve(undefined);
|
|
214
|
+
}
|
|
215
|
+
return Promise.resolve(
|
|
216
|
+
PublishedL2Block.fromFields({
|
|
217
|
+
block,
|
|
218
|
+
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
219
|
+
attestations: [],
|
|
220
|
+
}),
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public async getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined> {
|
|
225
|
+
for (const block of this.l2Blocks) {
|
|
226
|
+
const hash = await block.hash();
|
|
227
|
+
if (hash.equals(blockHash)) {
|
|
228
|
+
return block.getBlockHeader();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
public getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined> {
|
|
235
|
+
const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
|
|
236
|
+
return Promise.resolve(block?.getBlockHeader());
|
|
237
|
+
}
|
|
238
|
+
|
|
93
239
|
getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined> {
|
|
94
|
-
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.
|
|
240
|
+
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.getBlockHeader());
|
|
95
241
|
}
|
|
96
242
|
|
|
97
|
-
|
|
243
|
+
getCheckpointsForEpoch(epochNumber: EpochNumber): Promise<Checkpoint[]> {
|
|
244
|
+
// TODO: Implement this properly. This only works when we have one block per checkpoint.
|
|
245
|
+
return this.getBlocksForEpoch(epochNumber).then(blocks => blocks.map(b => b.toCheckpoint()));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
getBlocksForEpoch(epochNumber: EpochNumber): Promise<L2Block[]> {
|
|
98
249
|
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
99
250
|
const [start, end] = getSlotRangeForEpoch(epochNumber, { epochDuration });
|
|
100
251
|
const blocks = this.l2Blocks.filter(b => {
|
|
101
|
-
const slot = b.header.globalVariables.slotNumber
|
|
252
|
+
const slot = b.header.globalVariables.slotNumber;
|
|
102
253
|
return slot >= start && slot <= end;
|
|
103
254
|
});
|
|
104
255
|
return Promise.resolve(blocks);
|
|
105
256
|
}
|
|
106
257
|
|
|
258
|
+
async getBlockHeadersForEpoch(epochNumber: EpochNumber): Promise<BlockHeader[]> {
|
|
259
|
+
const blocks = await this.getBlocksForEpoch(epochNumber);
|
|
260
|
+
return blocks.map(b => b.getBlockHeader());
|
|
261
|
+
}
|
|
262
|
+
|
|
107
263
|
/**
|
|
108
264
|
* Gets a tx effect.
|
|
109
|
-
* @param txHash - The hash of
|
|
110
|
-
* @returns The requested tx effect.
|
|
265
|
+
* @param txHash - The hash of the tx corresponding to the tx effect.
|
|
266
|
+
* @returns The requested tx effect with block info (or undefined if not found).
|
|
111
267
|
*/
|
|
112
268
|
public async getTxEffect(txHash: TxHash) {
|
|
113
269
|
const match = this.l2Blocks
|
|
@@ -117,7 +273,12 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
117
273
|
return Promise.resolve(undefined);
|
|
118
274
|
}
|
|
119
275
|
const [txEffect, block] = match;
|
|
120
|
-
return {
|
|
276
|
+
return {
|
|
277
|
+
data: txEffect,
|
|
278
|
+
l2BlockNumber: block.number,
|
|
279
|
+
l2BlockHash: L2BlockHash.fromField(await block.hash()),
|
|
280
|
+
txIndexInBlock: block.body.txEffects.indexOf(txEffect),
|
|
281
|
+
};
|
|
121
282
|
}
|
|
122
283
|
|
|
123
284
|
/**
|
|
@@ -144,45 +305,69 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
144
305
|
}
|
|
145
306
|
|
|
146
307
|
async getL2Tips(): Promise<L2Tips> {
|
|
147
|
-
const [latest, proven, finalized] = [
|
|
308
|
+
const [latest, proven, finalized, checkpointed] = [
|
|
148
309
|
await this.getBlockNumber(),
|
|
149
310
|
await this.getProvenBlockNumber(),
|
|
150
|
-
|
|
311
|
+
this.finalizedBlockNumber,
|
|
312
|
+
this.checkpointedBlockNumber,
|
|
151
313
|
] as const;
|
|
152
314
|
|
|
153
315
|
const latestBlock = this.l2Blocks[latest - 1];
|
|
154
316
|
const provenBlock = this.l2Blocks[proven - 1];
|
|
155
317
|
const finalizedBlock = this.l2Blocks[finalized - 1];
|
|
318
|
+
const checkpointedBlock = this.l2Blocks[checkpointed - 1];
|
|
319
|
+
|
|
320
|
+
const latestBlockId = {
|
|
321
|
+
number: BlockNumber(latest),
|
|
322
|
+
hash: (await latestBlock?.hash())?.toString(),
|
|
323
|
+
};
|
|
324
|
+
const provenBlockId = {
|
|
325
|
+
number: BlockNumber(proven),
|
|
326
|
+
hash: (await provenBlock?.hash())?.toString(),
|
|
327
|
+
};
|
|
328
|
+
const finalizedBlockId = {
|
|
329
|
+
number: BlockNumber(finalized),
|
|
330
|
+
hash: (await finalizedBlock?.hash())?.toString(),
|
|
331
|
+
};
|
|
332
|
+
const checkpointedBlockId = {
|
|
333
|
+
number: BlockNumber(checkpointed),
|
|
334
|
+
hash: (await checkpointedBlock?.hash())?.toString(),
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
const makeTipId = (blockId: typeof latestBlockId) => ({
|
|
338
|
+
block: blockId,
|
|
339
|
+
checkpoint: { number: CheckpointNumber(blockId.number), hash: blockId.hash },
|
|
340
|
+
});
|
|
156
341
|
|
|
157
342
|
return {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
proven: {
|
|
163
|
-
number: proven,
|
|
164
|
-
hash: (await provenBlock?.hash())?.toString(),
|
|
165
|
-
},
|
|
166
|
-
finalized: {
|
|
167
|
-
number: finalized,
|
|
168
|
-
hash: (await finalizedBlock?.hash())?.toString(),
|
|
169
|
-
},
|
|
343
|
+
proposed: latestBlockId,
|
|
344
|
+
checkpointed: makeTipId(checkpointedBlockId),
|
|
345
|
+
proven: makeTipId(provenBlockId),
|
|
346
|
+
finalized: makeTipId(finalizedBlockId),
|
|
170
347
|
};
|
|
171
348
|
}
|
|
172
349
|
|
|
173
|
-
getL2EpochNumber(): Promise<
|
|
350
|
+
getL2EpochNumber(): Promise<EpochNumber> {
|
|
174
351
|
throw new Error('Method not implemented.');
|
|
175
352
|
}
|
|
176
353
|
|
|
177
|
-
getL2SlotNumber(): Promise<
|
|
354
|
+
getL2SlotNumber(): Promise<SlotNumber> {
|
|
178
355
|
throw new Error('Method not implemented.');
|
|
179
356
|
}
|
|
180
357
|
|
|
181
|
-
isEpochComplete(_epochNumber:
|
|
358
|
+
isEpochComplete(_epochNumber: EpochNumber): Promise<boolean> {
|
|
182
359
|
throw new Error('Method not implemented.');
|
|
183
360
|
}
|
|
184
361
|
|
|
185
362
|
getL1Constants(): Promise<L1RollupConstants> {
|
|
363
|
+
return Promise.resolve(EmptyL1RollupConstants);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
getGenesisValues(): Promise<{ genesisArchiveRoot: Fr }> {
|
|
367
|
+
return Promise.resolve({ genesisArchiveRoot: new Fr(GENESIS_ARCHIVE_ROOT) });
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
getL1Timestamp(): Promise<bigint> {
|
|
186
371
|
throw new Error('Method not implemented.');
|
|
187
372
|
}
|
|
188
373
|
|
|
@@ -191,6 +376,7 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
191
376
|
* @returns A promise that signals the initialization of the l2 block source on completion.
|
|
192
377
|
*/
|
|
193
378
|
public start(): Promise<void> {
|
|
379
|
+
this.log.verbose('Starting mock L2 block source');
|
|
194
380
|
return Promise.resolve();
|
|
195
381
|
}
|
|
196
382
|
|
|
@@ -199,6 +385,43 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
199
385
|
* @returns A promise that signals the l2 block source is now stopped.
|
|
200
386
|
*/
|
|
201
387
|
public stop(): Promise<void> {
|
|
388
|
+
this.log.verbose('Stopping mock L2 block source');
|
|
389
|
+
return Promise.resolve();
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
getContractClass(_id: Fr): Promise<ContractClassPublic | undefined> {
|
|
393
|
+
return Promise.resolve(undefined);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
getBytecodeCommitment(_id: Fr): Promise<Fr | undefined> {
|
|
397
|
+
return Promise.resolve(undefined);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
getContract(_address: AztecAddress, _timestamp?: UInt64): Promise<ContractInstanceWithAddress | undefined> {
|
|
401
|
+
return Promise.resolve(undefined);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
getContractClassIds(): Promise<Fr[]> {
|
|
405
|
+
return Promise.resolve([]);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
getDebugFunctionName(_address: AztecAddress, _selector: FunctionSelector): Promise<string | undefined> {
|
|
409
|
+
return Promise.resolve(undefined);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
registerContractFunctionSignatures(_signatures: string[]): Promise<void> {
|
|
202
413
|
return Promise.resolve();
|
|
203
414
|
}
|
|
415
|
+
|
|
416
|
+
syncImmediate(): Promise<void> {
|
|
417
|
+
return Promise.resolve();
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
isPendingChainInvalid(): Promise<boolean> {
|
|
421
|
+
return Promise.resolve(false);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
getPendingChainValidationStatus(): Promise<ValidateCheckpointResult> {
|
|
425
|
+
return Promise.resolve({ valid: true });
|
|
426
|
+
}
|
|
204
427
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
3
|
+
import { randomBigInt, randomInt } from '@aztec/foundation/crypto/random';
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
|
+
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
6
|
+
|
|
7
|
+
import { type InboxMessage, updateRollingHash } from '../archiver/structs/inbox_message.js';
|
|
8
|
+
|
|
9
|
+
export function makeInboxMessage(
|
|
10
|
+
previousRollingHash = Buffer16.ZERO,
|
|
11
|
+
overrides: Partial<InboxMessage> = {},
|
|
12
|
+
): InboxMessage {
|
|
13
|
+
const { checkpointNumber = CheckpointNumber(randomInt(100) + 1) } = overrides;
|
|
14
|
+
const { l1BlockNumber = randomBigInt(100n) + 1n } = overrides;
|
|
15
|
+
const { l1BlockHash = Buffer32.random() } = overrides;
|
|
16
|
+
const { leaf = Fr.random() } = overrides;
|
|
17
|
+
const { rollingHash = updateRollingHash(previousRollingHash, leaf) } = overrides;
|
|
18
|
+
const { index = InboxLeaf.smallestIndexForCheckpoint(checkpointNumber) } = overrides;
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
index,
|
|
22
|
+
leaf,
|
|
23
|
+
checkpointNumber,
|
|
24
|
+
l1BlockNumber,
|
|
25
|
+
l1BlockHash,
|
|
26
|
+
rollingHash,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function makeInboxMessages(
|
|
31
|
+
count: number,
|
|
32
|
+
opts: {
|
|
33
|
+
initialHash?: Buffer16;
|
|
34
|
+
initialCheckpointNumber?: CheckpointNumber;
|
|
35
|
+
overrideFn?: (msg: InboxMessage, index: number) => InboxMessage;
|
|
36
|
+
} = {},
|
|
37
|
+
): InboxMessage[] {
|
|
38
|
+
const { initialHash = Buffer16.ZERO, overrideFn = msg => msg, initialCheckpointNumber = 1 } = opts;
|
|
39
|
+
const messages: InboxMessage[] = [];
|
|
40
|
+
let rollingHash = initialHash;
|
|
41
|
+
for (let i = 0; i < count; i++) {
|
|
42
|
+
const leaf = Fr.random();
|
|
43
|
+
const checkpointNumber = CheckpointNumber(i + initialCheckpointNumber);
|
|
44
|
+
const message = overrideFn(makeInboxMessage(rollingHash, { leaf, checkpointNumber }), i);
|
|
45
|
+
rollingHash = message.rollingHash;
|
|
46
|
+
messages.push(message);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return messages;
|
|
50
|
+
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
import type { BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
4
|
-
import type { ViemPublicClient } from '@aztec/ethereum';
|
|
5
|
-
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
7
|
-
import { type Logger } from '@aztec/foundation/log';
|
|
8
|
-
import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
9
|
-
import { L2Block } from '@aztec/stdlib/block';
|
|
10
|
-
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
11
|
-
import { Proof } from '@aztec/stdlib/proofs';
|
|
12
|
-
import { type GetContractEventsReturnType, type GetContractReturnType, type Hex } from 'viem';
|
|
13
|
-
import type { DataRetrieval } from './structs/data_retrieval.js';
|
|
14
|
-
import type { L1Published } from './structs/published.js';
|
|
15
|
-
/**
|
|
16
|
-
* Fetches new L2 blocks.
|
|
17
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
18
|
-
* @param rollupAddress - The address of the rollup contract.
|
|
19
|
-
* @param searchStartBlock - The block number to use for starting the search.
|
|
20
|
-
* @param searchEndBlock - The highest block number that we should search up to.
|
|
21
|
-
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
22
|
-
* @returns An array of block; as well as the next eth block to search from.
|
|
23
|
-
*/
|
|
24
|
-
export declare function retrieveBlocksFromRollup(rollup: GetContractReturnType<typeof RollupAbi, ViemPublicClient>, publicClient: ViemPublicClient, blobSinkClient: BlobSinkClientInterface, searchStartBlock: bigint, searchEndBlock: bigint, logger?: Logger): Promise<L1Published<L2Block>[]>;
|
|
25
|
-
/**
|
|
26
|
-
* Processes newly received L2BlockProposed logs.
|
|
27
|
-
* @param rollup - The rollup contract
|
|
28
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
29
|
-
* @param logs - L2BlockProposed logs.
|
|
30
|
-
* @returns - An array blocks.
|
|
31
|
-
*/
|
|
32
|
-
export declare function processL2BlockProposedLogs(rollup: GetContractReturnType<typeof RollupAbi, ViemPublicClient>, publicClient: ViemPublicClient, blobSinkClient: BlobSinkClientInterface, logs: GetContractEventsReturnType<typeof RollupAbi, 'L2BlockProposed'>, logger: Logger): Promise<L1Published<L2Block>[]>;
|
|
33
|
-
export declare function getL1BlockTime(publicClient: ViemPublicClient, blockNumber: bigint): Promise<bigint>;
|
|
34
|
-
/**
|
|
35
|
-
* Fetch L1 to L2 messages.
|
|
36
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
37
|
-
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
38
|
-
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
39
|
-
* @param searchStartBlock - The block number to use for starting the search.
|
|
40
|
-
* @param searchEndBlock - The highest block number that we should search up to.
|
|
41
|
-
* @returns An array of InboxLeaf and next eth block to search from.
|
|
42
|
-
*/
|
|
43
|
-
export declare function retrieveL1ToL2Messages(inbox: GetContractReturnType<typeof InboxAbi, ViemPublicClient>, searchStartBlock: bigint, searchEndBlock: bigint): Promise<DataRetrieval<InboxLeaf>>;
|
|
44
|
-
/** Retrieves L2ProofVerified events from the rollup contract. */
|
|
45
|
-
export declare function retrieveL2ProofVerifiedEvents(publicClient: ViemPublicClient, rollupAddress: EthAddress, searchStartBlock: bigint, searchEndBlock?: bigint): Promise<{
|
|
46
|
-
l1BlockNumber: bigint;
|
|
47
|
-
l2BlockNumber: bigint;
|
|
48
|
-
proverId: Fr;
|
|
49
|
-
txHash: Hex;
|
|
50
|
-
}[]>;
|
|
51
|
-
/** Retrieve submitted proofs from the rollup contract */
|
|
52
|
-
export declare function retrieveL2ProofsFromRollup(publicClient: ViemPublicClient, rollupAddress: EthAddress, searchStartBlock: bigint, searchEndBlock?: bigint): Promise<DataRetrieval<{
|
|
53
|
-
proof: Proof;
|
|
54
|
-
proverId: Fr;
|
|
55
|
-
l2BlockNumber: bigint;
|
|
56
|
-
txHash: `0x${string}`;
|
|
57
|
-
}>>;
|
|
58
|
-
export type SubmitBlockProof = {
|
|
59
|
-
archiveRoot: Fr;
|
|
60
|
-
proverId: Fr;
|
|
61
|
-
aggregationObject: Buffer;
|
|
62
|
-
proof: Proof;
|
|
63
|
-
};
|
|
64
|
-
/**
|
|
65
|
-
* Gets block metadata (header and archive snapshot) from the calldata of an L1 transaction.
|
|
66
|
-
* Assumes that the block was published from an EOA.
|
|
67
|
-
* TODO: Add retries and error management.
|
|
68
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
69
|
-
* @param txHash - Hash of the tx that published it.
|
|
70
|
-
* @param l2BlockNum - L2 block number.
|
|
71
|
-
* @returns L2 block metadata (header and archive) from the calldata, deserialized
|
|
72
|
-
*/
|
|
73
|
-
export declare function getProofFromSubmitProofTx(publicClient: ViemPublicClient, txHash: `0x${string}`, expectedProverId: Fr): Promise<SubmitBlockProof>;
|
|
74
|
-
//# sourceMappingURL=data_retrieval.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../src/archiver/data_retrieval.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAA6B,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAgB,KAAK,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAQ,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAI7C,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,GAAG,EAIT,MAAM,MAAM,CAAC;AAGd,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,wBAAwB,CAAC;AAE3E;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,qBAAqB,CAAC,OAAO,SAAS,EAAE,gBAAgB,CAAC,EACjE,YAAY,EAAE,gBAAgB,EAC9B,cAAc,EAAE,uBAAuB,EACvC,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,MAAiC,GACxC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAsCjC;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,qBAAqB,CAAC,OAAO,SAAS,EAAE,gBAAgB,CAAC,EACjE,YAAY,EAAE,gBAAgB,EAC9B,cAAc,EAAE,uBAAuB,EACvC,IAAI,EAAE,2BAA2B,CAAC,OAAO,SAAS,EAAE,iBAAiB,CAAC,EACtE,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAoCjC;AAED,wBAAsB,cAAc,CAAC,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGzG;AAsID;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,qBAAqB,CAAC,OAAO,QAAQ,EAAE,gBAAgB,CAAC,EAC/D,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CA8BnC;AAED,iEAAiE;AACjE,wBAAsB,6BAA6B,CACjD,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,EAAE,CAAC,CAexF;AAED,yDAAyD;AACzD,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAatG;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,EAAE,CAAC;IAChB,QAAQ,EAAE,EAAE,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,gBAAgB,EAC9B,MAAM,EAAE,KAAK,MAAM,EAAE,EACrB,gBAAgB,EAAE,EAAE,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAuC3B"}
|