@aztec/archiver 0.57.0 → 0.58.0

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.
Files changed (56) hide show
  1. package/dest/archiver/archiver.d.ts +5 -3
  2. package/dest/archiver/archiver.d.ts.map +1 -1
  3. package/dest/archiver/archiver.js +77 -21
  4. package/dest/archiver/archiver_store.d.ts +1 -2
  5. package/dest/archiver/archiver_store.d.ts.map +1 -1
  6. package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
  7. package/dest/archiver/archiver_store_test_suite.js +10 -14
  8. package/dest/archiver/data_retrieval.js +3 -3
  9. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +1 -2
  10. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +1 -1
  11. package/dest/archiver/kv_archiver_store/contract_class_store.js +2 -2
  12. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +1 -2
  13. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +1 -1
  14. package/dest/archiver/kv_archiver_store/contract_instance_store.js +2 -2
  15. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +1 -2
  16. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
  17. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +1 -1
  18. package/dest/archiver/kv_archiver_store/message_store.d.ts +1 -1
  19. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
  20. package/dest/archiver/kv_archiver_store/message_store.js +8 -11
  21. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +2 -2
  22. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -1
  23. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +9 -14
  24. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +1 -2
  25. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
  26. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +2 -2
  27. package/dest/factory.d.ts.map +1 -1
  28. package/dest/factory.js +17 -1
  29. package/dest/test/index.d.ts +2 -0
  30. package/dest/test/index.d.ts.map +1 -1
  31. package/dest/test/index.js +3 -1
  32. package/dest/test/mock_archiver.d.ts +22 -0
  33. package/dest/test/mock_archiver.d.ts.map +1 -0
  34. package/dest/test/mock_archiver.js +44 -0
  35. package/dest/test/mock_l1_to_l2_message_source.d.ts +16 -0
  36. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -0
  37. package/dest/test/mock_l1_to_l2_message_source.js +25 -0
  38. package/dest/test/mock_l2_block_source.d.ts +11 -9
  39. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  40. package/dest/test/mock_l2_block_source.js +36 -16
  41. package/package.json +10 -10
  42. package/src/archiver/archiver.ts +109 -34
  43. package/src/archiver/archiver_store.ts +5 -4
  44. package/src/archiver/archiver_store_test_suite.ts +20 -21
  45. package/src/archiver/data_retrieval.ts +2 -2
  46. package/src/archiver/kv_archiver_store/contract_class_store.ts +6 -4
  47. package/src/archiver/kv_archiver_store/contract_instance_store.ts +1 -2
  48. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +7 -6
  49. package/src/archiver/kv_archiver_store/message_store.ts +7 -18
  50. package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +9 -19
  51. package/src/archiver/memory_archiver_store/memory_archiver_store.ts +6 -4
  52. package/src/factory.ts +18 -0
  53. package/src/test/index.ts +2 -0
  54. package/src/test/mock_archiver.ts +55 -0
  55. package/src/test/mock_l1_to_l2_message_source.ts +31 -0
  56. package/src/test/mock_l2_block_source.ts +42 -17
