@aztec/archiver 0.0.1-commit.cd76b27 → 0.0.1-commit.ce4f8c4f2

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 (88) hide show
  1. package/dest/archiver.d.ts +3 -4
  2. package/dest/archiver.d.ts.map +1 -1
  3. package/dest/archiver.js +67 -23
  4. package/dest/config.d.ts +3 -3
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +2 -1
  7. package/dest/errors.d.ts +21 -9
  8. package/dest/errors.d.ts.map +1 -1
  9. package/dest/errors.js +27 -14
  10. package/dest/factory.d.ts +4 -5
  11. package/dest/factory.d.ts.map +1 -1
  12. package/dest/factory.js +25 -25
  13. package/dest/l1/bin/retrieve-calldata.js +32 -28
  14. package/dest/l1/calldata_retriever.d.ts +70 -53
  15. package/dest/l1/calldata_retriever.d.ts.map +1 -1
  16. package/dest/l1/calldata_retriever.js +178 -260
  17. package/dest/l1/data_retrieval.d.ts +7 -8
  18. package/dest/l1/data_retrieval.d.ts.map +1 -1
  19. package/dest/l1/data_retrieval.js +18 -17
  20. package/dest/l1/spire_proposer.d.ts +5 -5
  21. package/dest/l1/spire_proposer.d.ts.map +1 -1
  22. package/dest/l1/spire_proposer.js +9 -17
  23. package/dest/modules/data_source_base.d.ts +5 -5
  24. package/dest/modules/data_source_base.d.ts.map +1 -1
  25. package/dest/modules/data_source_base.js +5 -5
  26. package/dest/modules/data_store_updater.d.ts +17 -12
  27. package/dest/modules/data_store_updater.d.ts.map +1 -1
  28. package/dest/modules/data_store_updater.js +78 -77
  29. package/dest/modules/instrumentation.d.ts +12 -1
  30. package/dest/modules/instrumentation.d.ts.map +1 -1
  31. package/dest/modules/instrumentation.js +10 -0
  32. package/dest/modules/l1_synchronizer.d.ts +3 -7
  33. package/dest/modules/l1_synchronizer.d.ts.map +1 -1
  34. package/dest/modules/l1_synchronizer.js +46 -11
  35. package/dest/store/block_store.d.ts +12 -13
  36. package/dest/store/block_store.d.ts.map +1 -1
  37. package/dest/store/block_store.js +61 -61
  38. package/dest/store/contract_class_store.d.ts +2 -3
  39. package/dest/store/contract_class_store.d.ts.map +1 -1
  40. package/dest/store/contract_class_store.js +7 -67
  41. package/dest/store/contract_instance_store.d.ts +1 -1
  42. package/dest/store/contract_instance_store.d.ts.map +1 -1
  43. package/dest/store/contract_instance_store.js +6 -2
  44. package/dest/store/kv_archiver_store.d.ts +28 -18
  45. package/dest/store/kv_archiver_store.d.ts.map +1 -1
  46. package/dest/store/kv_archiver_store.js +34 -21
  47. package/dest/store/log_store.d.ts +6 -3
  48. package/dest/store/log_store.d.ts.map +1 -1
  49. package/dest/store/log_store.js +93 -16
  50. package/dest/store/message_store.d.ts +5 -1
  51. package/dest/store/message_store.d.ts.map +1 -1
  52. package/dest/store/message_store.js +14 -1
  53. package/dest/test/fake_l1_state.d.ts +10 -1
  54. package/dest/test/fake_l1_state.d.ts.map +1 -1
  55. package/dest/test/fake_l1_state.js +81 -15
  56. package/dest/test/mock_l2_block_source.d.ts +4 -3
  57. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  58. package/dest/test/mock_l2_block_source.js +7 -4
  59. package/dest/test/mock_structs.d.ts +4 -1
  60. package/dest/test/mock_structs.d.ts.map +1 -1
  61. package/dest/test/mock_structs.js +13 -1
  62. package/dest/test/noop_l1_archiver.d.ts +4 -1
  63. package/dest/test/noop_l1_archiver.d.ts.map +1 -1
  64. package/dest/test/noop_l1_archiver.js +5 -1
  65. package/package.json +13 -13
  66. package/src/archiver.ts +80 -23
  67. package/src/config.ts +8 -1
  68. package/src/errors.ts +40 -24
  69. package/src/factory.ts +23 -16
  70. package/src/l1/README.md +25 -68
  71. package/src/l1/bin/retrieve-calldata.ts +40 -27
  72. package/src/l1/calldata_retriever.ts +231 -383
  73. package/src/l1/data_retrieval.ts +20 -25
  74. package/src/l1/spire_proposer.ts +7 -15
  75. package/src/modules/data_source_base.ts +11 -6
  76. package/src/modules/data_store_updater.ts +83 -107
  77. package/src/modules/instrumentation.ts +20 -0
  78. package/src/modules/l1_synchronizer.ts +55 -20
  79. package/src/store/block_store.ts +72 -69
  80. package/src/store/contract_class_store.ts +8 -106
  81. package/src/store/contract_instance_store.ts +8 -5
  82. package/src/store/kv_archiver_store.ts +43 -32
  83. package/src/store/log_store.ts +126 -27
  84. package/src/store/message_store.ts +20 -1
  85. package/src/test/fake_l1_state.ts +110 -19
  86. package/src/test/mock_l2_block_source.ts +15 -3
  87. package/src/test/mock_structs.ts +20 -6
  88. package/src/test/noop_l1_archiver.ts +7 -1
@@ -1,5 +1,7 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import type { L2Block } from '@aztec/stdlib/block';
2
3
  import type { CheckpointData } from '@aztec/stdlib/checkpoint';
