@aztec/archiver 3.0.3 → 3.9.9-nightly.20260312

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 (212) hide show
  1. package/README.md +156 -22
  2. package/dest/archiver.d.ts +139 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +734 -0
  5. package/dest/{archiver/config.d.ts → config.d.ts} +11 -3
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/{archiver/config.js → config.js} +13 -4
  8. package/dest/errors.d.ts +39 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +57 -0
  11. package/dest/factory.d.ts +9 -7
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +93 -11
  14. package/dest/index.d.ts +11 -4
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +9 -3
  17. package/dest/interfaces.d.ts +9 -0
  18. package/dest/interfaces.d.ts.map +1 -0
  19. package/dest/interfaces.js +3 -0
  20. package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.d.ts +1 -1
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.js +38 -33
  23. package/dest/l1/calldata_retriever.d.ts +135 -0
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/l1/calldata_retriever.js +402 -0
  26. package/dest/l1/data_retrieval.d.ts +85 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/{archiver/l1 → l1}/data_retrieval.js +63 -73
  29. package/dest/{archiver/l1 → l1}/debug_tx.d.ts +1 -1
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/{archiver/l1 → l1}/spire_proposer.d.ts +5 -5
  32. package/dest/l1/spire_proposer.d.ts.map +1 -0
  33. package/dest/{archiver/l1 → l1}/spire_proposer.js +9 -17
  34. package/dest/{archiver/l1 → l1}/trace_tx.d.ts +1 -1
  35. package/dest/l1/trace_tx.d.ts.map +1 -0
  36. package/dest/l1/types.d.ts +12 -0
  37. package/dest/l1/types.d.ts.map +1 -0
  38. package/dest/{archiver/l1 → l1}/validate_trace.d.ts +6 -3
  39. package/dest/l1/validate_trace.d.ts.map +1 -0
  40. package/dest/{archiver/l1 → l1}/validate_trace.js +14 -10
  41. package/dest/modules/data_source_base.d.ts +89 -0
  42. package/dest/modules/data_source_base.d.ts.map +1 -0
  43. package/dest/modules/data_source_base.js +216 -0
  44. package/dest/modules/data_store_updater.d.ts +83 -0
  45. package/dest/modules/data_store_updater.d.ts.map +1 -0
  46. package/dest/modules/data_store_updater.js +333 -0
  47. package/dest/modules/instrumentation.d.ts +39 -0
  48. package/dest/modules/instrumentation.d.ts.map +1 -0
  49. package/dest/{archiver → modules}/instrumentation.js +33 -67
  50. package/dest/modules/l1_synchronizer.d.ts +71 -0
  51. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  52. package/dest/modules/l1_synchronizer.js +1112 -0
  53. package/dest/modules/validation.d.ts +17 -0
  54. package/dest/modules/validation.d.ts.map +1 -0
  55. package/dest/{archiver → modules}/validation.js +7 -1
  56. package/dest/store/block_store.d.ts +196 -0
  57. package/dest/store/block_store.d.ts.map +1 -0
  58. package/dest/store/block_store.js +755 -0
  59. package/dest/store/contract_class_store.d.ts +18 -0
  60. package/dest/store/contract_class_store.d.ts.map +1 -0
  61. package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +12 -8
  62. package/dest/store/contract_instance_store.d.ts +24 -0
  63. package/dest/store/contract_instance_store.d.ts.map +1 -0
  64. package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
  65. package/dest/store/kv_archiver_store.d.ts +353 -0
  66. package/dest/store/kv_archiver_store.d.ts.map +1 -0
  67. package/dest/store/kv_archiver_store.js +464 -0
  68. package/dest/store/l2_tips_cache.d.ts +19 -0
  69. package/dest/store/l2_tips_cache.d.ts.map +1 -0
  70. package/dest/store/l2_tips_cache.js +89 -0
  71. package/dest/store/log_store.d.ts +54 -0
  72. package/dest/store/log_store.d.ts.map +1 -0
  73. package/dest/store/log_store.js +456 -0
  74. package/dest/{archiver/kv_archiver_store → store}/message_store.d.ts +1 -1
  75. package/dest/store/message_store.d.ts.map +1 -0
  76. package/dest/{archiver/kv_archiver_store → store}/message_store.js +1 -1
  77. package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
  78. package/dest/structs/data_retrieval.d.ts.map +1 -0
  79. package/dest/structs/inbox_message.d.ts +15 -0
  80. package/dest/structs/inbox_message.d.ts.map +1 -0
  81. package/dest/structs/published.d.ts +2 -0
  82. package/dest/structs/published.d.ts.map +1 -0
  83. package/dest/test/fake_l1_state.d.ts +195 -0
  84. package/dest/test/fake_l1_state.d.ts.map +1 -0
  85. package/dest/test/fake_l1_state.js +421 -0
  86. package/dest/test/index.d.ts +2 -1
  87. package/dest/test/index.d.ts.map +1 -1
  88. package/dest/test/index.js +4 -1
  89. package/dest/test/mock_archiver.d.ts +2 -2
  90. package/dest/test/mock_archiver.d.ts.map +1 -1
  91. package/dest/test/mock_archiver.js +3 -3
  92. package/dest/test/mock_l1_to_l2_message_source.d.ts +2 -2
  93. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  94. package/dest/test/mock_l1_to_l2_message_source.js +12 -3
  95. package/dest/test/mock_l2_block_source.d.ts +47 -17
  96. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  97. package/dest/test/mock_l2_block_source.js +244 -91
  98. package/dest/test/mock_structs.d.ts +81 -3
  99. package/dest/test/mock_structs.d.ts.map +1 -1
  100. package/dest/test/mock_structs.js +152 -7
  101. package/dest/test/noop_l1_archiver.d.ts +26 -0
  102. package/dest/test/noop_l1_archiver.d.ts.map +1 -0
  103. package/dest/test/noop_l1_archiver.js +72 -0
  104. package/package.json +16 -17
  105. package/src/archiver.ts +488 -0
  106. package/src/{archiver/config.ts → config.ts} +20 -5
  107. package/src/errors.ts +88 -0
  108. package/src/factory.ts +142 -11
  109. package/src/index.ts +11 -3
  110. package/src/interfaces.ts +9 -0
  111. package/src/l1/README.md +55 -0
  112. package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +46 -34
  113. package/src/l1/calldata_retriever.ts +511 -0
  114. package/src/{archiver/l1 → l1}/data_retrieval.ts +93 -99
  115. package/src/{archiver/l1 → l1}/spire_proposer.ts +7 -15
  116. package/src/{archiver/l1 → l1}/validate_trace.ts +25 -7
  117. package/src/modules/data_source_base.ts +328 -0
  118. package/src/modules/data_store_updater.ts +453 -0
  119. package/src/{archiver → modules}/instrumentation.ts +33 -70
  120. package/src/modules/l1_synchronizer.ts +930 -0
  121. package/src/{archiver → modules}/validation.ts +11 -6
  122. package/src/store/block_store.ts +990 -0
  123. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +12 -8
  124. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +1 -1
  125. package/src/store/kv_archiver_store.ts +671 -0
  126. package/src/store/l2_tips_cache.ts +89 -0
  127. package/src/store/log_store.ts +637 -0
  128. package/src/{archiver/kv_archiver_store → store}/message_store.ts +1 -1
  129. package/src/{archiver/structs → structs}/published.ts +0 -1
  130. package/src/test/fake_l1_state.ts +657 -0
  131. package/src/test/index.ts +4 -0
  132. package/src/test/mock_archiver.ts +4 -3
  133. package/src/test/mock_l1_to_l2_message_source.ts +10 -4
  134. package/src/test/mock_l2_block_source.ts +294 -98
  135. package/src/test/mock_structs.ts +283 -8
  136. package/src/test/noop_l1_archiver.ts +115 -0
  137. package/dest/archiver/archiver.d.ts +0 -284
  138. package/dest/archiver/archiver.d.ts.map +0 -1
  139. package/dest/archiver/archiver.js +0 -1454
  140. package/dest/archiver/archiver_store.d.ts +0 -249
  141. package/dest/archiver/archiver_store.d.ts.map +0 -1
  142. package/dest/archiver/archiver_store.js +0 -4
  143. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  144. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  145. package/dest/archiver/archiver_store_test_suite.js +0 -1273
  146. package/dest/archiver/config.d.ts.map +0 -1
  147. package/dest/archiver/errors.d.ts +0 -12
  148. package/dest/archiver/errors.d.ts.map +0 -1
  149. package/dest/archiver/errors.js +0 -17
  150. package/dest/archiver/index.d.ts +0 -7
  151. package/dest/archiver/index.d.ts.map +0 -1
  152. package/dest/archiver/index.js +0 -4
  153. package/dest/archiver/instrumentation.d.ts +0 -37
  154. package/dest/archiver/instrumentation.d.ts.map +0 -1
  155. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -125
  156. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  157. package/dest/archiver/kv_archiver_store/block_store.js +0 -371
  158. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  159. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  160. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  161. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  162. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -162
  163. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  164. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -288
  165. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -42
  166. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  167. package/dest/archiver/kv_archiver_store/log_store.js +0 -314
  168. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  169. package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +0 -1
  170. package/dest/archiver/l1/calldata_retriever.d.ts +0 -98
  171. package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
  172. package/dest/archiver/l1/calldata_retriever.js +0 -403
  173. package/dest/archiver/l1/data_retrieval.d.ts +0 -87
  174. package/dest/archiver/l1/data_retrieval.d.ts.map +0 -1
  175. package/dest/archiver/l1/debug_tx.d.ts.map +0 -1
  176. package/dest/archiver/l1/spire_proposer.d.ts.map +0 -1
  177. package/dest/archiver/l1/trace_tx.d.ts.map +0 -1
  178. package/dest/archiver/l1/types.d.ts +0 -12
  179. package/dest/archiver/l1/types.d.ts.map +0 -1
  180. package/dest/archiver/l1/validate_trace.d.ts.map +0 -1
  181. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  182. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  183. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  184. package/dest/archiver/structs/published.d.ts +0 -3
  185. package/dest/archiver/structs/published.d.ts.map +0 -1
  186. package/dest/archiver/validation.d.ts +0 -17
  187. package/dest/archiver/validation.d.ts.map +0 -1
  188. package/dest/rpc/index.d.ts +0 -9
  189. package/dest/rpc/index.d.ts.map +0 -1
  190. package/dest/rpc/index.js +0 -15
  191. package/src/archiver/archiver.ts +0 -1906
  192. package/src/archiver/archiver_store.ts +0 -302
  193. package/src/archiver/archiver_store_test_suite.ts +0 -1286
  194. package/src/archiver/errors.ts +0 -26
  195. package/src/archiver/index.ts +0 -6
  196. package/src/archiver/kv_archiver_store/block_store.ts +0 -482
  197. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -413
  198. package/src/archiver/kv_archiver_store/log_store.ts +0 -380
  199. package/src/archiver/l1/README.md +0 -98
  200. package/src/archiver/l1/calldata_retriever.ts +0 -531
  201. package/src/rpc/index.ts +0 -16
  202. /package/dest/{archiver/l1 → l1}/debug_tx.js +0 -0
  203. /package/dest/{archiver/l1 → l1}/trace_tx.js +0 -0
  204. /package/dest/{archiver/l1 → l1}/types.js +0 -0
  205. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  206. /package/dest/{archiver/structs → structs}/inbox_message.js +0 -0
  207. /package/dest/{archiver/structs → structs}/published.js +0 -0
  208. /package/src/{archiver/l1 → l1}/debug_tx.ts +0 -0
  209. /package/src/{archiver/l1 → l1}/trace_tx.ts +0 -0
  210. /package/src/{archiver/l1 → l1}/types.ts +0 -0
  211. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
  212. /package/src/{archiver/structs → structs}/inbox_message.ts +0 -0
