@aztec/archiver 0.0.1-commit.993d52e → 0.0.1-commit.9a89641

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 (121) hide show
  1. package/README.md +19 -11
  2. package/dest/archiver.d.ts +73 -18
  3. package/dest/archiver.d.ts.map +1 -1
  4. package/dest/archiver.js +322 -81
  5. package/dest/config.d.ts +7 -3
  6. package/dest/config.d.ts.map +1 -1
  7. package/dest/config.js +43 -14
  8. package/dest/errors.d.ts +55 -9
  9. package/dest/errors.d.ts.map +1 -1
  10. package/dest/errors.js +81 -14
  11. package/dest/factory.d.ts +20 -9
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +85 -37
  14. package/dest/index.d.ts +11 -3
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +10 -2
  17. package/dest/l1/calldata_retriever.d.ts +9 -1
  18. package/dest/l1/calldata_retriever.d.ts.map +1 -1
  19. package/dest/l1/calldata_retriever.js +22 -11
  20. package/dest/l1/data_retrieval.d.ts +30 -13
  21. package/dest/l1/data_retrieval.d.ts.map +1 -1
  22. package/dest/l1/data_retrieval.js +36 -37
  23. package/dest/l1/trace_tx.d.ts +12 -66
  24. package/dest/l1/trace_tx.d.ts.map +1 -1
  25. package/dest/l1/validate_historical_logs.d.ts +23 -0
  26. package/dest/l1/validate_historical_logs.d.ts.map +1 -0
  27. package/dest/l1/validate_historical_logs.js +108 -0
  28. package/dest/modules/contract_data_source_adapter.d.ts +25 -0
  29. package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
  30. package/dest/modules/contract_data_source_adapter.js +32 -0
  31. package/dest/modules/data_source_base.d.ts +73 -50
  32. package/dest/modules/data_source_base.d.ts.map +1 -1
  33. package/dest/modules/data_source_base.js +250 -144
  34. package/dest/modules/data_store_updater.d.ts +42 -17
  35. package/dest/modules/data_store_updater.d.ts.map +1 -1
  36. package/dest/modules/data_store_updater.js +193 -123
  37. package/dest/modules/instrumentation.d.ts +26 -2
  38. package/dest/modules/instrumentation.d.ts.map +1 -1
  39. package/dest/modules/instrumentation.js +58 -9
  40. package/dest/modules/l1_synchronizer.d.ts +14 -8
  41. package/dest/modules/l1_synchronizer.d.ts.map +1 -1
  42. package/dest/modules/l1_synchronizer.js +484 -213
  43. package/dest/modules/outbox_trees_resolver.d.ts +64 -0
  44. package/dest/modules/outbox_trees_resolver.d.ts.map +1 -0
  45. package/dest/modules/outbox_trees_resolver.js +184 -0
  46. package/dest/modules/validation.d.ts +30 -7
  47. package/dest/modules/validation.d.ts.map +1 -1
  48. package/dest/modules/validation.js +35 -17
  49. package/dest/store/block_store.d.ts +186 -78
  50. package/dest/store/block_store.d.ts.map +1 -1
  51. package/dest/store/block_store.js +763 -290
  52. package/dest/store/contract_class_store.d.ts +17 -4
  53. package/dest/store/contract_class_store.d.ts.map +1 -1
  54. package/dest/store/contract_class_store.js +42 -68
  55. package/dest/store/contract_instance_store.d.ts +28 -1
  56. package/dest/store/contract_instance_store.d.ts.map +1 -1
  57. package/dest/store/contract_instance_store.js +54 -2
  58. package/dest/store/data_stores.d.ts +68 -0
  59. package/dest/store/data_stores.d.ts.map +1 -0
  60. package/dest/store/data_stores.js +54 -0
  61. package/dest/store/function_names_cache.d.ts +17 -0
  62. package/dest/store/function_names_cache.d.ts.map +1 -0
  63. package/dest/store/function_names_cache.js +30 -0
  64. package/dest/store/l2_tips_cache.d.ts +13 -7
  65. package/dest/store/l2_tips_cache.d.ts.map +1 -1
  66. package/dest/store/l2_tips_cache.js +13 -76
  67. package/dest/store/log_store.d.ts +42 -37
  68. package/dest/store/log_store.d.ts.map +1 -1
  69. package/dest/store/log_store.js +262 -408
  70. package/dest/store/log_store_codec.d.ts +78 -0
  71. package/dest/store/log_store_codec.d.ts.map +1 -0
  72. package/dest/store/log_store_codec.js +110 -0
  73. package/dest/store/message_store.d.ts +11 -1
  74. package/dest/store/message_store.d.ts.map +1 -1
  75. package/dest/store/message_store.js +51 -9
  76. package/dest/test/fake_l1_state.d.ts +20 -1
  77. package/dest/test/fake_l1_state.d.ts.map +1 -1
  78. package/dest/test/fake_l1_state.js +117 -21
  79. package/dest/test/mock_l2_block_source.d.ts +51 -52
  80. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  81. package/dest/test/mock_l2_block_source.js +232 -180
  82. package/dest/test/mock_structs.d.ts +4 -1
  83. package/dest/test/mock_structs.d.ts.map +1 -1
  84. package/dest/test/mock_structs.js +15 -3
  85. package/dest/test/noop_l1_archiver.d.ts +17 -6
  86. package/dest/test/noop_l1_archiver.d.ts.map +1 -1
  87. package/dest/test/noop_l1_archiver.js +31 -11
  88. package/package.json +14 -14
  89. package/src/archiver.ts +416 -90
  90. package/src/config.ts +51 -13
  91. package/src/errors.ts +122 -21
  92. package/src/factory.ts +99 -30
  93. package/src/index.ts +18 -2
  94. package/src/l1/calldata_retriever.ts +29 -11
  95. package/src/l1/data_retrieval.ts +60 -54
  96. package/src/l1/validate_historical_logs.ts +140 -0
  97. package/src/modules/contract_data_source_adapter.ts +46 -0
  98. package/src/modules/data_source_base.ts +327 -189
  99. package/src/modules/data_store_updater.ts +226 -155
  100. package/src/modules/instrumentation.ts +63 -10
  101. package/src/modules/l1_synchronizer.ts +654 -259
  102. package/src/modules/outbox_trees_resolver.ts +220 -0
  103. package/src/modules/validation.ts +80 -23
  104. package/src/store/block_store.ts +930 -348
  105. package/src/store/contract_class_store.ts +49 -103
  106. package/src/store/contract_instance_store.ts +68 -5
  107. package/src/store/data_stores.ts +104 -0
  108. package/src/store/function_names_cache.ts +37 -0
  109. package/src/store/l2_tips_cache.ts +16 -70
  110. package/src/store/log_store.ts +302 -559
  111. package/src/store/log_store_codec.ts +143 -0
  112. package/src/store/message_store.ts +60 -10
  113. package/src/structs/inbox_message.ts +1 -1
  114. package/src/test/fake_l1_state.ts +145 -32
  115. package/src/test/mock_l2_block_source.ts +292 -227
  116. package/src/test/mock_structs.ts +25 -8
  117. package/src/test/noop_l1_archiver.ts +61 -12
  118. package/dest/store/kv_archiver_store.d.ts +0 -354
  119. package/dest/store/kv_archiver_store.d.ts.map +0 -1
  120. package/dest/store/kv_archiver_store.js +0 -464
  121. package/src/store/kv_archiver_store.ts +0 -671
