@aztec/archiver 0.0.1-commit.b655e406 → 0.0.1-commit.d1f2d6c

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 (206) hide show
  1. package/README.md +156 -22
  2. package/dest/archiver.d.ts +135 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +769 -0
  5. package/dest/config.d.ts +30 -0
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/{archiver/config.js → config.js} +26 -5
  8. package/dest/errors.d.ts +36 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +54 -0
  11. package/dest/factory.d.ts +7 -7
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +90 -10
  14. package/dest/index.d.ts +10 -4
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +8 -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/l1/bin/retrieve-calldata.d.ts +3 -0
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/l1/bin/retrieve-calldata.js +149 -0
  23. package/dest/l1/calldata_retriever.d.ts +112 -0
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/l1/calldata_retriever.js +471 -0
  26. package/dest/l1/data_retrieval.d.ts +88 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/l1/data_retrieval.js +312 -0
  29. package/dest/l1/debug_tx.d.ts +19 -0
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/l1/debug_tx.js +73 -0
  32. package/dest/l1/spire_proposer.d.ts +70 -0
  33. package/dest/l1/spire_proposer.d.ts.map +1 -0
  34. package/dest/l1/spire_proposer.js +157 -0
  35. package/dest/l1/trace_tx.d.ts +97 -0
  36. package/dest/l1/trace_tx.d.ts.map +1 -0
  37. package/dest/l1/trace_tx.js +91 -0
  38. package/dest/l1/types.d.ts +12 -0
  39. package/dest/l1/types.d.ts.map +1 -0
  40. package/dest/l1/types.js +3 -0
  41. package/dest/l1/validate_trace.d.ts +29 -0
  42. package/dest/l1/validate_trace.d.ts.map +1 -0
  43. package/dest/l1/validate_trace.js +150 -0
  44. package/dest/modules/data_source_base.d.ts +84 -0
  45. package/dest/modules/data_source_base.d.ts.map +1 -0
  46. package/dest/modules/data_source_base.js +260 -0
  47. package/dest/modules/data_store_updater.d.ts +69 -0
  48. package/dest/modules/data_store_updater.d.ts.map +1 -0
  49. package/dest/modules/data_store_updater.js +304 -0
  50. package/dest/modules/instrumentation.d.ts +37 -0
  51. package/dest/modules/instrumentation.d.ts.map +1 -0
  52. package/dest/{archiver → modules}/instrumentation.js +22 -59
  53. package/dest/modules/l1_synchronizer.d.ts +75 -0
  54. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  55. package/dest/modules/l1_synchronizer.js +1113 -0
  56. package/dest/modules/validation.d.ts +17 -0
  57. package/dest/modules/validation.d.ts.map +1 -0
  58. package/dest/{archiver → modules}/validation.js +35 -21
  59. package/dest/store/block_store.d.ts +188 -0
  60. package/dest/store/block_store.d.ts.map +1 -0
  61. package/dest/store/block_store.js +709 -0
  62. package/dest/store/contract_class_store.d.ts +18 -0
  63. package/dest/store/contract_class_store.d.ts.map +1 -0
  64. package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +2 -2
  65. package/dest/store/contract_instance_store.d.ts +24 -0
  66. package/dest/store/contract_instance_store.d.ts.map +1 -0
  67. package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
  68. package/dest/store/kv_archiver_store.d.ts +339 -0
  69. package/dest/store/kv_archiver_store.d.ts.map +1 -0
  70. package/dest/store/kv_archiver_store.js +446 -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 +436 -0
  74. package/dest/store/message_store.d.ts +40 -0
  75. package/dest/store/message_store.d.ts.map +1 -0
  76. package/dest/{archiver/kv_archiver_store → store}/message_store.js +15 -14
  77. package/dest/structs/data_retrieval.d.ts +27 -0
  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/{archiver/structs → structs}/inbox_message.js +6 -5
  82. package/dest/structs/published.d.ts +2 -0
  83. package/dest/structs/published.d.ts.map +1 -0
  84. package/dest/test/fake_l1_state.d.ts +190 -0
  85. package/dest/test/fake_l1_state.d.ts.map +1 -0
  86. package/dest/test/fake_l1_state.js +383 -0
  87. package/dest/test/index.d.ts +2 -1
  88. package/dest/test/index.d.ts.map +1 -1
  89. package/dest/test/index.js +1 -0
  90. package/dest/test/mock_archiver.d.ts +16 -8
  91. package/dest/test/mock_archiver.d.ts.map +1 -1
  92. package/dest/test/mock_archiver.js +18 -14
  93. package/dest/test/mock_l1_to_l2_message_source.d.ts +7 -6
  94. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  95. package/dest/test/mock_l1_to_l2_message_source.js +21 -11
  96. package/dest/test/mock_l2_block_source.d.ts +36 -17
  97. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  98. package/dest/test/mock_l2_block_source.js +178 -58
  99. package/dest/test/mock_structs.d.ts +78 -3
  100. package/dest/test/mock_structs.d.ts.map +1 -1
  101. package/dest/test/mock_structs.js +141 -9
  102. package/package.json +19 -20
  103. package/src/archiver.ts +522 -0
  104. package/src/{archiver/config.ts → config.ts} +33 -12
  105. package/src/errors.ts +90 -0
  106. package/src/factory.ts +125 -10
  107. package/src/index.ts +10 -3
  108. package/src/interfaces.ts +9 -0
  109. package/src/l1/README.md +98 -0
  110. package/src/l1/bin/retrieve-calldata.ts +187 -0
  111. package/src/l1/calldata_retriever.ts +641 -0
  112. package/src/l1/data_retrieval.ts +495 -0
  113. package/src/l1/debug_tx.ts +99 -0
  114. package/src/l1/spire_proposer.ts +160 -0
  115. package/src/l1/trace_tx.ts +128 -0
  116. package/src/l1/types.ts +13 -0
  117. package/src/l1/validate_trace.ts +211 -0
  118. package/src/modules/data_source_base.ts +367 -0
  119. package/src/modules/data_store_updater.ts +419 -0
  120. package/src/{archiver → modules}/instrumentation.ts +24 -59
  121. package/src/modules/l1_synchronizer.ts +931 -0
  122. package/src/modules/validation.ts +129 -0
  123. package/src/store/block_store.ts +957 -0
  124. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +2 -2
  125. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +2 -2
  126. package/src/store/kv_archiver_store.ts +638 -0
  127. package/src/store/log_store.ts +575 -0
  128. package/src/{archiver/kv_archiver_store → store}/message_store.ts +21 -18
  129. package/src/{archiver/structs → structs}/inbox_message.ts +8 -8
  130. package/src/structs/published.ts +1 -0
  131. package/src/test/fake_l1_state.ts +599 -0
  132. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  133. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  134. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  135. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  136. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  137. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  138. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  139. package/src/test/index.ts +1 -0
  140. package/src/test/mock_archiver.ts +22 -16
  141. package/src/test/mock_l1_to_l2_message_source.ts +18 -11
  142. package/src/test/mock_l2_block_source.ts +197 -70
  143. package/src/test/mock_structs.ts +256 -10
  144. package/dest/archiver/archiver.d.ts +0 -277
  145. package/dest/archiver/archiver.d.ts.map +0 -1
  146. package/dest/archiver/archiver.js +0 -1322
  147. package/dest/archiver/archiver_store.d.ts +0 -255
  148. package/dest/archiver/archiver_store.d.ts.map +0 -1
  149. package/dest/archiver/archiver_store.js +0 -4
  150. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  151. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  152. package/dest/archiver/archiver_store_test_suite.js +0 -1288
  153. package/dest/archiver/config.d.ts +0 -21
  154. package/dest/archiver/config.d.ts.map +0 -1
  155. package/dest/archiver/data_retrieval.d.ts +0 -79
  156. package/dest/archiver/data_retrieval.d.ts.map +0 -1
  157. package/dest/archiver/data_retrieval.js +0 -362
  158. package/dest/archiver/errors.d.ts +0 -12
  159. package/dest/archiver/errors.d.ts.map +0 -1
  160. package/dest/archiver/errors.js +0 -17
  161. package/dest/archiver/index.d.ts +0 -7
  162. package/dest/archiver/index.d.ts.map +0 -1
  163. package/dest/archiver/index.js +0 -4
  164. package/dest/archiver/instrumentation.d.ts +0 -35
  165. package/dest/archiver/instrumentation.d.ts.map +0 -1
  166. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -124
  167. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  168. package/dest/archiver/kv_archiver_store/block_store.js +0 -370
  169. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  170. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  171. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  172. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  173. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -168
  174. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  175. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -296
  176. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -49
  177. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  178. package/dest/archiver/kv_archiver_store/log_store.js +0 -336
  179. package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -39
  180. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  181. package/dest/archiver/structs/data_retrieval.d.ts +0 -27
  182. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  183. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  184. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  185. package/dest/archiver/structs/published.d.ts +0 -2
  186. package/dest/archiver/structs/published.d.ts.map +0 -1
  187. package/dest/archiver/validation.d.ts +0 -11
  188. package/dest/archiver/validation.d.ts.map +0 -1
  189. package/dest/rpc/index.d.ts +0 -9
  190. package/dest/rpc/index.d.ts.map +0 -1
  191. package/dest/rpc/index.js +0 -15
  192. package/src/archiver/archiver.ts +0 -1722
  193. package/src/archiver/archiver_store.ts +0 -305
  194. package/src/archiver/archiver_store_test_suite.ts +0 -1263
  195. package/src/archiver/data_retrieval.ts +0 -545
  196. package/src/archiver/errors.ts +0 -26
  197. package/src/archiver/index.ts +0 -6
  198. package/src/archiver/kv_archiver_store/block_store.ts +0 -481
  199. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -422
  200. package/src/archiver/kv_archiver_store/log_store.ts +0 -406
  201. package/src/archiver/structs/published.ts +0 -1
  202. package/src/archiver/validation.ts +0 -99
  203. package/src/rpc/index.ts +0 -16
  204. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  205. /package/dest/{archiver/structs → structs}/published.js +0 -0
  206. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