@@ -0,0 +1,39 @@
1
+ import type { L2Block } from '@aztec/stdlib/block';
2
+ import type { CheckpointData } from '@aztec/stdlib/checkpoint';
3
+ import { type LmdbStatsCallback, type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
4
+ export declare class ArchiverInstrumentation {
5
+ private telemetry;
6
+ readonly tracer: Tracer;
7
+ private blockHeight;
8
+ private checkpointHeight;
9
+ private txCount;
10
+ private l1BlockHeight;
11
+ private proofsSubmittedDelay;
12
+ private proofsSubmittedCount;
13
+ private dbMetrics;
14
+ private pruneDuration;
15
+ private pruneCount;
16
+ private syncDurationPerBlock;
17
+ private syncBlockCount;
18
+ private manaPerBlock;
19
+ private txsPerBlock;
20
+ private syncDurationPerMessage;
21
+ private syncMessageCount;
22
+ private blockProposalTxTargetCount;
23
+ private log;
24
+ private constructor();
25
+ static new(telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback): Promise<ArchiverInstrumentation>;
26
+ isEnabled(): boolean;
27
+ processNewBlocks(syncTimePerBlock: number, blocks: L2Block[]): void;
28
+ processNewMessages(count: number, syncPerMessageMs: number): void;
29
+ processPrune(duration: number): void;
30
+ updateLastProvenCheckpoint(checkpoint: CheckpointData): void;
31
+ processProofsVerified(logs: {
32
+ proverId: string;
33
+ l2BlockNumber: bigint;
34
+ delay: bigint;
35
+ }[]): void;
36
+ updateL1BlockHeight(blockNumber: bigint): void;
37
+ recordBlockProposalTxTarget(target: string, usedTrace: boolean): void;
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUtMLEtBQUssaUJBQWlCLEVBRXRCLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFHWixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLHFCQUFhLHVCQUF1QjtJQTJCaEMsT0FBTyxDQUFDLFNBQVM7SUExQm5CLFNBQWdCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFL0IsT0FBTyxDQUFDLFdBQVcsQ0FBUTtJQUMzQixPQUFPLENBQUMsZ0JBQWdCLENBQVE7SUFDaEMsT0FBTyxDQUFDLE9BQU8sQ0FBZ0I7SUFDL0IsT0FBTyxDQUFDLGFBQWEsQ0FBUTtJQUM3QixPQUFPLENBQUMsb0JBQW9CLENBQVk7SUFDeEMsT0FBTyxDQUFDLG9CQUFvQixDQUFnQjtJQUM1QyxPQUFPLENBQUMsU0FBUyxDQUFjO0lBRS9CLE9BQU8sQ0FBQyxhQUFhLENBQVk7SUFDakMsT0FBTyxDQUFDLFVBQVUsQ0FBZ0I7SUFFbEMsT0FBTyxDQUFDLG9CQUFvQixDQUFZO0lBQ3hDLE9BQU8sQ0FBQyxjQUFjLENBQWdCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBWTtJQUUvQixPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxPQUFPLENBQUMsMEJBQTBCLENBQWdCO0lBRWxELE9BQU8sQ0FBQyxHQUFHLENBQTRDO0lBRXZELE9BQU8sZUFvRE47SUFFRCxPQUFvQixHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFBRSxpQkFBaUIsb0NBTWhGO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FFMUI7SUFFTSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQVdsRTtJQUVNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxRQU1oRTtJQUVNLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxRQUduQztJQUVNLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxjQUFjLFFBSTNEO0lBRU0scUJBQXFCLENBQUMsSUFBSSxFQUFFO1FBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFBRSxRQVc5RjtJQUVNLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRTdDO0lBRU0sMkJBQTJCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxRQUtwRTtDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/modules/instrumentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IA2BhC,OAAO,CAAC,SAAS;IA1BnB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,0BAA0B,CAAgB;IAElD,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO,eAoDN;IAED,OAAoB,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,iBAAiB,oCAMhF;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAWlE;IAEM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,QAMhE;IAEM,YAAY,CAAC,QAAQ,EAAE,MAAM,QAGnC;IAEM,0BAA0B,CAAC,UAAU,EAAE,cAAc,QAI3D;IAEM,qBAAqB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,QAW9F;IAEM,mBAAmB,CAAC,WAAW,EAAE,MAAM,QAE7C;IAEM,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,QAKpE;CACF"}
@@ -1,9 +1,10 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
- import { Attributes, LmdbMetrics, Metrics, ValueType } from '@aztec/telemetry-client';
2
+ import { Attributes, LmdbMetrics, Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
3
3
  export class ArchiverInstrumentation {
4
4
  telemetry;
5
5
  tracer;
6
6
  blockHeight;
7
+ checkpointHeight;
7
8
  txCount;
8
9
  l1BlockHeight;
9
10
  proofsSubmittedDelay;
@@ -24,67 +25,30 @@ export class ArchiverInstrumentation {
24
25
  this.log = createLogger('archiver:instrumentation');
25
26
  this.tracer = telemetry.getTracer('Archiver');
26
27
  const meter = telemetry.getMeter('Archiver');
27
- this.blockHeight = meter.createGauge(Metrics.ARCHIVER_BLOCK_HEIGHT, {
28
- description: 'The height of the latest block processed by the archiver',
29
- valueType: ValueType.INT
30
- });
31
- this.l1BlockHeight = meter.createGauge(Metrics.ARCHIVER_L1_BLOCK_HEIGHT, {
32
- description: 'The height of the latest L1 block processed by the archiver',
33
- valueType: ValueType.INT
34
- });
35
- this.txCount = meter.createUpDownCounter(Metrics.ARCHIVER_TOTAL_TXS, {
36
- description: 'The total number of transactions',
37
- valueType: ValueType.INT
38
- });
39
- this.proofsSubmittedCount = meter.createUpDownCounter(Metrics.ARCHIVER_ROLLUP_PROOF_COUNT, {
40
- description: 'Number of proofs submitted',
41
- valueType: ValueType.INT
42
- });
43
- this.proofsSubmittedDelay = meter.createHistogram(Metrics.ARCHIVER_ROLLUP_PROOF_DELAY, {
44
- unit: 'ms',
45
- description: 'Time after a block is submitted until its proof is published',
46
- valueType: ValueType.INT
47
- });
48
- this.syncDurationPerBlock = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_BLOCK, {
49
- unit: 'ms',
50
- description: 'Duration to sync a block',
51
- valueType: ValueType.INT
52
- });
53
- this.syncBlockCount = meter.createUpDownCounter(Metrics.ARCHIVER_SYNC_BLOCK_COUNT, {
54
- description: 'Number of blocks synced from L1',
55
- valueType: ValueType.INT
56
- });
57
- this.manaPerBlock = meter.createHistogram(Metrics.ARCHIVER_MANA_PER_BLOCK, {
58
- description: 'The mana consumed by blocks',
59
- valueType: ValueType.DOUBLE,
60
- unit: 'Mmana'
61
- });
62
- this.txsPerBlock = meter.createHistogram(Metrics.ARCHIVER_TXS_PER_BLOCK, {
63
- description: 'The block tx count',
64
- valueType: ValueType.INT,
65
- unit: 'tx'
66
- });
67
- this.syncDurationPerMessage = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_MESSAGE, {
68
- unit: 'ms',
69
- description: 'Duration to sync a message',
70
- valueType: ValueType.INT
71
- });
72
- this.syncMessageCount = meter.createUpDownCounter(Metrics.ARCHIVER_SYNC_MESSAGE_COUNT, {
73
- description: 'Number of L1 to L2 messages synced',
74
- valueType: ValueType.INT
75
- });
76
- this.pruneDuration = meter.createHistogram(Metrics.ARCHIVER_PRUNE_DURATION, {
77
- unit: 'ms',
78
- description: 'Duration to sync a message',
79
- valueType: ValueType.INT
80
- });
81
- this.pruneCount = meter.createUpDownCounter(Metrics.ARCHIVER_PRUNE_COUNT, {
82
- description: 'Number of prunes detected',
83
- valueType: ValueType.INT
84
- });
85
- this.blockProposalTxTargetCount = meter.createUpDownCounter(Metrics.ARCHIVER_BLOCK_PROPOSAL_TX_TARGET_COUNT, {
86
- description: 'Number of block proposals by tx target',
87
- valueType: ValueType.INT
28
+ this.blockHeight = meter.createGauge(Metrics.ARCHIVER_BLOCK_HEIGHT);
29
+ this.checkpointHeight = meter.createGauge(Metrics.ARCHIVER_CHECKPOINT_HEIGHT);
30
+ this.l1BlockHeight = meter.createGauge(Metrics.ARCHIVER_L1_BLOCK_HEIGHT);
31
+ this.txCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_TOTAL_TXS);
32
+ this.proofsSubmittedCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_ROLLUP_PROOF_COUNT, {
33
+ [Attributes.PROOF_TIMED_OUT]: [
34
+ true,
35
+ false
36
+ ]
37
+ });
38
+ this.proofsSubmittedDelay = meter.createHistogram(Metrics.ARCHIVER_ROLLUP_PROOF_DELAY);
39
+ this.syncDurationPerBlock = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_BLOCK);
40
+ this.syncBlockCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_SYNC_BLOCK_COUNT);
41
+ this.manaPerBlock = meter.createHistogram(Metrics.ARCHIVER_MANA_PER_BLOCK);
42
+ this.txsPerBlock = meter.createHistogram(Metrics.ARCHIVER_TXS_PER_BLOCK);
43
+ this.syncDurationPerMessage = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_MESSAGE);
44
+ this.syncMessageCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_SYNC_MESSAGE_COUNT);
45
+ this.pruneDuration = meter.createHistogram(Metrics.ARCHIVER_PRUNE_DURATION);
46
+ this.pruneCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_PRUNE_COUNT);
47
+ this.blockProposalTxTargetCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_BLOCK_PROPOSAL_TX_TARGET_COUNT, {
48
+ [Attributes.L1_BLOCK_PROPOSAL_USED_TRACE]: [
49
+ true,
50
+ false
51
+ ]
88
52
  });