@@ -1,6 +1,9 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import type { L2Block } from '@aztec/stdlib/block';
3
4
  import type { CheckpointData } from '@aztec/stdlib/checkpoint';
5
+ import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
6
+ import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
4
7
  import {
5
8
  Attributes,
6
9
  type Gauge,
@@ -29,6 +32,7 @@ export class ArchiverInstrumentation {
29
32
  private pruneCount: UpDownCounter;
30
33
 
31
34
  private syncDurationPerBlock: Histogram;
35
+ private syncDurationPerCheckpoint: Histogram;
32
36
  private syncBlockCount: UpDownCounter;
33
37
  private manaPerBlock: Histogram;
34
38
  private txsPerBlock: Histogram;
@@ -38,6 +42,9 @@ export class ArchiverInstrumentation {
38
42
 
39
43
  private blockProposalTxTargetCount: UpDownCounter;
40
44
 
45
+ private checkpointL1InclusionDelay: Histogram;
46
+ private checkpointPromotedCount: UpDownCounter;
47
+
41
48
  private log = createLogger('archiver:instrumentation');
42
49
 
43
50
  private constructor(
@@ -63,6 +70,8 @@ export class ArchiverInstrumentation {
63
70
 
64
71
  this.syncDurationPerBlock = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_BLOCK);
65
72
 
73
+ this.syncDurationPerCheckpoint = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_CHECKPOINT);
74
+
66
75
  this.syncBlockCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_SYNC_BLOCK_COUNT);
67
76
 
68
77
  this.manaPerBlock = meter.createHistogram(Metrics.ARCHIVER_MANA_PER_BLOCK);
@@ -75,7 +84,9 @@ export class ArchiverInstrumentation {
75
84
 
76
85
  this.pruneDuration = meter.createHistogram(Metrics.ARCHIVER_PRUNE_DURATION);
77
86
 
78
- this.pruneCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_PRUNE_COUNT);
87
+ this.pruneCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_PRUNE_COUNT, {
88
+ [Attributes.PRUNE_TYPE]: ['unproven', 'uncheckpointed', 'l1_conflict', 'orphan', 'l1_mismatch'],
89
+ });
79
90
 
80
91
  this.blockProposalTxTargetCount = createUpDownCounterWithDefault(
81
92
  meter,
@@ -85,6 +96,10 @@ export class ArchiverInstrumentation {
85
96
  },
86
97
  );
87
98
 
99
+ this.checkpointL1InclusionDelay = meter.createHistogram(Metrics.ARCHIVER_CHECKPOINT_L1_INCLUSION_DELAY);
100
+
101
+ this.checkpointPromotedCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_CHECKPOINT_PROMOTED_COUNT);
102
+
88
103
  this.dbMetrics = new LmdbMetrics(
89
104
  meter,
90
105
  {
@@ -106,17 +121,26 @@ export class ArchiverInstrumentation {
106
121
  return this.telemetry.isEnabled();
107
122
  }
108
123
 
109
- public processNewBlocks(syncTimePerBlock: number, blocks: L2Block[]) {
124
+ public processNewProposedBlock(syncTimePerBlock: number, block: L2Block) {
125
+ const attrs = { [Attributes.STATUS]: 'proposed' };
126
+ this.blockHeight.record(block.number, attrs);
110
127
  this.syncDurationPerBlock.record(Math.ceil(syncTimePerBlock));
111
- this.blockHeight.record(Math.max(...blocks.map(b => b.number)));
112
- this.checkpointHeight.record(Math.max(...blocks.map(b => b.checkpointNumber)));
113
- this.syncBlockCount.add(blocks.length);
114
128
 
115
- for (const block of blocks) {
116
- this.txCount.add(block.body.txEffects.length);
117
- this.txsPerBlock.record(block.body.txEffects.length);
118
- this.manaPerBlock.record(block.header.totalManaUsed.toNumber() / 1e6);
129
+ // Per block metrics
130
+ this.txCount.add(block.body.txEffects.length);
131
+ this.txsPerBlock.record(block.body.txEffects.length);
132
+ this.manaPerBlock.record(block.header.totalManaUsed.toNumber() / 1e6);
133
+ }
134
+
135
+ public processNewCheckpointedBlocks(syncTimePerCheckpoint: number, blocks: L2Block[]) {
136
+ if (blocks.length === 0) {
137
+ return;
119
138
  }
139
+
140
+ this.syncDurationPerCheckpoint.record(Math.ceil(syncTimePerCheckpoint));
141
+ this.blockHeight.record(Math.max(...blocks.map(b => b.number)), { [Attributes.STATUS]: 'checkpointed' });
142
+ this.checkpointHeight.record(Math.max(...blocks.map(b => b.checkpointNumber)));
143
+ this.syncBlockCount.add(blocks.length);
120
144
  }
121
145
 
122
146
  public processNewMessages(count: number, syncPerMessageMs: number) {
@@ -128,10 +152,21 @@ export class ArchiverInstrumentation {
128
152
  }
129
153
 
130
154
  public processPrune(duration: number) {
131
- this.pruneCount.add(1);
155
+ this.pruneCount.add(1, { [Attributes.PRUNE_TYPE]: 'unproven' });
132
156
  this.pruneDuration.record(Math.ceil(duration));
133
157
  }
134
158
 
159
+ /**
160
+ * Records a pending-chain reorg, where the archiver dropped proposed blocks (and world-state follows by pruning). The
161
+ * type distinguishes the cause: 'uncheckpointed' (slot ended without a checkpoint), 'l1_conflict' (proposed blocks
162
+ * conflicting with an L1 checkpoint), 'orphan' (no matching proposed checkpoint arrived before the deadline), or
163
+ * 'l1_mismatch' (the local checkpointed tip diverged from L1 — an L1 reorg or a pruned/missed-proof checkpoint — so
164
+ * already-checkpointed blocks were rewound).
165
+ */
166
+ public recordPrune(pruneType: 'uncheckpointed' | 'l1_conflict' | 'orphan' | 'l1_mismatch') {
167
+ this.pruneCount.add(1, { [Attributes.PRUNE_TYPE]: pruneType });
168
+ }
169
+
135
170
  public updateLastProvenCheckpoint(checkpoint: CheckpointData) {
136
171
  const lastBlockNumberInCheckpoint = checkpoint.startBlock + checkpoint.blockCount - 1;
137
172
  this.blockHeight.record(lastBlockNumberInCheckpoint, { [Attributes.STATUS]: 'proven' });
@@ -161,4 +196,22 @@ export class ArchiverInstrumentation {
161
196
  [Attributes.L1_BLOCK_PROPOSAL_USED_TRACE]: usedTrace,
162
197
  });
163
198
  }
199
+
200
+ /** Records a checkpoint promoted from proposed (blob fetch skipped). */
201
+ public processCheckpointPromoted() {
202
+ this.checkpointPromotedCount.add(1);
203
+ }
204
+
205
+ /**
206
+ * Records L1 inclusion timing for a checkpoint observed on L1 (seconds into the L2 slot).
207
+ */
208
+ public processCheckpointL1Timing(data: {
209
+ slotNumber: SlotNumber;
210
+ l1Timestamp: bigint;
211
+ l1Constants: Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>;
212
+ }): void {
213
+ const slotStartTs = getTimestampForSlot(data.slotNumber, data.l1Constants);
214
+ const inclusionDelaySeconds = Number(data.l1Timestamp - slotStartTs);
215
+ this.checkpointL1InclusionDelay.record(inclusionDelaySeconds);
216
+ }
164
217
  }