@@ -0,0 +1,129 @@
1
+ import type { EpochCache } from '@aztec/epoch-cache';
2
+ import { EpochNumber } from '@aztec/foundation/branded-types';
3
+ import { compactArray } from '@aztec/foundation/collection';
4
+ import type { Logger } from '@aztec/foundation/log';
5
+ import {
6
+ type AttestationInfo,
7
+ type ValidateCheckpointNegativeResult,
8
+ type ValidateCheckpointResult,
9
+ getAttestationInfoFromPayload,
10
+ } from '@aztec/stdlib/block';
11
+ import type { PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
12
+ import { type L1RollupConstants, getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
13
+ import { ConsensusPayload } from '@aztec/stdlib/p2p';
14
+
15
+ export type { ValidateCheckpointResult };
16
+
17
+ /**
18
+ * Extracts attestation information from a published checkpoint.
19
+ * Returns info for each attestation, preserving array indices.
20
+ */
21
+ export function getAttestationInfoFromPublishedCheckpoint({
22
+ checkpoint,
23
+ attestations,
24
+ }: PublishedCheckpoint): AttestationInfo[] {
25
+ const payload = ConsensusPayload.fromCheckpoint(checkpoint);
26
+ return getAttestationInfoFromPayload(payload, attestations);
27
+ }
28
+
29
+ /**
30
+ * Validates the attestations submitted for the given checkpoint.
31
+ * Returns true if the attestations are valid and sufficient, false otherwise.
32
+ */
33
+ export async function validateCheckpointAttestations(
34
+ publishedCheckpoint: PublishedCheckpoint,
35
+ epochCache: EpochCache,
36
+ constants: Pick<L1RollupConstants, 'epochDuration'>,
37
+ logger?: Logger,
38
+ ): Promise<ValidateCheckpointResult> {
39
+ const attestorInfos = getAttestationInfoFromPublishedCheckpoint(publishedCheckpoint);
40
+ const attestors = compactArray(attestorInfos.map(info => ('address' in info ? info.address : undefined)));
41
+ const { checkpoint, attestations } = publishedCheckpoint;
42
+ const headerHash = checkpoint.header.hash();
43
+ const archiveRoot = checkpoint.archive.root.toString();
44
+ const slot = checkpoint.header.slotNumber;
45
+ const epoch: EpochNumber = getEpochAtSlot(slot, constants);
46
+ const { committee, seed } = await epochCache.getCommitteeForEpoch(epoch);
47
+ const logData = { checkpointNumber: checkpoint.number, slot, epoch, headerHash, archiveRoot };
48
+
49
+ logger?.debug(`Validating attestations for checkpoint ${checkpoint.number} at slot ${slot} in epoch ${epoch}`, {
50
+ committee: (committee ?? []).map(member => member.toString()),
51
+ recoveredAttestors: attestorInfos,
52
+ postedAttestations: attestations.map(a => (a.address.isZero() ? a.signature : a.address).toString()),
53
+ ...logData,
54
+ });
55
+
56
+ if (!committee || committee.length === 0) {
57
+ logger?.warn(
58
+ `No committee found for epoch ${epoch} at slot ${slot}. Accepting checkpoint without validation.`,
59
+ logData,
60
+ );
61
+ return { valid: true };
62
+ }
63
+
64
+ if (await epochCache.isEscapeHatchOpen(epoch)) {
65
+ logger?.warn(`Escape hatch open for epoch ${epoch} at slot ${slot}, skipping checkpoint validation`);
66
+ return { valid: true };
67
+ }
68
+
69
+ const requiredAttestationCount = Math.floor((committee.length * 2) / 3) + 1;
70
+
71
+ const failedValidationResult = <TReason extends ValidateCheckpointNegativeResult['reason']>(reason: TReason) => ({
72
+ valid: false as const,
73
+ reason,
74
+ checkpoint: checkpoint.toCheckpointInfo(),
75
+ committee,
76
+ seed,
77
+ epoch,
78
+ attestors,
79
+ attestations,
80
+ });
81
+
82
+ for (let i = 0; i < attestorInfos.length; i++) {
83
+ const info = attestorInfos[i];
84
+
85
+ // Fail on invalid signatures (no address recovered)
86
+ if (info.status === 'invalid-signature' || info.status === 'empty') {
87
+ logger?.warn(`Attestation with empty or invalid signature at slot ${slot}`, {
88
+ committee,
89
+ invalidIndex: i,
90
+ ...logData,
91
+ });
92
+ return { ...failedValidationResult('invalid-attestation'), invalidIndex: i };
93
+ }
94
+
95
+ // Check if the attestor at this index matches the committee member at the same index
96
+ if (info.status === 'recovered-from-signature' || info.status === 'provided-as-address') {
97
+ const signer = info.address.toString();
98
+ const expectedCommitteeMember = committee[i]?.toString();
99
+
100
+ if (!expectedCommitteeMember || signer !== expectedCommitteeMember) {
101
+ logger?.warn(
102
+ `Attestation at index ${i} from ${signer} does not match expected committee member ${expectedCommitteeMember} at slot ${slot}`,
103
+ {
104
+ committee,
105
+ invalidIndex: i,
106
+ ...logData,
107
+ },
108
+ );
109
+ return { ...failedValidationResult('invalid-attestation'), invalidIndex: i };
110
+ }
111
+ }
112
+ }
113
+
114
+ const validAttestationCount = attestorInfos.filter(info => info.status === 'recovered-from-signature').length;
115
+ if (validAttestationCount < requiredAttestationCount) {
116
+ logger?.warn(`Insufficient attestations for checkpoint at slot ${slot}`, {
117
+ requiredAttestations: requiredAttestationCount,
118
+ actualAttestations: validAttestationCount,
119
+ ...logData,
120
+ });
121
+ return failedValidationResult('insufficient-attestations');
122
+ }
123
+
124
+ logger?.debug(
125
+ `Checkpoint attestations validated successfully for checkpoint ${checkpoint.number} at slot ${slot}`,
126
+ logData,
127
+ );
128
+ return { valid: true };
129
+ }