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

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 (210) hide show
  1. package/README.md +156 -22
  2. package/dest/archiver.d.ts +136 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +781 -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 +41 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +62 -0
  11. package/dest/factory.d.ts +9 -7
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +92 -13
  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 +32 -0
  42. package/dest/l1/validate_trace.d.ts.map +1 -0
  43. package/dest/l1/validate_trace.js +154 -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 +73 -0
  48. package/dest/modules/data_store_updater.d.ts.map +1 -0
  49. package/dest/modules/data_store_updater.js +302 -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 +30 -60
  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 +1112 -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 +192 -0
  60. package/dest/store/block_store.d.ts.map +1 -0
  61. package/dest/store/block_store.js +721 -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 +340 -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 +4 -1
  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 +39 -20
  97. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  98. package/dest/test/mock_l2_block_source.js +181 -61
  99. package/dest/test/mock_structs.d.ts +80 -4
  100. package/dest/test/mock_structs.d.ts.map +1 -1
  101. package/dest/test/mock_structs.js +145 -11
  102. package/dest/test/noop_l1_archiver.d.ts +23 -0
  103. package/dest/test/noop_l1_archiver.d.ts.map +1 -0
  104. package/dest/test/noop_l1_archiver.js +68 -0
  105. package/package.json +20 -20
  106. package/src/archiver.ts +543 -0
  107. package/src/{archiver/config.ts → config.ts} +33 -12
  108. package/src/errors.ts +102 -0
  109. package/src/factory.ts +128 -13
  110. package/src/index.ts +10 -3
  111. package/src/interfaces.ts +9 -0
  112. package/src/l1/README.md +98 -0
  113. package/src/l1/bin/retrieve-calldata.ts +187 -0
  114. package/src/l1/calldata_retriever.ts +641 -0
  115. package/src/l1/data_retrieval.ts +495 -0
  116. package/src/l1/debug_tx.ts +99 -0
  117. package/src/l1/spire_proposer.ts +160 -0
  118. package/src/l1/trace_tx.ts +128 -0
  119. package/src/l1/types.ts +13 -0
  120. package/src/l1/validate_trace.ts +229 -0
  121. package/src/modules/data_source_base.ts +367 -0
  122. package/src/modules/data_store_updater.ts +423 -0
  123. package/src/{archiver → modules}/instrumentation.ts +32 -62
  124. package/src/modules/l1_synchronizer.ts +930 -0
  125. package/src/modules/validation.ts +129 -0
  126. package/src/store/block_store.ts +966 -0
  127. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +2 -2
  128. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +2 -2
  129. package/src/store/kv_archiver_store.ts +639 -0
  130. package/src/store/log_store.ts +575 -0
  131. package/src/{archiver/kv_archiver_store → store}/message_store.ts +21 -18
  132. package/src/{archiver/structs → structs}/inbox_message.ts +8 -8
  133. package/src/structs/published.ts +1 -0
  134. package/src/test/fake_l1_state.ts +599 -0
  135. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  136. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  137. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  138. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  139. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  140. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  141. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  142. package/src/test/index.ts +4 -0
  143. package/src/test/mock_archiver.ts +22 -16
  144. package/src/test/mock_l1_to_l2_message_source.ts +18 -11
  145. package/src/test/mock_l2_block_source.ts +203 -76
  146. package/src/test/mock_structs.ts +275 -13
  147. package/src/test/noop_l1_archiver.ts +109 -0
  148. package/dest/archiver/archiver.d.ts +0 -277
  149. package/dest/archiver/archiver.d.ts.map +0 -1
  150. package/dest/archiver/archiver.js +0 -1322
  151. package/dest/archiver/archiver_store.d.ts +0 -255
  152. package/dest/archiver/archiver_store.d.ts.map +0 -1
  153. package/dest/archiver/archiver_store.js +0 -4
  154. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  155. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  156. package/dest/archiver/archiver_store_test_suite.js +0 -1288
  157. package/dest/archiver/config.d.ts +0 -21
  158. package/dest/archiver/config.d.ts.map +0 -1
  159. package/dest/archiver/data_retrieval.d.ts +0 -79
  160. package/dest/archiver/data_retrieval.d.ts.map +0 -1
  161. package/dest/archiver/data_retrieval.js +0 -362
  162. package/dest/archiver/errors.d.ts +0 -12
  163. package/dest/archiver/errors.d.ts.map +0 -1
  164. package/dest/archiver/errors.js +0 -17
  165. package/dest/archiver/index.d.ts +0 -7
  166. package/dest/archiver/index.d.ts.map +0 -1
  167. package/dest/archiver/index.js +0 -4
  168. package/dest/archiver/instrumentation.d.ts +0 -35
  169. package/dest/archiver/instrumentation.d.ts.map +0 -1
  170. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -124
  171. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  172. package/dest/archiver/kv_archiver_store/block_store.js +0 -370
  173. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  174. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  175. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  176. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  177. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -168
  178. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  179. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -296
  180. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -49
  181. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  182. package/dest/archiver/kv_archiver_store/log_store.js +0 -336
  183. package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -39
  184. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  185. package/dest/archiver/structs/data_retrieval.d.ts +0 -27
  186. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  187. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  188. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  189. package/dest/archiver/structs/published.d.ts +0 -2
  190. package/dest/archiver/structs/published.d.ts.map +0 -1
  191. package/dest/archiver/validation.d.ts +0 -11
  192. package/dest/archiver/validation.d.ts.map +0 -1
  193. package/dest/rpc/index.d.ts +0 -9
  194. package/dest/rpc/index.d.ts.map +0 -1
  195. package/dest/rpc/index.js +0 -15
  196. package/src/archiver/archiver.ts +0 -1722
  197. package/src/archiver/archiver_store.ts +0 -305
  198. package/src/archiver/archiver_store_test_suite.ts +0 -1263
  199. package/src/archiver/data_retrieval.ts +0 -545
  200. package/src/archiver/errors.ts +0 -26
  201. package/src/archiver/index.ts +0 -6
  202. package/src/archiver/kv_archiver_store/block_store.ts +0 -481
  203. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -422
  204. package/src/archiver/kv_archiver_store/log_store.ts +0 -406
  205. package/src/archiver/structs/published.ts +0 -1
  206. package/src/archiver/validation.ts +0 -99
  207. package/src/rpc/index.ts +0 -16
  208. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  209. /package/dest/{archiver/structs → structs}/published.js +0 -0
  210. /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
+ }