4
+ import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
3
5
  import { type LmdbStatsCallback, type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
4
6
  export declare class ArchiverInstrumentation {
5
7
  private telemetry;
@@ -20,6 +22,7 @@ export declare class ArchiverInstrumentation {
20
22
  private syncDurationPerMessage;
21
23
  private syncMessageCount;
22
24
  private blockProposalTxTargetCount;
25
+ private checkpointL1InclusionDelay;
23
26
  private log;
24
27
  private constructor();
25
28
  static new(telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback): Promise<ArchiverInstrumentation>;
@@ -35,5 +38,13 @@ export declare class ArchiverInstrumentation {
35
38
  }[]): void;
36
39
  updateL1BlockHeight(blockNumber: bigint): void;
37
40
  recordBlockProposalTxTarget(target: string, usedTrace: boolean): void;
41
+ /**
42
+ * Records L1 inclusion timing for a checkpoint observed on L1 (seconds into the L2 slot).
43
+ */
44
+ processCheckpointL1Timing(data: {
45
+ slotNumber: SlotNumber;
46
+ l1Timestamp: bigint;
47
+ l1Constants: Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>;
48
+ }): void;
38
49
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUtMLEtBQUssaUJBQWlCLEVBRXRCLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFHWixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLHFCQUFhLHVCQUF1QjtJQTJCaEMsT0FBTyxDQUFDLFNBQVM7SUExQm5CLFNBQWdCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFL0IsT0FBTyxDQUFDLFdBQVcsQ0FBUTtJQUMzQixPQUFPLENBQUMsZ0JBQWdCLENBQVE7SUFDaEMsT0FBTyxDQUFDLE9BQU8sQ0FBZ0I7SUFDL0IsT0FBTyxDQUFDLGFBQWEsQ0FBUTtJQUM3QixPQUFPLENBQUMsb0JBQW9CLENBQVk7SUFDeEMsT0FBTyxDQUFDLG9CQUFvQixDQUFnQjtJQUM1QyxPQUFPLENBQUMsU0FBUyxDQUFjO0lBRS9CLE9BQU8sQ0FBQyxhQUFhLENBQVk7SUFDakMsT0FBTyxDQUFDLFVBQVUsQ0FBZ0I7SUFFbEMsT0FBTyxDQUFDLG9CQUFvQixDQUFZO0lBQ3hDLE9BQU8sQ0FBQyxjQUFjLENBQWdCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBWTtJQUUvQixPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxPQUFPLENBQUMsMEJBQTBCLENBQWdCO0lBRWxELE9BQU8sQ0FBQyxHQUFHLENBQTRDO0lBRXZELE9BQU8sZUFvRE47SUFFRCxPQUFvQixHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFBRSxpQkFBaUIsb0NBTWhGO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FFMUI7SUFFTSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQVdsRTtJQUVNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxRQU1oRTtJQUVNLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxRQUduQztJQUVNLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxjQUFjLFFBSTNEO0lBRU0scUJBQXFCLENBQUMsSUFBSSxFQUFFO1FBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFBRSxRQVc5RjtJQUVNLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRTdDO0lBRU0sMkJBQTJCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxRQUtwRTtDQUNGIn0=
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyxlQUFlLEVBQ3BCLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFFakMscUJBQWEsdUJBQXVCO0lBNkJoQyxPQUFPLENBQUMsU0FBUztJQTVCbkIsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsV0FBVyxDQUFRO0lBQzNCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBUTtJQUNoQyxPQUFPLENBQUMsT0FBTyxDQUFnQjtJQUMvQixPQUFPLENBQUMsYUFBYSxDQUFRO0lBQzdCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBWTtJQUN4QyxPQUFPLENBQUMsb0JBQW9CLENBQWdCO0lBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGFBQWEsQ0FBWTtJQUNqQyxPQUFPLENBQUMsVUFBVSxDQUFnQjtJQUVsQyxPQUFPLENBQUMsb0JBQW9CLENBQVk7SUFDeEMsT0FBTyxDQUFDLGNBQWMsQ0FBZ0I7SUFDdEMsT0FBTyxDQUFDLFlBQVksQ0FBWTtJQUNoQyxPQUFPLENBQUMsV0FBVyxDQUFZO0lBRS9CLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBWTtJQUMxQyxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBRXhDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBZ0I7SUFFbEQsT0FBTyxDQUFDLDBCQUEwQixDQUFZO0lBRTlDLE9BQU8sQ0FBQyxHQUFHLENBQTRDO0lBRXZELE9BQU8sZUFzRE47SUFFRCxPQUFvQixHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFBRSxpQkFBaUIsb0NBTWhGO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FFMUI7SUFFTSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQVdsRTtJQUVNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxRQU1oRTtJQUVNLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxRQUduQztJQUVNLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxjQUFjLFFBSTNEO0lBRU0scUJBQXFCLENBQUMsSUFBSSxFQUFFO1FBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFBRSxRQVc5RjtJQUVNLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRTdDO0lBRU0sMkJBQTJCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxRQUtwRTtJQUVEOztPQUVHO0lBQ0kseUJBQXlCLENBQUMsSUFBSSxFQUFFO1FBQ3JDLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQztLQUN4RSxHQUFHLElBQUksQ0FJUDtDQUNGIn0=
@@ -1 +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
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/modules/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IA6BhC,OAAO,CAAC,SAAS;IA5BnB,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,0BAA0B,CAAY;IAE9C,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO,eAsDN;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;IAED;;OAEG;IACI,yBAAyB,CAAC,IAAI,EAAE;QACrC,UAAU,EAAE,UAAU,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;KACxE,GAAG,IAAI,CAIP;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
+ import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
2
3
  import { Attributes, LmdbMetrics, Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
3
4
  export class ArchiverInstrumentation {
4
5
  telemetry;
@@ -19,6 +20,7 @@ export class ArchiverInstrumentation {
19
20
  syncDurationPerMessage;
20
21
  syncMessageCount;
21
22
  blockProposalTxTargetCount;
23
+ checkpointL1InclusionDelay;
22
24
  log;
23
25
  constructor(telemetry, lmdbStats){
24
26
  this.telemetry = telemetry;
@@ -50,6 +52,7 @@ export class ArchiverInstrumentation {
50
52
  false
51
53
  ]
52
54
  });
55
+ this.checkpointL1InclusionDelay = meter.createHistogram(Metrics.ARCHIVER_CHECKPOINT_L1_INCLUSION_DELAY);
53
56
  this.dbMetrics = new LmdbMetrics(meter, {
54
57
  [Attributes.DB_DATA_TYPE]: 'archiver'
55
58
  }, lmdbStats);
@@ -114,4 +117,11 @@ export class ArchiverInstrumentation {
114
117
  [Attributes.L1_BLOCK_PROPOSAL_USED_TRACE]: usedTrace
115
118
  });
116
119
  }
120
+ /**
121
+ * Records L1 inclusion timing for a checkpoint observed on L1 (seconds into the L2 slot).
122
+ */ processCheckpointL1Timing(data) {
123
+ const slotStartTs = getTimestampForSlot(data.slotNumber, data.l1Constants);
124
+ const inclusionDelaySeconds = Number(data.l1Timestamp - slotStartTs);
125
+ this.checkpointL1InclusionDelay.record(inclusionDelaySeconds);
126
+ }
117
127
  }
@@ -1,11 +1,9 @@
1
1
  import type { BlobClientInterface } from '@aztec/blob-client/client';
2
2
  import { EpochCache } from '@aztec/epoch-cache';
3
3
  import { InboxContract, RollupContract } from '@aztec/ethereum/contracts';
4
- import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
5
4
  import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
6
5
  import { Buffer32 } from '@aztec/foundation/buffer';
7
6
  import { Fr } from '@aztec/foundation/curves/bn254';
8
- import { EthAddress } from '@aztec/foundation/eth-address';
9
7
  import { type Logger } from '@aztec/foundation/log';
10
8
  import { DateProvider } from '@aztec/foundation/timer';
11
9
  import { type ArchiverEmitter } from '@aztec/stdlib/block';
@@ -23,7 +21,6 @@ export declare class ArchiverL1Synchronizer implements Traceable {
23
21
  private readonly debugClient;
24
22
  private readonly rollup;
25
23
  private readonly inbox;
26
- private readonly l1Addresses;
27
24
  private readonly store;
28
25
  private config;
29
26
  private readonly blobClient;
@@ -38,9 +35,7 @@ export declare class ArchiverL1Synchronizer implements Traceable {
38
35
  private l1Timestamp;
39
36
  private readonly updater;
40
37
  readonly tracer: Tracer;
41
- constructor(publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, rollup: RollupContract, inbox: InboxContract, l1Addresses: Pick<L1ContractAddresses, 'registryAddress' | 'governanceProposerAddress' | 'slashFactoryAddress'> & {
42
- slashingProposerAddress: EthAddress;
43
- }, store: KVArchiverDataStore, config: {
38
+ constructor(publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, rollup: RollupContract, inbox: InboxContract, store: KVArchiverDataStore, config: {
44
39
  batchSize: number;
45
40
  skipValidateCheckpointAttestations?: boolean;
46
41
  maxAllowedEthClientDriftSeconds: number;
@@ -61,6 +56,7 @@ export declare class ArchiverL1Synchronizer implements Traceable {
61
56
  /** Checks that the ethereum node we are connected to has a latest timestamp no more than the allowed drift. Throw if not. */
62
57
  testEthereumNodeSynced(): Promise<void>;
63
58
  syncFromL1(initialSyncComplete: boolean): Promise<void>;
59
+ private updateFinalizedCheckpoint;
64
60
  private pruneUncheckpointedBlocks;
65
61
  private canPrune;
66
62
  private handleEpochPrune;
@@ -73,4 +69,4 @@ export declare class ArchiverL1Synchronizer implements Traceable {
73
69
  private checkForNewCheckpointsBeforeL1SyncPoint;
74
70
  private getCheckpointHeader;
75
71
  }
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfc3luY2hyb25pemVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9sMV9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRWpGLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXBELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzRCxNQUFNLHFCQUFxQixDQUFDO0FBRS9HLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUF3QyxNQUFNLDZCQUE2QixDQUFDO0FBRTNHLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBeUIsTUFBTSx5QkFBeUIsQ0FBQztBQVM3RixPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzdELE9BQU8sS0FBSyxFQUFFLHVCQUF1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
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfc3luY2hyb25pemVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9sMV9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXJGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzRCxNQUFNLHFCQUFxQixDQUFDO0FBRS9HLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUF3QyxNQUFNLDZCQUE2QixDQUFDO0FBRTNHLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBeUIsTUFBTSx5QkFBeUIsQ0FBQztBQVM3RixPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzdELE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFhcEU7OztHQUdHO0FBQ0gscUJBQWEsc0JBQXVCLFlBQVcsU0FBUztJQVNwRCxPQUFPLENBQUMsUUFBUSxDQUFDLFlB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
@@ -1 +1 @@
1
- {"version":3,"file":"l1_synchronizer.d.ts","sourceRoot":"","sources":["../../src/modules/l1_synchronizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"l1_synchronizer.d.ts","sourceRoot":"","sources":["../../src/modules/l1_synchronizer.ts"],"names":[],"mappings":"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"}
@@ -371,6 +371,7 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
371
  return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
372
372
  }
373
373
  var _dec, _dec1, _dec2, _dec3, _initProto;
374
+ import { asyncPool } from '@aztec/foundation/async-pool';
374
375
  import { maxBigint } from '@aztec/foundation/bigint';
375
376
  import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
376
377
  import { Buffer32 } from '@aztec/foundation/buffer';
@@ -396,7 +397,6 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
396
397
  debugClient;
397
398
  rollup;
398
399
  inbox;
399
- l1Addresses;
400
400
  store;
401
401
  config;
402
402
  blobClient;
@@ -435,12 +435,11 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
435
435
  l1Timestamp;
436
436
  updater;
437
437
  tracer;
438
- constructor(publicClient, debugClient, rollup, inbox, l1Addresses, store, config, blobClient, epochCache, dateProvider, instrumentation, l1Constants, events, tracer, l2TipsCache, log = createLogger('archiver:l1-sync')){
438
+ constructor(publicClient, debugClient, rollup, inbox, store, config, blobClient, epochCache, dateProvider, instrumentation, l1Constants, events, tracer, l2TipsCache, log = createLogger('archiver:l1-sync')){
439
439
  this.publicClient = publicClient;
440
440
  this.debugClient = debugClient;
441
441
  this.rollup = rollup;
442
442
  this.inbox = inbox;
443
- this.l1Addresses = l1Addresses;
444
443
  this.store = store;
445
444
  this.config = config;
446
445
  this.blobClient = blobClient;
@@ -451,7 +450,9 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
451
450
  this.events = events;
452
451
  this.log = log;
453
452
  _initProto(this);
454
- this.updater = new ArchiverDataStoreUpdater(this.store, l2TipsCache);
453
+ this.updater = new ArchiverDataStoreUpdater(this.store, l2TipsCache, {
454
+ rollupManaLimit: l1Constants.rollupManaLimit
455
+ });
455
456
  this.tracer = tracer;
456
457
  }
457
458
  /** Sets new config */ setConfig(newConfig) {
@@ -555,6 +556,8 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
555
556
  }
556
557
  this.instrumentation.updateL1BlockHeight(currentL1BlockNumber);
557
558
  }
559
+ // Update the finalized L2 checkpoint based on L1 finality.
560
+ await this.updateFinalizedCheckpoint();
558
561
  // After syncing has completed, update the current l1 block number and timestamp,
559
562
  // otherwise we risk announcing to the world that we've synced to a given point,
560
563
  // but the corresponding blocks have not been processed (see #12631).
@@ -568,6 +571,28 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
568
571
  l1BlockNumberAtEnd
569
572
  });
570
573
  }
574
+ /** Query L1 for its finalized block and update the finalized checkpoint accordingly. */ async updateFinalizedCheckpoint() {
575
+ try {
576
+ const finalizedL1Block = await this.publicClient.getBlock({
577
+ blockTag: 'finalized',
578
+ includeTransactions: false
579
+ });
580
+ const finalizedL1BlockNumber = finalizedL1Block.number;
581
+ const finalizedCheckpointNumber = await this.rollup.getProvenCheckpointNumber({
582
+ blockNumber: finalizedL1BlockNumber
583
+ });
584
+ const localFinalizedCheckpointNumber = await this.store.getFinalizedCheckpointNumber();
585
+ if (localFinalizedCheckpointNumber !== finalizedCheckpointNumber) {
586
+ await this.updater.setFinalizedCheckpointNumber(finalizedCheckpointNumber);
587
+ this.log.info(`Updated finalized chain to checkpoint ${finalizedCheckpointNumber}`, {
588
+ finalizedCheckpointNumber,
589
+ finalizedL1BlockNumber
590
+ });
591
+ }
592
+ } catch (err) {
593
+ this.log.warn(`Failed to update finalized checkpoint: ${err}`);
594
+ }
595
+ }
571
596
  /** Prune all proposed local blocks that should have been checkpointed by now. */ async pruneUncheckpointedBlocks(currentL1Timestamp) {
572
597
  const [lastCheckpointedBlockNumber, lastProposedBlockNumber] = await Promise.all([
573
598
  this.store.getCheckpointedL2BlockNumber(),
@@ -628,12 +653,14 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
628
653
  const pruneFromSlotNumber = header.slotNumber;
629
654
  const pruneFromEpochNumber = getEpochAtSlot(pruneFromSlotNumber, this.l1Constants);
630
655
  const checkpointsToUnwind = localPendingCheckpointNumber - provenCheckpointNumber;
631
- const checkpointPromises = Array.from({
656
+ // Fetch checkpoints and blocks in bounded batches to avoid unbounded concurrent
657
+ // promises when the gap between local pending and proven checkpoint numbers is large.
658
+ const BATCH_SIZE = 10;
659
+ const indices = Array.from({
632
660
  length: checkpointsToUnwind
633
- }).fill(0).map((_, i)=>this.store.getCheckpointData(CheckpointNumber(i + pruneFrom)));
634
- const checkpoints = await Promise.all(checkpointPromises);
635
- const blockPromises = await Promise.all(checkpoints.filter(isDefined).map((cp)=>this.store.getBlocksForCheckpoint(CheckpointNumber(cp.checkpointNumber))));
636
- const newBlocks = blockPromises.filter(isDefined).flat();
661
+ }, (_, i)=>CheckpointNumber(i + pruneFrom));
662
+ const checkpoints = (await asyncPool(BATCH_SIZE, indices, (idx)=>this.store.getCheckpointData(idx))).filter(isDefined);
663
+ const newBlocks = (await asyncPool(BATCH_SIZE, checkpoints, (cp)=>this.store.getBlocksForCheckpoint(CheckpointNumber(cp.checkpointNumber)))).filter(isDefined).flat();
637
664
  // Emit an event for listening services to react to the chain prune
638
665
  this.events.emit(L2BlockSourceEvents.L2PruneUnproven, {
639
666
  type: L2BlockSourceEvents.L2PruneUnproven,
@@ -678,6 +705,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
678
705
  const remoteMessagesState = await this.inbox.getState({
679
706
  blockNumber: currentL1BlockNumber
680
707
  });
708
+ await this.store.setInboxTreeInProgress(remoteMessagesState.treeInProgress);
681
709
  this.log.trace(`Retrieved remote inbox state at L1 block ${currentL1BlockNumber}.`, {
682
710
  localMessagesInserted,
683
711
  localLastMessage,
@@ -945,7 +973,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
945
973
  [searchStartBlock, searchEndBlock] = this.nextRange(searchEndBlock, currentL1BlockNumber);
946
974
  this.log.trace(`Retrieving checkpoints from L1 block ${searchStartBlock} to ${searchEndBlock}`);
947
975
  // TODO(md): Retrieve from blob client then from consensus client, then from peers
948
- const retrievedCheckpoints = await execInSpan(this.tracer, 'Archiver.retrieveCheckpointsFromRollup', ()=>retrieveCheckpointsFromRollup(this.rollup, this.publicClient, this.debugClient, this.blobClient, searchStartBlock, searchEndBlock, this.l1Addresses, this.instrumentation, this.log, !initialSyncComplete));
976
+ const retrievedCheckpoints = await execInSpan(this.tracer, 'Archiver.retrieveCheckpointsFromRollup', ()=>retrieveCheckpointsFromRollup(this.rollup, this.publicClient, this.debugClient, this.blobClient, searchStartBlock, searchEndBlock, this.instrumentation, this.log, !initialSyncComplete));
949
977
  if (retrievedCheckpoints.length === 0) {
950
978
  // We are not calling `setBlockSynchedL1BlockNumber` because it may cause sync issues if based off infura.
951
979
  // See further details in earlier comments.
@@ -1008,6 +1036,13 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1008
1036
  blocks: published.checkpoint.blocks.map((b)=>b.getStats())
1009
1037
  });
1010
1038
  }
1039
+ for (const published of validCheckpoints){
1040
+ this.instrumentation.processCheckpointL1Timing({
1041
+ slotNumber: published.checkpoint.header.slotNumber,
1042
+ l1Timestamp: published.l1.timestamp,
1043
+ l1Constants: this.l1Constants
1044
+ });
1045
+ }
1011
1046
  try {
1012
1047
  const updatedValidationResult = rollupStatus.validationResult === initialValidationResult ? undefined : rollupStatus.validationResult;
1013
1048
  const [processDuration, result] = await elapsed(()=>execInSpan(this.tracer, 'Archiver.addCheckpoints', ()=>this.updater.addCheckpoints(validCheckpoints, updatedValidationResult)));
@@ -1016,7 +1051,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1016
1051
  if (result.prunedBlocks && result.prunedBlocks.length > 0) {
1017
1052
  const prunedCheckpointNumber = result.prunedBlocks[0].checkpointNumber;
1018
1053
  const prunedSlotNumber = result.prunedBlocks[0].header.globalVariables.slotNumber;
1019
- this.log.warn(`Pruned ${result.prunedBlocks.length} mismatching blocks for checkpoint ${prunedCheckpointNumber}`, {
1054
+ this.log.info(`Pruned ${result.prunedBlocks.length} mismatching blocks for checkpoint ${prunedCheckpointNumber}`, {
1020
1055
  prunedBlocks: result.prunedBlocks.map((b)=>b.toBlockInfo()),
1021
1056
  prunedSlotNumber,
1022
1057
  prunedCheckpointNumber
@@ -4,7 +4,7 @@ import type { AztecAsyncKVStore } from '@aztec/kv-store';
4
4
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
5
  import { type BlockData, BlockHash, CheckpointedL2Block, L2Block, type ValidateCheckpointResult } from '@aztec/stdlib/block';
6
6
  import { type CheckpointData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
7
- import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
7
+ import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
8
8
  import { BlockHeader, type IndexedTxEffect, TxHash, TxReceipt } from '@aztec/stdlib/tx';
9
9
  export { TxReceipt, type TxEffect, type TxHash } from '@aztec/stdlib/tx';
10
10
  export type RemoveCheckpointsResult = {
@@ -16,24 +16,21 @@ export type RemoveCheckpointsResult = {
16
16
  export declare class BlockStore {
17
17
  #private;
18
18
  private db;
19
- private l1Constants;
20
- constructor(db: AztecAsyncKVStore, l1Constants: Pick<L1RollupConstants, 'epochDuration'>);
19
+ constructor(db: AztecAsyncKVStore);
21
20
  /**
22
- * Computes the finalized block number based on the proven block number.
23
- * A block is considered finalized when it's 2 epochs behind the proven block.
24
- * TODO(#13569): Compute proper finalized block number based on L1 finalized block.
25
- * TODO(palla/mbps): Even the provisional computation is wrong, since it should subtract checkpoints, not blocks
21
+ * Returns the finalized L2 block number. An L2 block is finalized when it was proven
22
+ * in an L1 block that has itself been finalized on Ethereum.
26
23
  * @returns The finalized block number.
27
24
  */
28
25
  getFinalizedL2BlockNumber(): Promise<BlockNumber>;
29
26
  /**
30
- * Append new proposed blocks to the store's list. All blocks must be for the 'current' checkpoint.
31
- * These are uncheckpointed blocks that have been proposed by the sequencer but not yet included in a checkpoint on L1.
27
+ * Append a new proposed block to the store.
28
+ * This is an uncheckpointed block that has been proposed by the sequencer but not yet included in a checkpoint on L1.
32
29
  * For checkpointed blocks (already published to L1), use addCheckpoints() instead.
33
- * @param blocks - The proposed L2 blocks to be added to the store.
30
+ * @param block - The proposed L2 block to be added to the store.
34
31
  * @returns True if the operation is successful.
35
32
  */
36
- addProposedBlocks(blocks: L2Block[], opts?: {
33
+ addProposedBlock(block: L2Block, opts?: {
37
34
  force?: boolean;
38
35
  }): Promise<boolean>;
39
36
  /**
@@ -155,7 +152,7 @@ export declare class BlockStore {
155
152
  * @param txHash - The hash of a tx we try to get the receipt for.
156
153
  * @returns The requested tx receipt (or undefined if not found).
157
154
  */
158
- getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
155
+ getSettledTxReceipt(txHash: TxHash, l1Constants?: Pick<L1RollupConstants, 'epochDuration'>): Promise<TxReceipt | undefined>;
159
156
  /**
160
157
  * Looks up which block included the requested tx effect.
161
158
  * @param txHash - The txHash of the tx.
@@ -182,6 +179,8 @@ export declare class BlockStore {
182
179
  setSynchedL1BlockNumber(l1BlockNumber: bigint): Promise<boolean>;
183
180
  getProvenCheckpointNumber(): Promise<CheckpointNumber>;
184
181
  setProvenCheckpointNumber(checkpointNumber: CheckpointNumber): Promise<boolean>;
182
+ getFinalizedCheckpointNumber(): Promise<CheckpointNumber>;
183
+ setFinalizedCheckpointNumber(checkpointNumber: CheckpointNumber): Promise<boolean>;
185
184
  /**
186
185
  * Gets the pending chain validation status.
187
186
  * @returns The validation status or undefined if not set.
@@ -193,4 +192,4 @@ export declare class BlockStore {
193
192
  */
194
193
  setPendingChainValidationStatus(status: ValidateCheckpointResult | undefined): Promise<void>;
195
194
  }
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZS9ibG9ja19zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUF5QixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuSCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFNcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQTZDLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUNMLEtBQUssU0FBUyxFQUNkLFNBQVMsRUFFVCxtQkFBbUIsRUFFbkIsT0FBTyxFQUNQLEtBQUssd0JBQXdCLEVBRzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUFtQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JHLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHckUsT0FBTyxFQUNMLFdBQVcsRUFDWCxLQUFLLGVBQWUsRUFFcEIsTUFBTSxFQUNOLFNBQVMsRUFJVixNQUFNLGtCQUFrQixDQUFDO0FBZTFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxRQUFRLEVBQUUsS0FBSyxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQXVCekUsTUFBTSxNQUFNLHVCQUF1QixHQUFHO0lBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQTtDQUFFLENBQUM7QUFFL0U7O0dBRUc7QUFDSCxxQkFBYSxVQUFVOztJQXFDbkIsT0FBTyxDQUFDLEVBQUU7SUFDVixPQUFPLENBQUMsV0FBVztJQUZyQixZQUNVLEVBQUUsRUFBRSxpQkFBaUIsRUFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFB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
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZS9ibG9ja19zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUF5QixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuSCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFNcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQTZDLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUNMLEtBQUssU0FBUyxFQUNkLFNBQVMsRUFFVCxtQkFBbUIsRUFFbkIsT0FBTyxFQUNQLEtBQUssd0JBQXdCLEVBRzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUFtQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBR3JGLE9BQU8sRUFDTCxXQUFXLEVBQ1gsS0FBSyxlQUFlLEVBRXBCLE1BQU0sRUFDTixTQUFTLEVBSVYsTUFBTSxrQkFBa0IsQ0FBQztBQWMxQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUF1QnpFLE1BQU0sTUFBTSx1QkFBdUIsR0FBRztJQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUE7Q0FBRSxDQUFDO0FBRS9FOztHQUVHO0FBQ0gscUJBQWEsVUFBVTs7SUF1Q1QsT0FBTyxDQUFDLEVBQUU7SUFBdEIsWUFBb0IsRUFBRSxFQUFFLGlCQUFpQixFQWF4QztJQUVEOzs7O09BSUc7SUFDRyx5QkFBeUIsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLENBVXREO0lBRUQ7Ozs7OztPQU1HO0lBQ0csZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUU7UUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUE7S0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0E4RHZGO0lBRUQ7Ozs7T0FJRztJQUNHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEdBQUU7UUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUE7S0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0E0R3pHO1lBRWEsa0JBQWtCO1lBNkJsQixXQUFXO0lBZ0J6Qjs7OztPQUlHO0lBQ0csc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBNENqRztJQUVLLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLENBTS9GO0lBRUsscUJBQXFCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBVTVGO0lBRUQsdUdBQXVHO0lBQ2pHLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FZekc7SUFFRCxPQUFPLENBQUMsbUNBQW1DO0lBYXJDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FlL0Y7SUFFRDs7Ozs7T0FLRztJQUNHLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBaUJqRTtJQUVEOzs7OztPQUtHO0lBQ0csaUJBQWlCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0F1QnBFO0lBRUssb0JBQW9CLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQVdqRDtJQUVLLG9CQUFvQixJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FLakQ7SUFFSyx5QkFBeUIsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FNM0Q7SUFFSyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsQ0FtQnhGO0lBRUQ7Ozs7O09BS0c7SUFDSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsQ0FvQjFHO0lBRUssMEJBQTBCLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBTS9GO0lBRUssNkJBQTZCLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBTXpGO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQU9sRjtJQUVEOzs7O09BSUc7SUFDRyxZQUFZLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQU0zRTtJQUVEOzs7O09BSUc7SUFDRyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBTXZFO0lBRUQ7Ozs7T0FJRztJQUNHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBTXJFO0lBRUQ7Ozs7T0FJRztJQUNHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBTXZFO0lBRUQ7Ozs7T0FJRztJQUNHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FNakU7SUFFRDs7OztPQUlHO0lBQ0csb0JBQW9CLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQVVqRjtJQUVEOzs7O09BSUc7SUFDRyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBVTNFO0lBRUQ7Ozs7O09BS0c7SUFDSSxlQUFlLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQVU1RjtZQUVjLGdCQUFnQjtJQWEvQixPQUFPLENBQUMsNEJBQTRCO1lBVXRCLHdCQUF3QjtJQXNDdEM7Ozs7T0FJRztJQUNHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLENBTXRFO0lBRUQ7Ozs7T0FJRztJQUNHLG1CQUFtQixDQUN2QixNQUFNLEVBQUUsTUFBTSxFQUNkLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsR0FDckQsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0F3Q2hDO0lBRUQ7Ozs7T0FJRztJQUNVLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQU90RztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUU1RztJQUVEOzs7T0FHRztJQUNHLDRCQUE0QixJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FPekQ7SUFFSyxzQkFBc0IsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLENBR25EO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FFckQ7SUFFRCx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxvQkFFNUM7SUFFSyx5QkFBeUIsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FRM0Q7SUFFSyx5QkFBeUIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0Isb0JBR2pFO0lBRUssNEJBQTRCLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBUTlEO0lBRUQsNEJBQTRCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLG9CQUU5RDtJQWNEOzs7T0FHRztJQUNHLCtCQUErQixJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUMsQ0FNckY7SUFFRDs7O09BR0c7SUFDRywrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPakc7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"block_store.d.ts","sourceRoot":"","sources":["../../src/store/block_store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block_store.d.ts","sourceRoot":"","sources":["../../src/store/block_store.ts"],"names":[],"mappings":"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"}
@@ -8,16 +8,16 @@ import { bufferToHex } from '@aztec/foundation/string';
8
8
  import { isDefined } from '@aztec/foundation/types';
9
9
  import { Body, CheckpointedL2Block, CommitteeAttestation, L2Block, deserializeValidateCheckpointResult, serializeValidateCheckpointResult } from '@aztec/stdlib/block';
10
10
  import { L1PublishedData } from '@aztec/stdlib/checkpoint';
11
+ import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
11
12
  import { CheckpointHeader } from '@aztec/stdlib/rollup';
12
13
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
13
14
  import { BlockHeader, TxHash, TxReceipt, TxStatus, deserializeIndexedTxEffect, serializeIndexedTxEffect } from '@aztec/stdlib/tx';
14
- import { BlockArchiveNotConsistentError, BlockIndexNotSequentialError, BlockNotFoundError, BlockNumberNotSequentialError, CannotOverwriteCheckpointedBlockError, CheckpointNotFoundError, CheckpointNumberNotConsistentError, CheckpointNumberNotSequentialError, InitialBlockNumberNotSequentialError, InitialCheckpointNumberNotSequentialError } from '../errors.js';
15
+ import { BlockAlreadyCheckpointedError, BlockArchiveNotConsistentError, BlockIndexNotSequentialError, BlockNotFoundError, BlockNumberNotSequentialError, CannotOverwriteCheckpointedBlockError, CheckpointNotFoundError, CheckpointNumberNotSequentialError, InitialCheckpointNumberNotSequentialError } from '../errors.js';
15
16
  export { TxReceipt } from '@aztec/stdlib/tx';
16
17
  /**
17
18
  * LMDB-based block storage for the archiver.
18
19
  */ export class BlockStore {
19
20
  db;
20
- l1Constants;
21
21
  /** Map block number to block data */ #blocks;
22
22
  /** Map checkpoint number to checkpoint data */ #checkpoints;
23
23
  /** Map slot number to checkpoint number, for looking up checkpoints by slot range. */ #slotToCheckpoint;
@@ -25,14 +25,14 @@ export { TxReceipt } from '@aztec/stdlib/tx';
25
25
  /** Tx hash to serialized IndexedTxEffect */ #txEffects;
26
26
  /** Stores L1 block number in which the last processed L2 block was included */ #lastSynchedL1Block;
27
27
  /** Stores last proven checkpoint */ #lastProvenCheckpoint;
28
+ /** Stores last finalized checkpoint (proven at or before the finalized L1 block) */ #lastFinalizedCheckpoint;
28
29
  /** Stores the pending chain validation status */ #pendingChainValidationStatus;
29
30
  /** Index mapping a contract's address (as a string) to its location in a block */ #contractIndex;
30
31
  /** Index mapping block hash to block number */ #blockHashIndex;
31
32
  /** Index mapping block archive to block number */ #blockArchiveIndex;
32
33
  #log;
33
- constructor(db, l1Constants){
34
+ constructor(db){
34
35
  this.db = db;
35
- this.l1Constants = l1Constants;
36
36
  this.#log = createLogger('archiver:block_store');
37
37
  this.#blocks = db.openMap('archiver_blocks');
38
38
  this.#blockTxs = db.openMap('archiver_block_txs');
@@ -42,90 +42,78 @@ export { TxReceipt } from '@aztec/stdlib/tx';
42
42
  this.#blockArchiveIndex = db.openMap('archiver_block_archive_index');
43
43
  this.#lastSynchedL1Block = db.openSingleton('archiver_last_synched_l1_block');
44
44
  this.#lastProvenCheckpoint = db.openSingleton('archiver_last_proven_l2_checkpoint');
45
+ this.#lastFinalizedCheckpoint = db.openSingleton('archiver_last_finalized_l2_checkpoint');
45
46
  this.#pendingChainValidationStatus = db.openSingleton('archiver_pending_chain_validation_status');
46
47
  this.#checkpoints = db.openMap('archiver_checkpoints');
47
48
  this.#slotToCheckpoint = db.openMap('archiver_slot_to_checkpoint');
48
49
  }
49
50
  /**
50
- * Computes the finalized block number based on the proven block number.
51
- * A block is considered finalized when it's 2 epochs behind the proven block.
52
- * TODO(#13569): Compute proper finalized block number based on L1 finalized block.
53
- * TODO(palla/mbps): Even the provisional computation is wrong, since it should subtract checkpoints, not blocks
51
+ * Returns the finalized L2 block number. An L2 block is finalized when it was proven
52
+ * in an L1 block that has itself been finalized on Ethereum.
54
53
  * @returns The finalized block number.
55
54
  */ async getFinalizedL2BlockNumber() {
56
- const provenBlockNumber = await this.getProvenBlockNumber();
57
- return BlockNumber(Math.max(provenBlockNumber - this.l1Constants.epochDuration * 2, 0));
55
+ const finalizedCheckpointNumber = await this.getFinalizedCheckpointNumber();
56
+ if (finalizedCheckpointNumber === INITIAL_CHECKPOINT_NUMBER - 1) {
57
+ return BlockNumber(INITIAL_L2_BLOCK_NUM - 1);
58
+ }
59
+ const checkpointStorage = await this.#checkpoints.getAsync(finalizedCheckpointNumber);
60
+ if (!checkpointStorage) {
61
+ throw new CheckpointNotFoundError(finalizedCheckpointNumber);
62
+ }
63
+ return BlockNumber(checkpointStorage.startBlock + checkpointStorage.blockCount - 1);
58
64
  }
59
65
  /**
60
- * Append new proposed blocks to the store's list. All blocks must be for the 'current' checkpoint.
61
- * These are uncheckpointed blocks that have been proposed by the sequencer but not yet included in a checkpoint on L1.
66
+ * Append a new proposed block to the store.
67
+ * This is an uncheckpointed block that has been proposed by the sequencer but not yet included in a checkpoint on L1.
62
68
  * For checkpointed blocks (already published to L1), use addCheckpoints() instead.
63
- * @param blocks - The proposed L2 blocks to be added to the store.
69
+ * @param block - The proposed L2 block to be added to the store.
64
70
  * @returns True if the operation is successful.
65
- */ async addProposedBlocks(blocks, opts = {}) {
66
- if (blocks.length === 0) {
67
- return true;
68
- }
71
+ */ async addProposedBlock(block, opts = {}) {
69
72
  return await this.db.transactionAsync(async ()=>{
70
- // Check that the block immediately before the first block to be added is present in the store.
71
- const firstBlockNumber = blocks[0].number;
72
- const firstBlockCheckpointNumber = blocks[0].checkpointNumber;
73
- const firstBlockIndex = blocks[0].indexWithinCheckpoint;
74
- const firstBlockLastArchive = blocks[0].header.lastArchive.root;
73
+ const blockNumber = block.number;
74
+ const blockCheckpointNumber = block.checkpointNumber;
75
+ const blockIndex = block.indexWithinCheckpoint;
76
+ const blockLastArchive = block.header.lastArchive.root;
75
77
  // Extract the latest block and checkpoint numbers
76
78
  const previousBlockNumber = await this.getLatestBlockNumber();
77
79
  const previousCheckpointNumber = await this.getLatestCheckpointNumber();
78
80
  // Verify we're not overwriting checkpointed blocks
79
81
  const lastCheckpointedBlockNumber = await this.getCheckpointedL2BlockNumber();
80
- if (!opts.force && firstBlockNumber <= lastCheckpointedBlockNumber) {
81
- throw new CannotOverwriteCheckpointedBlockError(firstBlockNumber, lastCheckpointedBlockNumber);
82
+ if (!opts.force && blockNumber <= lastCheckpointedBlockNumber) {
83
+ // Check if the proposed block matches the already-checkpointed one
84
+ const existingBlock = await this.getBlock(BlockNumber(blockNumber));
85
+ if (existingBlock && existingBlock.archive.root.equals(block.archive.root)) {
86
+ throw new BlockAlreadyCheckpointedError(blockNumber);
87
+ }
88
+ throw new CannotOverwriteCheckpointedBlockError(blockNumber, lastCheckpointedBlockNumber);
82
89
  }
83
- // Check that the first block number is the expected one
84
- if (!opts.force && previousBlockNumber !== firstBlockNumber - 1) {
85
- throw new InitialBlockNumberNotSequentialError(firstBlockNumber, previousBlockNumber);
90
+ // Check that the block number is the expected one
91
+ if (!opts.force && previousBlockNumber !== blockNumber - 1) {
92
+ throw new BlockNumberNotSequentialError(blockNumber, previousBlockNumber);
86
93
  }
87
94
  // The same check as above but for checkpoints
88
- if (!opts.force && previousCheckpointNumber !== firstBlockCheckpointNumber - 1) {
89
- throw new InitialCheckpointNumberNotSequentialError(firstBlockCheckpointNumber, previousCheckpointNumber);
95
+ if (!opts.force && previousCheckpointNumber !== blockCheckpointNumber - 1) {
96
+ throw new CheckpointNumberNotSequentialError(blockCheckpointNumber, previousCheckpointNumber);
90
97
  }
91
98
  // Extract the previous block if there is one and see if it is for the same checkpoint or not
92
99
  const previousBlockResult = await this.getBlock(previousBlockNumber);
93
- let expectedFirstblockIndex = 0;
100
+ let expectedBlockIndex = 0;
94
101
  let previousBlockIndex = undefined;
95
102
  if (previousBlockResult !== undefined) {
96
- if (previousBlockResult.checkpointNumber === firstBlockCheckpointNumber) {
103
+ if (previousBlockResult.checkpointNumber === blockCheckpointNumber) {
97
104
  // The previous block is for the same checkpoint, therefore our index should follow it
98
105
  previousBlockIndex = previousBlockResult.indexWithinCheckpoint;
99
- expectedFirstblockIndex = previousBlockIndex + 1;
106
+ expectedBlockIndex = previousBlockIndex + 1;
100
107
  }
101
- if (!previousBlockResult.archive.root.equals(firstBlockLastArchive)) {
102
- throw new BlockArchiveNotConsistentError(firstBlockNumber, previousBlockResult.number, firstBlockLastArchive, previousBlockResult.archive.root);
108
+ if (!previousBlockResult.archive.root.equals(blockLastArchive)) {
109
+ throw new BlockArchiveNotConsistentError(blockNumber, previousBlockResult.number, blockLastArchive, previousBlockResult.archive.root);
103
110
  }
104
111
  }
105
- // Now check that the first block has the expected index value
106
- if (!opts.force && expectedFirstblockIndex !== firstBlockIndex) {
107
- throw new BlockIndexNotSequentialError(firstBlockIndex, previousBlockIndex);
108
- }
109
- // Iterate over blocks array and insert them, checking that the block numbers and indexes are sequential. Also check they are for the correct checkpoint.
110
- let previousBlock = undefined;
111
- for (const block of blocks){
112
- if (!opts.force && previousBlock) {
113
- if (previousBlock.number + 1 !== block.number) {
114
- throw new BlockNumberNotSequentialError(block.number, previousBlock.number);
115
- }
116
- if (previousBlock.indexWithinCheckpoint + 1 !== block.indexWithinCheckpoint) {
117
- throw new BlockIndexNotSequentialError(block.indexWithinCheckpoint, previousBlock.indexWithinCheckpoint);
118
- }
119
- if (!previousBlock.archive.root.equals(block.header.lastArchive.root)) {
120
- throw new BlockArchiveNotConsistentError(block.number, previousBlock.number, block.header.lastArchive.root, previousBlock.archive.root);
121
- }
122
- }
123
- if (!opts.force && firstBlockCheckpointNumber !== block.checkpointNumber) {
124
- throw new CheckpointNumberNotConsistentError(block.checkpointNumber, firstBlockCheckpointNumber);
125
- }
126
- previousBlock = block;
127
- await this.addBlockToDatabase(block, block.checkpointNumber, block.indexWithinCheckpoint);
112
+ // Now check that the block has the expected index value
113
+ if (!opts.force && expectedBlockIndex !== blockIndex) {
114
+ throw new BlockIndexNotSequentialError(blockIndex, previousBlockIndex);
128
115
  }
116
+ await this.addBlockToDatabase(block, block.checkpointNumber, block.indexWithinCheckpoint);
129
117
  return true;
130
118
  });
131
119
  }
@@ -653,17 +641,18 @@ export { TxReceipt } from '@aztec/stdlib/tx';
653
641
  * Gets a receipt of a settled tx.
654
642
  * @param txHash - The hash of a tx we try to get the receipt for.
655
643
  * @returns The requested tx receipt (or undefined if not found).
656
- */ async getSettledTxReceipt(txHash) {
644
+ */ async getSettledTxReceipt(txHash, l1Constants) {
657
645
  const txEffect = await this.getTxEffect(txHash);
658
646
  if (!txEffect) {
659
647
  return undefined;
660
648
  }
661
649
  const blockNumber = BlockNumber(txEffect.l2BlockNumber);
662
650
  // Use existing archiver methods to determine finalization level
663
- const [provenBlockNumber, checkpointedBlockNumber, finalizedBlockNumber] = await Promise.all([
651
+ const [provenBlockNumber, checkpointedBlockNumber, finalizedBlockNumber, blockData] = await Promise.all([
664
652
  this.getProvenBlockNumber(),
665
653
  this.getCheckpointedL2BlockNumber(),
666
- this.getFinalizedL2BlockNumber()
654
+ this.getFinalizedL2BlockNumber(),
655
+ this.getBlockData(blockNumber)
667
656
  ]);
668
657
  let status;
669
658
  if (blockNumber <= finalizedBlockNumber) {
@@ -675,7 +664,8 @@ export { TxReceipt } from '@aztec/stdlib/tx';
675
664
  } else {
676
665
  status = TxStatus.PROPOSED;
677
666
  }
678
- return new TxReceipt(txHash, status, TxReceipt.executionResultFromRevertCode(txEffect.data.revertCode), undefined, txEffect.data.transactionFee.toBigInt(), txEffect.l2BlockHash, blockNumber);
667
+ const epochNumber = blockData && l1Constants ? getEpochAtSlot(blockData.header.globalVariables.slotNumber, l1Constants) : undefined;
668
+ return new TxReceipt(txHash, status, TxReceipt.executionResultFromRevertCode(txEffect.data.revertCode), undefined, txEffect.data.transactionFee.toBigInt(), txEffect.l2BlockHash, blockNumber, epochNumber);
679
669
  }
680
670
  /**
681
671
  * Looks up which block included the requested tx effect.
@@ -737,6 +727,16 @@ export { TxReceipt } from '@aztec/stdlib/tx';
737
727
  const result = await this.#lastProvenCheckpoint.set(checkpointNumber);
738
728
  return result;
739
729
  }
730
+ async getFinalizedCheckpointNumber() {
731
+ const [latestCheckpointNumber, finalizedCheckpointNumber] = await Promise.all([
732
+ this.getLatestCheckpointNumber(),
733
+ this.#lastFinalizedCheckpoint.getAsync()
734
+ ]);
735
+ return (finalizedCheckpointNumber ?? 0) > latestCheckpointNumber ? latestCheckpointNumber : CheckpointNumber(finalizedCheckpointNumber ?? 0);
736
+ }
737
+ setFinalizedCheckpointNumber(checkpointNumber) {
738
+ return this.#lastFinalizedCheckpoint.set(checkpointNumber);
739
+ }
740
740
  #computeBlockRange(start, limit) {
741
741
  if (limit < 1) {
742
742
  throw new Error(`Invalid limit: ${limit}`);