@@ -0,0 +1,55 @@
1
+ import { type L1ToL2MessageSource, type L2Block, type L2BlockSource } from '@aztec/circuit-types';
2
+ import { type Fr } from '@aztec/circuits.js';
3
+
4
+ import { MockL1ToL2MessageSource } from './mock_l1_to_l2_message_source.js';
5
+ import { MockL2BlockSource } from './mock_l2_block_source.js';
6
+
7
+ /**
8
+ * A mocked implementation of the archiver that implements L2BlockSource and L1ToL2MessageSource.
9
+ */
10
+ export class MockArchiver extends MockL2BlockSource implements L2BlockSource, L1ToL2MessageSource {
11
+ private messageSource = new MockL1ToL2MessageSource(0);
12
+
13
+ public setL1ToL2Messages(blockNumber: number, msgs: Fr[]) {
14
+ this.messageSource.setL1ToL2Messages(blockNumber, msgs);
15
+ }
16
+
17
+ getL1ToL2Messages(blockNumber: bigint): Promise<Fr[]> {
18
+ return this.messageSource.getL1ToL2Messages(blockNumber);
19
+ }
20
+
21
+ getL1ToL2MessageIndex(_l1ToL2Message: Fr, _startIndex: bigint): Promise<bigint | undefined> {
22
+ return this.messageSource.getL1ToL2MessageIndex(_l1ToL2Message, _startIndex);
23
+ }
24
+ }
25
+
26
+ /**
27
+ * A mocked implementation of the archiver with a set of precomputed blocks and messages.
28
+ */
29
+ export class MockPrefilledArchiver extends MockArchiver {
30
+ private precomputed: L2Block[];
31
+
32
+ constructor(precomputed: L2Block[], messages: Fr[][]) {
33
+ super();
34
+ this.precomputed = precomputed.slice();
35
+ messages.forEach((msgs, i) => this.setL1ToL2Messages(i + 1, msgs));
36
+ }
37
+
38
+ public setPrefilledBlocks(blocks: L2Block[], messages: Fr[][]) {
39
+ for (const block of blocks) {
40
+ this.precomputed[block.number - 1] = block;
41
+ }
42
+ messages.forEach((msgs, i) => this.setL1ToL2Messages(blocks[i].number, msgs));
43
+ }
44
+
45
+ public override createBlocks(numBlocks: number) {
46
+ if (this.l2Blocks.length + numBlocks > this.precomputed.length) {
47
+ throw new Error(
48
+ `Not enough precomputed blocks to create ${numBlocks} more blocks (already at ${this.l2Blocks.length})`,
49
+ );
50
+ }
51
+
52
+ const fromBlock = this.l2Blocks.length;
53
+ this.addBlocks(this.precomputed.slice(fromBlock, fromBlock + numBlocks));
54
+ }
55
+ }
@@ -0,0 +1,31 @@
1
+ import { type L1ToL2MessageSource } from '@aztec/circuit-types';
2
+ import { type Fr } from '@aztec/circuits.js';
3
+
4
+ /**
5
+ * A mocked implementation of L1ToL2MessageSource to be used in tests.
6
+ */
7
+ export class MockL1ToL2MessageSource implements L1ToL2MessageSource {
8
+ private messagesPerBlock = new Map<number, Fr[]>();
9
+
10
+ constructor(private blockNumber: number) {}
11
+
12
+ public setL1ToL2Messages(blockNumber: number, msgs: Fr[]) {
13
+ this.messagesPerBlock.set(blockNumber, msgs);
14
+ }
15
+
16
+ public setBlockNumber(blockNumber: number) {
17
+ this.blockNumber = blockNumber;
18
+ }
19
+
20
+ getL1ToL2Messages(blockNumber: bigint): Promise<Fr[]> {
21
+ return Promise.resolve(this.messagesPerBlock.get(Number(blockNumber)) ?? []);
22
+ }
23
+
24
+ getL1ToL2MessageIndex(_l1ToL2Message: Fr, _startIndex: bigint): Promise<bigint | undefined> {
25
+ throw new Error('Method not implemented.');
26
+ }
27
+
28
+ getBlockNumber(): Promise<number> {
29
+ return Promise.resolve(this.blockNumber);
30
+ }
31
+ }
@@ -1,27 +1,38 @@
1
- import { L2Block, type L2BlockSource, type TxEffect, type TxHash, TxReceipt, TxStatus } from '@aztec/circuit-types';
1
+ import { L2Block, type L2BlockSource, type L2Tips, type TxHash, TxReceipt, TxStatus } from '@aztec/circuit-types';
2
2
  import { EthAddress, type Header } from '@aztec/circuits.js';
3
+ import { createDebugLogger } from '@aztec/foundation/log';
3
4
 
4
5
  import { getSlotRangeForEpoch } from '../archiver/epoch_helpers.js';
5
6
 
6
7
  /**
7
- * A mocked implementation of L2BlockSource to be used in p2p tests.
8
+ * A mocked implementation of L2BlockSource to be used in tests.
8
9
  */
