@brightchain/brightchain-lib 0.29.8 → 0.29.17

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 (112) hide show
  1. package/package.json +1 -1
  2. package/src/browser.d.ts +10 -0
  3. package/src/browser.d.ts.map +1 -1
  4. package/src/browser.js +11 -1
  5. package/src/browser.js.map +1 -1
  6. package/src/lib/errors/index.d.ts +12 -0
  7. package/src/lib/errors/index.d.ts.map +1 -1
  8. package/src/lib/errors/index.js +15 -0
  9. package/src/lib/errors/index.js.map +1 -1
  10. package/src/lib/errors/ledgerError.d.ts +22 -0
  11. package/src/lib/errors/ledgerError.d.ts.map +1 -0
  12. package/src/lib/errors/ledgerError.js +31 -0
  13. package/src/lib/errors/ledgerError.js.map +1 -0
  14. package/src/lib/errors/ledgerSerializationError.d.ts +24 -0
  15. package/src/lib/errors/ledgerSerializationError.d.ts.map +1 -0
  16. package/src/lib/errors/ledgerSerializationError.js +33 -0
  17. package/src/lib/errors/ledgerSerializationError.js.map +1 -0
  18. package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
  19. package/src/lib/i18n/strings/mandarin.js.map +1 -1
  20. package/src/lib/interfaces/index.d.ts +2 -1
  21. package/src/lib/interfaces/index.d.ts.map +1 -1
  22. package/src/lib/interfaces/index.js.map +1 -1
  23. package/src/lib/interfaces/ledger/index.d.ts +6 -0
  24. package/src/lib/interfaces/ledger/index.d.ts.map +1 -0
  25. package/src/lib/interfaces/ledger/index.js +3 -0
  26. package/src/lib/interfaces/ledger/index.js.map +1 -0
  27. package/src/lib/interfaces/ledger/ledgerEntry.d.ts +39 -0
  28. package/src/lib/interfaces/ledger/ledgerEntry.d.ts.map +1 -0
  29. package/src/lib/interfaces/ledger/ledgerEntry.js +13 -0
  30. package/src/lib/interfaces/ledger/ledgerEntry.js.map +1 -0
  31. package/src/lib/interfaces/ledger/ledgerMetadata.d.ts +20 -0
  32. package/src/lib/interfaces/ledger/ledgerMetadata.d.ts.map +1 -0
  33. package/src/lib/interfaces/ledger/ledgerMetadata.js +12 -0
  34. package/src/lib/interfaces/ledger/ledgerMetadata.js.map +1 -0
  35. package/src/lib/interfaces/ledger/ledgerSignatureVerifier.d.ts +17 -0
  36. package/src/lib/interfaces/ledger/ledgerSignatureVerifier.d.ts.map +1 -0
  37. package/src/lib/interfaces/ledger/ledgerSignatureVerifier.js +11 -0
  38. package/src/lib/interfaces/ledger/ledgerSignatureVerifier.js.map +1 -0
  39. package/src/lib/interfaces/ledger/ledgerSigner.d.ts +23 -0
  40. package/src/lib/interfaces/ledger/ledgerSigner.d.ts.map +1 -0
  41. package/src/lib/interfaces/ledger/ledgerSigner.js +12 -0
  42. package/src/lib/interfaces/ledger/ledgerSigner.js.map +1 -0
  43. package/src/lib/interfaces/ledger/validationResult.d.ts +30 -0
  44. package/src/lib/interfaces/ledger/validationResult.d.ts.map +1 -0
  45. package/src/lib/interfaces/ledger/validationResult.js +12 -0
  46. package/src/lib/interfaces/ledger/validationResult.js.map +1 -0
  47. package/src/lib/interfaces/member/memberData.d.ts +4 -0
  48. package/src/lib/interfaces/member/memberData.d.ts.map +1 -1
  49. package/src/lib/interfaces/messaging/emailGateway.d.ts.map +1 -1
  50. package/src/lib/interfaces/messaging/index.d.ts +1 -0
  51. package/src/lib/interfaces/messaging/index.d.ts.map +1 -1
  52. package/src/lib/interfaces/messaging/index.js +1 -0
  53. package/src/lib/interfaces/messaging/index.js.map +1 -1
  54. package/src/lib/interfaces/messaging/recipientVerification.d.ts +25 -0
  55. package/src/lib/interfaces/messaging/recipientVerification.d.ts.map +1 -0
  56. package/src/lib/interfaces/messaging/recipientVerification.js +18 -0
  57. package/src/lib/interfaces/messaging/recipientVerification.js.map +1 -0
  58. package/src/lib/interfaces/network/banConfig.d.ts.map +1 -1
  59. package/src/lib/interfaces/network/banConfig.js.map +1 -1
  60. package/src/lib/interfaces/network/index.d.ts +1 -1
  61. package/src/lib/interfaces/network/index.d.ts.map +1 -1
  62. package/src/lib/interfaces/network/index.js.map +1 -1
  63. package/src/lib/interfaces/services/quorumDatabase.d.ts +1 -1
  64. package/src/lib/interfaces/services/quorumDatabase.d.ts.map +1 -1
  65. package/src/lib/ledger/eciesSignatureVerifier.d.ts +17 -0
  66. package/src/lib/ledger/eciesSignatureVerifier.d.ts.map +1 -0
  67. package/src/lib/ledger/eciesSignatureVerifier.js +23 -0
  68. package/src/lib/ledger/eciesSignatureVerifier.js.map +1 -0
  69. package/src/lib/ledger/ledger.d.ts +109 -0
  70. package/src/lib/ledger/ledger.d.ts.map +1 -0
  71. package/src/lib/ledger/ledger.js +383 -0
  72. package/src/lib/ledger/ledger.js.map +1 -0
  73. package/src/lib/ledger/ledgerChainValidator.d.ts +54 -0
  74. package/src/lib/ledger/ledgerChainValidator.d.ts.map +1 -0
  75. package/src/lib/ledger/ledgerChainValidator.js +187 -0
  76. package/src/lib/ledger/ledgerChainValidator.js.map +1 -0
  77. package/src/lib/ledger/ledgerEntrySerializer.d.ts +66 -0
  78. package/src/lib/ledger/ledgerEntrySerializer.d.ts.map +1 -0
  79. package/src/lib/ledger/ledgerEntrySerializer.js +235 -0
  80. package/src/lib/ledger/ledgerEntrySerializer.js.map +1 -0
  81. package/src/lib/ledger/memberSignerAdapter.d.ts +19 -0
  82. package/src/lib/ledger/memberSignerAdapter.d.ts.map +1 -0
  83. package/src/lib/ledger/memberSignerAdapter.js +25 -0
  84. package/src/lib/ledger/memberSignerAdapter.js.map +1 -0
  85. package/src/lib/services/banListCache.d.ts.map +1 -1
  86. package/src/lib/services/banListCache.js.map +1 -1
  87. package/src/lib/services/banProposalValidator.d.ts.map +1 -1
  88. package/src/lib/services/banProposalValidator.js.map +1 -1
  89. package/src/lib/services/memberStore.d.ts.map +1 -1
  90. package/src/lib/services/memberStore.js +1 -1
  91. package/src/lib/services/memberStore.js.map +1 -1
  92. package/src/lib/services/messaging/emailMessageService.d.ts.map +1 -1
  93. package/src/lib/services/messaging/emailMessageService.js +1 -4
  94. package/src/lib/services/messaging/emailMessageService.js.map +1 -1
  95. package/src/lib/services/quorumStateMachine.d.ts +2 -2
  96. package/src/lib/services/quorumStateMachine.d.ts.map +1 -1
  97. package/src/lib/services/quorumStateMachine.js +3 -3
  98. package/src/lib/services/quorumStateMachine.js.map +1 -1
  99. package/src/lib/services/vcblService.d.ts.map +1 -1
  100. package/src/lib/services/vcblService.js.map +1 -1
  101. package/src/lib/stores/pooledMemoryBlockStore.d.ts +1 -1
  102. package/src/lib/stores/pooledMemoryBlockStore.d.ts.map +1 -1
  103. package/src/lib/stores/pooledMemoryBlockStore.js +1 -1
  104. package/src/lib/stores/pooledMemoryBlockStore.js.map +1 -1
  105. package/src/lib/utils/attachmentValidation.d.ts +65 -0
  106. package/src/lib/utils/attachmentValidation.d.ts.map +1 -0
  107. package/src/lib/utils/attachmentValidation.js +96 -0
  108. package/src/lib/utils/attachmentValidation.js.map +1 -0
  109. package/src/lib/utils/index.d.ts +14 -0
  110. package/src/lib/utils/index.d.ts.map +1 -1
  111. package/src/lib/utils/index.js +17 -0
  112. package/src/lib/utils/index.js.map +1 -1
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Ledger — append-only blockchain ledger persisted as
4
+ * RawDataBlock instances within any IBlockStore implementation.
5
+ *
6
+ * Each entry is serialized, padded to BlockSize, and stored as a RawDataBlock.
7
+ * A metadata block tracks the chain head, length, ledger ID, and the full
8
+ * sequenceNumber → blockChecksum index for cold-start reconstruction.
9
+ *
10
+ * The metadata block is stored at a deterministic Checksum derived from the
11
+ * ledgerId so that `Ledger.load()` can locate it without external state.
12
+ * Because the metadata content changes on each append while the storage key
13
+ * stays fixed, the metadata block uses a validation-exempt RawDataBlock
14
+ * subclass that allows a caller-specified checksum to differ from the
15
+ * content hash.
16
+ *
17
+ * @see Design: Block Chain Ledger — Ledger
18
+ * @see Requirements 5.1–5.6, 6.1–6.6, 7.1–7.5, 10.1–10.4, 11.2–11.4
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.Ledger = void 0;
22
+ const rawData_1 = require("../blocks/rawData");
23
+ const blockDataType_1 = require("../enumerations/blockDataType");
24
+ const blockType_1 = require("../enumerations/blockType");
25
+ const ledgerError_1 = require("../errors/ledgerError");
26
+ const checksum_service_1 = require("../services/checksum.service");
27
+ const checksum_1 = require("../types/checksum");
28
+ const xorUtils_1 = require("../utils/xorUtils");
29
+ /** Magic bytes identifying a ledger metadata block: "LMET" in ASCII. */
30
+ const METADATA_MAGIC = 0x4c4d4554;
31
+ /** Current metadata format version. */
32
+ const METADATA_VERSION = 0x0001;
33
+ /** SHA3-512 hash length in bytes. */
34
+ const HASH_LENGTH = 64;
35
+ /**
36
+ * A RawDataBlock subclass that skips checksum validation.
37
+ *
38
+ * Used exclusively for the ledger metadata block, which is stored at a
39
+ * deterministic checksum (derived from the ledgerId) that intentionally
40
+ * differs from the SHA3-512 of its content. The MemoryBlockStore calls
41
+ * `block.validate()` during `setData()`; this subclass makes that a no-op
42
+ * so the block can be stored under the deterministic key.
43
+ *
44
+ * @internal
45
+ */
46
+ class LedgerMetadataBlock extends rawData_1.RawDataBlock {
47
+ constructor(blockSize, data, checksum) {
48
+ super(blockSize, data, undefined, checksum, blockType_1.BlockType.RawData, blockDataType_1.BlockDataType.RawData, true, true);
49
+ }
50
+ validateSync() {
51
+ // No-op: metadata block uses a deterministic key, not a content hash.
52
+ }
53
+ async validateAsync() {
54
+ // No-op
55
+ }
56
+ validate() {
57
+ // No-op
58
+ }
59
+ }
60
+ /**
61
+ * Append-only blockchain ledger backed by an IBlockStore.
62
+ *
63
+ * Maintains an in-memory index (sequenceNumber → block Checksum) for O(1)
64
+ * lookups and persists a metadata block after each append for cold-start
65
+ * reconstruction via `Ledger.load()`.
66
+ */
67
+ class Ledger {
68
+ store;
69
+ blockSize;
70
+ serializer;
71
+ ledgerId;
72
+ index = new Map();
73
+ checksumService = new checksum_service_1.ChecksumService();
74
+ _length = 0;
75
+ _head = null;
76
+ _headEntryHash = null;
77
+ constructor(store, blockSize, serializer, ledgerId) {
78
+ this.store = store;
79
+ this.blockSize = blockSize;
80
+ this.serializer = serializer;
81
+ this.ledgerId = ledgerId;
82
+ }
83
+ // ── Public getters ────────────────────────────────────────────────
84
+ /** Current chain length. */
85
+ get length() {
86
+ return this._length;
87
+ }
88
+ /** Head block Checksum (block storage key), or null if empty. */
89
+ get head() {
90
+ return this._head;
91
+ }
92
+ // ── Append ────────────────────────────────────────────────────────
93
+ /**
94
+ * Append a new entry to the ledger.
95
+ * Returns the Checksum of the stored block.
96
+ */
97
+ async append(payload, signer) {
98
+ const sequenceNumber = this._length;
99
+ const previousEntryHash = this._headEntryHash;
100
+ const timestamp = new Date();
101
+ // 1. Compute entryHash
102
+ const partial = {
103
+ sequenceNumber,
104
+ timestamp,
105
+ previousEntryHash,
106
+ signerPublicKey: signer.publicKey,
107
+ payload,
108
+ };
109
+ const entryHash = this.serializer.computeEntryHash(partial);
110
+ // 2. Sign the entryHash
111
+ const signature = signer.sign(entryHash.toUint8Array());
112
+ // 3. Build full entry
113
+ const entry = { ...partial, entryHash, signature };
114
+ // 4. Serialize and pad
115
+ const serialized = this.serializer.serialize(entry);
116
+ const padded = (0, xorUtils_1.padToBlockSize)(serialized, this.blockSize);
117
+ // 5. Create RawDataBlock and store
118
+ const block = new rawData_1.RawDataBlock(this.blockSize, padded, undefined, undefined, undefined, undefined, true, true, this.checksumService);
119
+ const blockChecksum = block.idChecksum;
120
+ // Req 5.5: On BlockStore failure, do not update chain head or index.
121
+ // If setData throws, we propagate the error before updating state.
122
+ await this.store.setData(block);
123
+ // 6. Update in-memory state (only after successful store)
124
+ this.index.set(sequenceNumber, blockChecksum);
125
+ this._length = sequenceNumber + 1;
126
+ this._head = blockChecksum;
127
+ this._headEntryHash = entryHash;
128
+ // 7. Persist metadata block
129
+ try {
130
+ await this.persistMetadata();
131
+ }
132
+ catch {
133
+ // Metadata persistence failure is non-fatal for the append itself;
134
+ // the entry is already stored.
135
+ }
136
+ return blockChecksum;
137
+ }
138
+ // ── Read operations ───────────────────────────────────────────────
139
+ /**
140
+ * Get entry by sequence number.
141
+ * @throws LedgerError if not found
142
+ */
143
+ async getEntry(sequenceNumber) {
144
+ const blockChecksum = this.index.get(sequenceNumber);
145
+ if (blockChecksum === undefined) {
146
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.EntryNotFound, `Entry with sequenceNumber ${sequenceNumber} not found`);
147
+ }
148
+ const block = await this.store.getData(blockChecksum);
149
+ const unpadded = (0, xorUtils_1.unpadCblData)(block.data);
150
+ return this.serializer.deserialize(unpadded);
151
+ }
152
+ /**
153
+ * Get entries in range [start, end] inclusive.
154
+ * @throws LedgerError for invalid range
155
+ */
156
+ async getEntries(start, end) {
157
+ if (start > end) {
158
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.InvalidRange, `Invalid range: start (${start}) > end (${end})`);
159
+ }
160
+ if (start < 0 || end >= this._length) {
161
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.InvalidRange, `Range [${start}, ${end}] out of bounds for ledger of length ${this._length}`);
162
+ }
163
+ const entries = [];
164
+ for (let i = start; i <= end; i++) {
165
+ entries.push(await this.getEntry(i));
166
+ }
167
+ return entries;
168
+ }
169
+ /**
170
+ * Get the most recent entry, or null if empty.
171
+ */
172
+ async getLatestEntry() {
173
+ if (this._length === 0) {
174
+ return null;
175
+ }
176
+ return this.getEntry(this._length - 1);
177
+ }
178
+ // ── Metadata persistence ──────────────────────────────────────────
179
+ /**
180
+ * Compute the deterministic storage key for this ledger's metadata block.
181
+ * The key is SHA3-512("ledger-meta:" + ledgerId).
182
+ */
183
+ computeMetadataKey() {
184
+ return this.checksumService.calculateChecksumForString(`ledger-meta:${this.ledgerId}`);
185
+ }
186
+ /**
187
+ * Serialize the current metadata into binary.
188
+ *
189
+ * Format:
190
+ * magic 4 bytes 0x4C4D4554 ("LMET")
191
+ * version 2 bytes 0x0001
192
+ * ledgerIdLength 4 bytes uint32 BE
193
+ * ledgerId var UTF-8
194
+ * length 4 bytes uint32 BE
195
+ * hasHead 1 byte 0x00 or 0x01
196
+ * headChecksum 0|64 SHA3-512 bytes (block checksum of head)
197
+ * index entries var seqNum (uint32 BE) + blockChecksum (64 bytes)
198
+ */
199
+ serializeMetadata() {
200
+ const encoder = new TextEncoder();
201
+ const ledgerIdBytes = encoder.encode(this.ledgerId);
202
+ const headBytes = this._head ? this._head.toUint8Array() : null;
203
+ const indexEntrySize = 4 + HASH_LENGTH;
204
+ const indexSize = this._length * indexEntrySize;
205
+ const size = 4 +
206
+ 2 +
207
+ 4 +
208
+ ledgerIdBytes.length +
209
+ 4 +
210
+ 1 +
211
+ (headBytes ? HASH_LENGTH : 0) +
212
+ indexSize;
213
+ const buf = new Uint8Array(size);
214
+ const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
215
+ let offset = 0;
216
+ view.setUint32(offset, METADATA_MAGIC, false);
217
+ offset += 4;
218
+ view.setUint16(offset, METADATA_VERSION, false);
219
+ offset += 2;
220
+ view.setUint32(offset, ledgerIdBytes.length, false);
221
+ offset += 4;
222
+ buf.set(ledgerIdBytes, offset);
223
+ offset += ledgerIdBytes.length;
224
+ view.setUint32(offset, this._length, false);
225
+ offset += 4;
226
+ if (headBytes) {
227
+ buf[offset] = 0x01;
228
+ offset += 1;
229
+ buf.set(headBytes, offset);
230
+ offset += HASH_LENGTH;
231
+ }
232
+ else {
233
+ buf[offset] = 0x00;
234
+ offset += 1;
235
+ }
236
+ for (let i = 0; i < this._length; i++) {
237
+ const checksum = this.index.get(i);
238
+ if (checksum) {
239
+ view.setUint32(offset, i, false);
240
+ offset += 4;
241
+ buf.set(checksum.toUint8Array(), offset);
242
+ offset += HASH_LENGTH;
243
+ }
244
+ }
245
+ return buf;
246
+ }
247
+ /**
248
+ * Persist the metadata block to the store under a deterministic key.
249
+ *
250
+ * Uses a LedgerMetadataBlock (validation-exempt RawDataBlock subclass)
251
+ * so the block can be stored at the deterministic checksum derived from
252
+ * the ledgerId, even though the content hash differs.
253
+ */
254
+ async persistMetadata() {
255
+ const metadataBytes = this.serializeMetadata();
256
+ const padded = (0, xorUtils_1.padToBlockSize)(metadataBytes, this.blockSize);
257
+ const metadataKey = this.computeMetadataKey();
258
+ // Delete old metadata block first (same key, different content)
259
+ try {
260
+ await this.store.deleteData(metadataKey);
261
+ }
262
+ catch {
263
+ // May not exist yet — that's fine
264
+ }
265
+ const block = new LedgerMetadataBlock(this.blockSize, padded, metadataKey);
266
+ await this.store.setData(block);
267
+ }
268
+ // ── Static load ───────────────────────────────────────────────────
269
+ /**
270
+ * Load ledger state from the block store.
271
+ *
272
+ * 1. Compute metadata block key from ledgerId
273
+ * 2. Try to retrieve metadata block from store
274
+ * 3. If not found, return empty ledger
275
+ * 4. Parse metadata to get head checksum, length, and index
276
+ * 5. Restore headEntryHash by reading the head entry
277
+ * 6. Return populated ledger
278
+ */
279
+ static async load(store, blockSize, serializer, ledgerId) {
280
+ const ledger = new Ledger(store, blockSize, serializer, ledgerId);
281
+ const metadataKey = ledger.computeMetadataKey();
282
+ const hasMetadata = await store.has(metadataKey);
283
+ if (!hasMetadata) {
284
+ return ledger; // Empty ledger (Req 7.5)
285
+ }
286
+ let metadataBlock;
287
+ try {
288
+ metadataBlock = await store.getData(metadataKey);
289
+ }
290
+ catch {
291
+ return ledger; // Treat as empty if unreadable
292
+ }
293
+ const metadataBytes = (0, xorUtils_1.unpadCblData)(metadataBlock.data);
294
+ const parsed = Ledger.parseMetadata(metadataBytes);
295
+ if (parsed.length === 0 || parsed.headChecksum === null) {
296
+ return ledger;
297
+ }
298
+ // Populate ledger state
299
+ ledger._length = parsed.length;
300
+ ledger._head = parsed.headChecksum;
301
+ for (const [seqNum, blockChecksum] of parsed.index) {
302
+ ledger.index.set(seqNum, blockChecksum);
303
+ }
304
+ // Restore headEntryHash by reading the head entry
305
+ try {
306
+ const headBlock = await store.getData(parsed.headChecksum);
307
+ const unpadded = (0, xorUtils_1.unpadCblData)(headBlock.data);
308
+ const headEntry = serializer.deserialize(unpadded);
309
+ ledger._headEntryHash = headEntry.entryHash;
310
+ }
311
+ catch {
312
+ // Degraded state — reads still work via index
313
+ }
314
+ return ledger;
315
+ }
316
+ /**
317
+ * Parse a metadata block's binary content.
318
+ */
319
+ static parseMetadata(data) {
320
+ if (data.length < 11) {
321
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, 'Metadata block too short');
322
+ }
323
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
324
+ let offset = 0;
325
+ // magic
326
+ const magic = view.getUint32(offset, false);
327
+ offset += 4;
328
+ if (magic !== METADATA_MAGIC) {
329
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, `Invalid metadata magic: expected 0x${METADATA_MAGIC.toString(16)}, got 0x${magic.toString(16)}`);
330
+ }
331
+ // version
332
+ const version = view.getUint16(offset, false);
333
+ offset += 2;
334
+ if (version !== METADATA_VERSION) {
335
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, `Unsupported metadata version: ${version}`);
336
+ }
337
+ // ledgerIdLength + ledgerId
338
+ if (offset + 4 > data.length) {
339
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, 'Metadata ledgerIdLength overflows');
340
+ }
341
+ const ledgerIdLength = view.getUint32(offset, false);
342
+ offset += 4;
343
+ if (offset + ledgerIdLength > data.length) {
344
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, 'Metadata ledgerId overflows');
345
+ }
346
+ const decoder = new TextDecoder();
347
+ const ledgerId = decoder.decode(data.slice(offset, offset + ledgerIdLength));
348
+ offset += ledgerIdLength;
349
+ // length
350
+ if (offset + 4 > data.length) {
351
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, 'Metadata length field overflows');
352
+ }
353
+ const length = view.getUint32(offset, false);
354
+ offset += 4;
355
+ // hasHead
356
+ if (offset + 1 > data.length) {
357
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, 'Metadata hasHead field overflows');
358
+ }
359
+ const hasHead = data[offset];
360
+ offset += 1;
361
+ let headChecksum = null;
362
+ if (hasHead === 0x01) {
363
+ if (offset + HASH_LENGTH > data.length) {
364
+ throw new ledgerError_1.LedgerError(ledgerError_1.LedgerErrorType.MetadataCorrupted, 'Metadata headChecksum overflows');
365
+ }
366
+ headChecksum = checksum_1.Checksum.fromUint8Array(data.slice(offset, offset + HASH_LENGTH));
367
+ offset += HASH_LENGTH;
368
+ }
369
+ // Parse index entries: each is seqNum (4) + checksum (64) = 68 bytes
370
+ const index = new Map();
371
+ const indexEntrySize = 4 + HASH_LENGTH;
372
+ while (offset + indexEntrySize <= data.length) {
373
+ const seqNum = view.getUint32(offset, false);
374
+ offset += 4;
375
+ const blockChecksum = checksum_1.Checksum.fromUint8Array(data.slice(offset, offset + HASH_LENGTH));
376
+ offset += HASH_LENGTH;
377
+ index.set(seqNum, blockChecksum);
378
+ }
379
+ return { ledgerId, length, headChecksum, index };
380
+ }
381
+ }
382
+ exports.Ledger = Ledger;
383
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/ledger/ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @fileoverview LedgerChainValidator — validates chain integrity by walking
3
+ * entries and checking hashes, signatures, and sequence links.
4
+ *
5
+ * Validation does not throw — it returns an IValidationResult with error
6
+ * descriptors. All errors are collected (validation does not stop at the
7
+ * first error).
8
+ *
9
+ * @see Design: Block Chain Ledger — LedgerChainValidator
10
+ * @see Requirements 3.2, 3.3, 4.3–4.6, 8.1–8.4
11
+ */
12
+ import { ILedgerEntry } from '../interfaces/ledger/ledgerEntry';
13
+ import { ILedgerSignatureVerifier } from '../interfaces/ledger/ledgerSignatureVerifier';
14
+ import { IValidationResult } from '../interfaces/ledger/validationResult';
15
+ import { LedgerEntrySerializer } from './ledgerEntrySerializer';
16
+ /**
17
+ * Validates ledger chain integrity by walking entries and verifying:
18
+ * - Contiguous sequence numbers
19
+ * - Genesis entry correctness
20
+ * - Hash-chain links (previousEntryHash)
21
+ * - EntryHash recomputation
22
+ * - Signature verification
23
+ */
24
+ export declare class LedgerChainValidator {
25
+ private readonly serializer;
26
+ private readonly signatureVerifier;
27
+ constructor(serializer: LedgerEntrySerializer, signatureVerifier: ILedgerSignatureVerifier);
28
+ /**
29
+ * Validate the entire chain from genesis to head.
30
+ *
31
+ * Expects entries ordered by sequenceNumber starting from 0.
32
+ * Returns { isValid: true, entriesChecked: 0, errors: [] } for an empty chain.
33
+ */
34
+ validateAll(entries: ILedgerEntry[]): IValidationResult;
35
+ /**
36
+ * Validate a sub-range of entries, including the link to the predecessor.
37
+ *
38
+ * @param entries - The sub-range of entries to validate (ordered by sequenceNumber).
39
+ * @param predecessor - The entry immediately before the sub-range, or null if
40
+ * the sub-range starts at genesis.
41
+ */
42
+ validateRange(entries: ILedgerEntry[], predecessor: ILedgerEntry | null): IValidationResult;
43
+ /**
44
+ * Recompute the entryHash for the given entry and compare it to the
45
+ * stored entryHash. Pushes an error if they don't match.
46
+ */
47
+ private verifyEntryHash;
48
+ /**
49
+ * Verify the entry's signature against its signerPublicKey and entryHash.
50
+ * Pushes an error if verification fails.
51
+ */
52
+ private verifySignature;
53
+ }
54
+ //# sourceMappingURL=ledgerChainValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledgerChainValidator.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/ledger/ledgerChainValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,EAEL,iBAAiB,EAClB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBADjB,UAAU,EAAE,qBAAqB,EACjC,iBAAiB,EAAE,wBAAwB;IAG9D;;;;;OAKG;IACH,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,iBAAiB;IA2DvD;;;;;;OAMG;IACH,aAAa,CACX,OAAO,EAAE,YAAY,EAAE,EACvB,WAAW,EAAE,YAAY,GAAG,IAAI,GAC/B,iBAAiB;IA4EpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcvB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAkBxB"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview LedgerChainValidator — validates chain integrity by walking
4
+ * entries and checking hashes, signatures, and sequence links.
5
+ *
6
+ * Validation does not throw — it returns an IValidationResult with error
7
+ * descriptors. All errors are collected (validation does not stop at the
8
+ * first error).
9
+ *
10
+ * @see Design: Block Chain Ledger — LedgerChainValidator
11
+ * @see Requirements 3.2, 3.3, 4.3–4.6, 8.1–8.4
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.LedgerChainValidator = void 0;
15
+ /**
16
+ * Validates ledger chain integrity by walking entries and verifying:
17
+ * - Contiguous sequence numbers
18
+ * - Genesis entry correctness
19
+ * - Hash-chain links (previousEntryHash)
20
+ * - EntryHash recomputation
21
+ * - Signature verification
22
+ */
23
+ class LedgerChainValidator {
24
+ serializer;
25
+ signatureVerifier;
26
+ constructor(serializer, signatureVerifier) {
27
+ this.serializer = serializer;
28
+ this.signatureVerifier = signatureVerifier;
29
+ }
30
+ /**
31
+ * Validate the entire chain from genesis to head.
32
+ *
33
+ * Expects entries ordered by sequenceNumber starting from 0.
34
+ * Returns { isValid: true, entriesChecked: 0, errors: [] } for an empty chain.
35
+ */
36
+ validateAll(entries) {
37
+ if (entries.length === 0) {
38
+ return { isValid: true, entriesChecked: 0, errors: [] };
39
+ }
40
+ const errors = [];
41
+ for (let i = 0; i < entries.length; i++) {
42
+ const entry = entries[i];
43
+ const expectedSeq = i;
44
+ // Verify contiguous sequence numbers starting from 0
45
+ if (entry.sequenceNumber !== expectedSeq) {
46
+ errors.push({
47
+ sequenceNumber: entry.sequenceNumber,
48
+ errorType: 'sequence_gap',
49
+ message: `Expected sequenceNumber ${expectedSeq}, got ${entry.sequenceNumber}`,
50
+ });
51
+ }
52
+ if (i === 0) {
53
+ // Genesis entry: previousEntryHash must be null
54
+ if (entry.previousEntryHash !== null) {
55
+ errors.push({
56
+ sequenceNumber: entry.sequenceNumber,
57
+ errorType: 'genesis_invalid',
58
+ message: 'Genesis entry (sequenceNumber 0) must have null previousEntryHash',
59
+ });
60
+ }
61
+ }
62
+ else {
63
+ // Non-genesis: previousEntryHash must equal preceding entry's entryHash
64
+ const prev = entries[i - 1];
65
+ if (entry.previousEntryHash === null ||
66
+ !entry.previousEntryHash.equals(prev.entryHash)) {
67
+ errors.push({
68
+ sequenceNumber: entry.sequenceNumber,
69
+ errorType: 'previous_hash_mismatch',
70
+ message: `previousEntryHash does not match preceding entry's entryHash at sequenceNumber ${entry.sequenceNumber}`,
71
+ });
72
+ }
73
+ }
74
+ // Recompute entryHash and verify
75
+ this.verifyEntryHash(entry, errors);
76
+ // Verify signature
77
+ this.verifySignature(entry, errors);
78
+ }
79
+ return {
80
+ isValid: errors.length === 0,
81
+ entriesChecked: entries.length,
82
+ errors,
83
+ };
84
+ }
85
+ /**
86
+ * Validate a sub-range of entries, including the link to the predecessor.
87
+ *
88
+ * @param entries - The sub-range of entries to validate (ordered by sequenceNumber).
89
+ * @param predecessor - The entry immediately before the sub-range, or null if
90
+ * the sub-range starts at genesis.
91
+ */
92
+ validateRange(entries, predecessor) {
93
+ if (entries.length === 0) {
94
+ return { isValid: true, entriesChecked: 0, errors: [] };
95
+ }
96
+ const errors = [];
97
+ const startSeq = predecessor !== null ? predecessor.sequenceNumber + 1 : 0;
98
+ for (let i = 0; i < entries.length; i++) {
99
+ const entry = entries[i];
100
+ const expectedSeq = startSeq + i;
101
+ // Verify contiguous sequence numbers
102
+ if (entry.sequenceNumber !== expectedSeq) {
103
+ errors.push({
104
+ sequenceNumber: entry.sequenceNumber,
105
+ errorType: 'sequence_gap',
106
+ message: `Expected sequenceNumber ${expectedSeq}, got ${entry.sequenceNumber}`,
107
+ });
108
+ }
109
+ if (i === 0) {
110
+ if (predecessor !== null) {
111
+ // First entry in range must link to predecessor
112
+ if (entry.previousEntryHash === null ||
113
+ !entry.previousEntryHash.equals(predecessor.entryHash)) {
114
+ errors.push({
115
+ sequenceNumber: entry.sequenceNumber,
116
+ errorType: 'previous_hash_mismatch',
117
+ message: `previousEntryHash does not match predecessor's entryHash at sequenceNumber ${entry.sequenceNumber}`,
118
+ });
119
+ }
120
+ }
121
+ else {
122
+ // No predecessor means this should be genesis
123
+ if (entry.previousEntryHash !== null) {
124
+ errors.push({
125
+ sequenceNumber: entry.sequenceNumber,
126
+ errorType: 'genesis_invalid',
127
+ message: 'Genesis entry (sequenceNumber 0) must have null previousEntryHash',
128
+ });
129
+ }
130
+ }
131
+ }
132
+ else {
133
+ // Subsequent entries link to the previous entry in the range
134
+ const prev = entries[i - 1];
135
+ if (entry.previousEntryHash === null ||
136
+ !entry.previousEntryHash.equals(prev.entryHash)) {
137
+ errors.push({
138
+ sequenceNumber: entry.sequenceNumber,
139
+ errorType: 'previous_hash_mismatch',
140
+ message: `previousEntryHash does not match preceding entry's entryHash at sequenceNumber ${entry.sequenceNumber}`,
141
+ });
142
+ }
143
+ }
144
+ // Recompute entryHash and verify
145
+ this.verifyEntryHash(entry, errors);
146
+ // Verify signature
147
+ this.verifySignature(entry, errors);
148
+ }
149
+ return {
150
+ isValid: errors.length === 0,
151
+ entriesChecked: entries.length,
152
+ errors,
153
+ };
154
+ }
155
+ // ── private helpers ──────────────────────────────────────────────────
156
+ /**
157
+ * Recompute the entryHash for the given entry and compare it to the
158
+ * stored entryHash. Pushes an error if they don't match.
159
+ */
160
+ verifyEntryHash(entry, errors) {
161
+ const recomputed = this.serializer.computeEntryHash(entry);
162
+ if (!recomputed.equals(entry.entryHash)) {
163
+ errors.push({
164
+ sequenceNumber: entry.sequenceNumber,
165
+ errorType: 'hash_mismatch',
166
+ message: `Recomputed entryHash does not match stored entryHash at sequenceNumber ${entry.sequenceNumber}`,
167
+ });
168
+ }
169
+ }
170
+ /**
171
+ * Verify the entry's signature against its signerPublicKey and entryHash.
172
+ * Pushes an error if verification fails.
173
+ */
174
+ verifySignature(entry, errors) {
175
+ const entryHashBytes = entry.entryHash.toUint8Array();
176
+ const isValid = this.signatureVerifier.verify(entry.signerPublicKey, entryHashBytes, entry.signature);
177
+ if (!isValid) {
178
+ errors.push({
179
+ sequenceNumber: entry.sequenceNumber,
180
+ errorType: 'signature_invalid',
181
+ message: `Signature verification failed at sequenceNumber ${entry.sequenceNumber}`,
182
+ });
183
+ }
184
+ }
185
+ }
186
+ exports.LedgerChainValidator = LedgerChainValidator;
187
+ //# sourceMappingURL=ledgerChainValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledgerChainValidator.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/ledger/ledgerChainValidator.ts"],"names":[],"mappings":"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"}