89
53
  this.dbMetrics = new LmdbMetrics(meter, {
90
54
  [Attributes.DB_DATA_TYPE]: 'archiver'
@@ -92,9 +56,6 @@ export class ArchiverInstrumentation {
92
56
  }
93
57
  static async new(telemetry, lmdbStats) {
94
58
  const instance = new ArchiverInstrumentation(telemetry, lmdbStats);
95
- instance.syncBlockCount.add(0);
96
- instance.syncMessageCount.add(0);
97
- instance.pruneCount.add(0);
98
59
  await instance.telemetry.flush();
99
60
  return instance;
100
61
  }
@@ -104,6 +65,7 @@ export class ArchiverInstrumentation {
104
65
  processNewBlocks(syncTimePerBlock, blocks) {
105
66
  this.syncDurationPerBlock.record(Math.ceil(syncTimePerBlock));
106
67
  this.blockHeight.record(Math.max(...blocks.map((b)=>b.number)));
68
+ this.checkpointHeight.record(Math.max(...blocks.map((b)=>b.checkpointNumber)));
107
69
  this.syncBlockCount.add(blocks.length);
108
70
  for (const block of blocks){
109
71
  this.txCount.add(block.body.txEffects.length);
@@ -122,8 +84,12 @@ export class ArchiverInstrumentation {
122
84
  this.pruneCount.add(1);
123
85
  this.pruneDuration.record(Math.ceil(duration));
124
86
  }
125
- updateLastProvenBlock(blockNumber) {
126
- this.blockHeight.record(blockNumber, {
87
+ updateLastProvenCheckpoint(checkpoint) {
88
+ const lastBlockNumberInCheckpoint = checkpoint.startBlock + checkpoint.blockCount - 1;
89
+ this.blockHeight.record(lastBlockNumberInCheckpoint, {
90
+ [Attributes.STATUS]: 'proven'
91
+ });
92
+ this.checkpointHeight.record(checkpoint.checkpointNumber, {
127
93
  [Attributes.STATUS]: 'proven'
128
94
  });
129
95
  }
@@ -0,0 +1,71 @@
1
+ import type { BlobClientInterface } from '@aztec/blob-client/client';
2
+ import { EpochCache } from '@aztec/epoch-cache';
3
+ import { InboxContract, RollupContract } from '@aztec/ethereum/contracts';
4
+ import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
5
+ import { Buffer32 } from '@aztec/foundation/buffer';
6
+ import { Fr } from '@aztec/foundation/curves/bn254';
7
+ import { type Logger } from '@aztec/foundation/log';
8
+ import { DateProvider } from '@aztec/foundation/timer';
9
+ import { type ArchiverEmitter } from '@aztec/stdlib/block';
10
+ import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
11
+ import { type Traceable, type Tracer } from '@aztec/telemetry-client';
12
+ import type { KVArchiverDataStore } from '../store/kv_archiver_store.js';
13
+ import type { L2TipsCache } from '../store/l2_tips_cache.js';
14
+ import type { ArchiverInstrumentation } from './instrumentation.js';
15
+ /**
16
+ * Handles L1 synchronization for the archiver.
17
+ * Responsible for fetching checkpoints, L1→L2 messages, and handling L1 reorgs.
18
+ */
19
+ export declare class ArchiverL1Synchronizer implements Traceable {
20
+ private readonly publicClient;
21
+ private readonly debugClient;
22
+ private readonly rollup;
23
+ private readonly inbox;
24
+ private readonly store;
25
+ private config;
26
+ private readonly blobClient;
27
+ private readonly epochCache;
28
+ private readonly dateProvider;
29
+ private readonly instrumentation;
30
+ private readonly l1Constants;
31
+ private readonly events;
32
+ private readonly log;
33
+ private l1BlockNumber;
34
+ private l1BlockHash;
35
+ private l1Timestamp;
36
+ private readonly updater;
37
+ readonly tracer: Tracer;
38
+ constructor(publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, rollup: RollupContract, inbox: InboxContract, store: KVArchiverDataStore, config: {
39
+ batchSize: number;
40
+ skipValidateCheckpointAttestations?: boolean;
41
+ maxAllowedEthClientDriftSeconds: number;
42
+ }, blobClient: BlobClientInterface, epochCache: EpochCache, dateProvider: DateProvider, instrumentation: ArchiverInstrumentation, l1Constants: L1RollupConstants & {
43
+ l1StartBlockHash: Buffer32;
44
+ genesisArchiveRoot: Fr;
45
+ }, events: ArchiverEmitter, tracer: Tracer, l2TipsCache?: L2TipsCache, log?: Logger);
46
+ /** Sets new config */
47
+ setConfig(newConfig: {
48
+ batchSize: number;
49
+ skipValidateCheckpointAttestations?: boolean;
50
+ maxAllowedEthClientDriftSeconds: number;
51
+ }): void;
52
+ /** Returns the last L1 block number that was synced. */
53
+ getL1BlockNumber(): bigint | undefined;
54
+ /** Returns the last L1 timestamp that was synced. */
55
+ getL1Timestamp(): bigint | undefined;
56
+ /** Checks that the ethereum node we are connected to has a latest timestamp no more than the allowed drift. Throw if not. */
57
+ testEthereumNodeSynced(): Promise<void>;
58
+ syncFromL1(initialSyncComplete: boolean): Promise<void>;
59
+ private pruneUncheckpointedBlocks;
60
+ private canPrune;
61
+ private handleEpochPrune;
62
+ private nextRange;
63
+ private handleL1ToL2Messages;
64
+ private retrieveL1ToL2Message;
65
+ private rollbackL1ToL2Messages;
66
+ private getL1BlockHash;
67
+ private handleCheckpoints;
68
+ private checkForNewCheckpointsBeforeL1SyncPoint;
69
+ private getCheckpointHeader;
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfc3luY2hyb25pemVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9sMV9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3JGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzRCxNQUFNLHFCQUFxQixDQUFDO0FBRS9HLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUF3QyxNQUFNLDZCQUE2QixDQUFDO0FBRTNHLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBeUIsTUFBTSx5QkFBeUIsQ0FBQztBQVM3RixPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzdELE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFhcEU7OztHQUdHO0FBQ0gscUJBQWEsc0JBQXVCLFlBQVcsU0FBUztJQVNwRCxPQUFPLENBQUMsUUFBUSxDQUFDLFlB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_synchronizer.d.ts","sourceRoot":"","sources":["../../src/modules/l1_synchronizer.ts"],"names":[],"mappings":"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"}