9
- export class MockBlockSource implements L2BlockSource {
10
- private l2Blocks: L2Block[] = [];
11
- private txEffects: TxEffect[] = [];
10
+ export class MockL2BlockSource implements L2BlockSource {
11
+ protected l2Blocks: L2Block[] = [];
12
+
12
13
  private provenEpochNumber: number = 0;
14
+ private provenBlockNumber: number = 0;
13
15
 
14
- constructor(numBlocks = 100, private provenBlockNumber?: number) {
15
- this.addBlocks(numBlocks);
16
- }
16
+ private log = createDebugLogger('aztec:archiver:mock_l2_block_source');
17
17
 
18
- public addBlocks(numBlocks: number) {
18
+ public createBlocks(numBlocks: number) {
19
19
  for (let i = 0; i < numBlocks; i++) {
20
- const blockNum = this.l2Blocks.length;
21
- const block = L2Block.random(blockNum, blockNum);
20
+ const blockNum = this.l2Blocks.length + 1;
21
+ const block = L2Block.random(blockNum);
22
22
  this.l2Blocks.push(block);
23
- this.txEffects.push(...block.body.txEffects);
24
23
  }
24
+
25
+ this.log.verbose(`Created ${numBlocks} blocks in the mock L2 block source`);
26
+ }
27
+
28
+ public addBlocks(blocks: L2Block[]) {
29
+ this.l2Blocks.push(...blocks);
30
+ this.log.verbose(`Added ${blocks.length} blocks to the mock L2 block source`);
31
+ }
32
+
33
+ public removeBlocks(numBlocks: number) {
34
+ this.l2Blocks = this.l2Blocks.slice(0, -numBlocks);
35
+ this.log.verbose(`Removed ${numBlocks} blocks from the mock L2 block source`);
25
36
  }
26
37
 
27
38
  public setProvenBlockNumber(provenBlockNumber: number) {
@@ -53,7 +64,7 @@ export class MockBlockSource implements L2BlockSource {
53
64
  * @returns In this mock instance, returns the number of L2 blocks that we've mocked.
54
65
  */
55
66
  public getBlockNumber() {
56
- return Promise.resolve(this.l2Blocks.length - 1);
67
+ return Promise.resolve(this.l2Blocks.length);
57
68
  }
58
69
 
59
70
  public async getProvenBlockNumber(): Promise<number> {
@@ -70,7 +81,7 @@ export class MockBlockSource implements L2BlockSource {
70
81
  * @returns The requested L2 block.
71
82
  */
72
83
  public getBlock(number: number) {
73
- return Promise.resolve(this.l2Blocks[number]);
84
+ return Promise.resolve(this.l2Blocks[number - 1]);
74
85
  }
75
86
 
76
87
  /**
@@ -82,13 +93,13 @@ export class MockBlockSource implements L2BlockSource {
82
93
  public getBlocks(from: number, limit: number, proven?: boolean) {
83
94
  return Promise.resolve(
84
95
  this.l2Blocks
85
- .slice(from, from + limit)
96
+ .slice(from - 1, from - 1 + limit)
86
97
  .filter(b => !proven || this.provenBlockNumber === undefined || b.number <= this.provenBlockNumber),
87
98
  );
88
99
  }
89
100
 
90
101
  getBlockHeader(number: number | 'latest'): Promise<Header | undefined> {
91
- return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number : -1)?.header);
102
+ return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
92
103
  }
93
104
 
94
105
  getBlocksForEpoch(epochNumber: bigint): Promise<L2Block[]> {
@@ -106,7 +117,7 @@ export class MockBlockSource implements L2BlockSource {
106
117
  * @returns The requested tx effect.
107
118
  */
108
119
  public getTxEffect(txHash: TxHash) {
109
- const txEffect = this.txEffects.find(tx => tx.txHash.equals(txHash));
120
+ const txEffect = this.l2Blocks.flatMap(b => b.body.txEffects).find(tx => tx.txHash.equals(txHash));
110
121
  return Promise.resolve(txEffect);
111
122
  }
112
123
 
@@ -135,6 +146,20 @@ export class MockBlockSource implements L2BlockSource {
135
146
  return Promise.resolve(undefined);
136
147
  }
137
148
 
149
+ async getL2Tips(): Promise<L2Tips> {
150
+ const [latest, proven, finalized] = [
151
+ await this.getBlockNumber(),
152
+ await this.getProvenBlockNumber(),
153
+ await this.getProvenBlockNumber(),
154
+ ] as const;
155
+
156
+ return {
157
+ latest: { number: latest, hash: this.l2Blocks[latest - 1]?.hash().toString() },
158
+ proven: { number: proven, hash: this.l2Blocks[proven - 1]?.hash().toString() },
159
+ finalized: { number: finalized, hash: this.l2Blocks[finalized - 1]?.hash().toString() },
160
+ };
161
+ }
162
+
138
163
  getL2EpochNumber(): Promise<bigint> {
139
164
  throw new Error('Method not implemented.');
140
165
  }