@brightchain/brightchain-lib 0.29.17 → 0.29.21
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.
- package/package.json +1 -1
- package/src/browser.d.ts +12 -0
- package/src/browser.d.ts.map +1 -1
- package/src/browser.js +16 -1
- package/src/browser.js.map +1 -1
- package/src/lib/errors/ledgerError.d.ts +7 -1
- package/src/lib/errors/ledgerError.d.ts.map +1 -1
- package/src/lib/errors/ledgerError.js +6 -0
- package/src/lib/errors/ledgerError.js.map +1 -1
- package/src/lib/interfaces/ledger/authorizedSigner.d.ts +17 -0
- package/src/lib/interfaces/ledger/authorizedSigner.d.ts.map +1 -0
- package/src/lib/interfaces/ledger/authorizedSigner.js +11 -0
- package/src/lib/interfaces/ledger/authorizedSigner.js.map +1 -0
- package/src/lib/interfaces/ledger/governanceAction.d.ts +46 -0
- package/src/lib/interfaces/ledger/governanceAction.d.ts.map +1 -0
- package/src/lib/interfaces/ledger/governanceAction.js +22 -0
- package/src/lib/interfaces/ledger/governanceAction.js.map +1 -0
- package/src/lib/interfaces/ledger/governancePayload.d.ts +19 -0
- package/src/lib/interfaces/ledger/governancePayload.d.ts.map +1 -0
- package/src/lib/interfaces/ledger/governancePayload.js +11 -0
- package/src/lib/interfaces/ledger/governancePayload.js.map +1 -0
- package/src/lib/interfaces/ledger/index.d.ts +8 -0
- package/src/lib/interfaces/ledger/index.d.ts.map +1 -1
- package/src/lib/interfaces/ledger/index.js +10 -0
- package/src/lib/interfaces/ledger/index.js.map +1 -1
- package/src/lib/interfaces/ledger/quorumPolicy.d.ts +19 -0
- package/src/lib/interfaces/ledger/quorumPolicy.d.ts.map +1 -0
- package/src/lib/interfaces/ledger/quorumPolicy.js +18 -0
- package/src/lib/interfaces/ledger/quorumPolicy.js.map +1 -0
- package/src/lib/interfaces/ledger/signerRole.d.ts +14 -0
- package/src/lib/interfaces/ledger/signerRole.d.ts.map +1 -0
- package/src/lib/interfaces/ledger/signerRole.js +18 -0
- package/src/lib/interfaces/ledger/signerRole.js.map +1 -0
- package/src/lib/interfaces/ledger/signerStatus.d.ts +15 -0
- package/src/lib/interfaces/ledger/signerStatus.d.ts.map +1 -0
- package/src/lib/interfaces/ledger/signerStatus.js +19 -0
- package/src/lib/interfaces/ledger/signerStatus.js.map +1 -0
- package/src/lib/interfaces/ledger/validationResult.d.ts +1 -1
- package/src/lib/interfaces/ledger/validationResult.d.ts.map +1 -1
- package/src/lib/ledger/authorizedSignerSet.d.ts +47 -0
- package/src/lib/ledger/authorizedSignerSet.d.ts.map +1 -0
- package/src/lib/ledger/authorizedSignerSet.js +287 -0
- package/src/lib/ledger/authorizedSignerSet.js.map +1 -0
- package/src/lib/ledger/browserSignatureVerifier.d.ts +18 -0
- package/src/lib/ledger/browserSignatureVerifier.d.ts.map +1 -0
- package/src/lib/ledger/browserSignatureVerifier.js +35 -0
- package/src/lib/ledger/browserSignatureVerifier.js.map +1 -0
- package/src/lib/ledger/governancePayloadSerializer.d.ts +70 -0
- package/src/lib/ledger/governancePayloadSerializer.d.ts.map +1 -0
- package/src/lib/ledger/governancePayloadSerializer.js +499 -0
- package/src/lib/ledger/governancePayloadSerializer.js.map +1 -0
- package/src/lib/ledger/ledger.d.ts +58 -8
- package/src/lib/ledger/ledger.d.ts.map +1 -1
- package/src/lib/ledger/ledger.js +217 -45
- package/src/lib/ledger/ledger.js.map +1 -1
- package/src/lib/ledger/ledgerChainValidator.d.ts +30 -4
- package/src/lib/ledger/ledgerChainValidator.d.ts.map +1 -1
- package/src/lib/ledger/ledgerChainValidator.js +155 -4
- package/src/lib/ledger/ledgerChainValidator.js.map +1 -1
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* @fileoverview LedgerChainValidator — validates chain integrity by walking
|
|
4
|
-
* entries and checking hashes, signatures, and
|
|
4
|
+
* entries and checking hashes, signatures, authorization, and governance
|
|
5
|
+
* constraints.
|
|
5
6
|
*
|
|
6
7
|
* Validation does not throw — it returns an IValidationResult with error
|
|
7
8
|
* descriptors. All errors are collected (validation does not stop at the
|
|
8
9
|
* first error).
|
|
9
10
|
*
|
|
10
11
|
* @see Design: Block Chain Ledger — LedgerChainValidator
|
|
11
|
-
* @see Requirements 3.2, 3.3, 4.3–4.6, 8.1–8.4
|
|
12
|
+
* @see Requirements 3.2, 3.3, 4.3–4.6, 8.1–8.4, 12.6–12.7, 13.6–13.7,
|
|
13
|
+
* 14.5, 15.6, 16.1–16.6
|
|
12
14
|
*/
|
|
13
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
16
|
exports.LedgerChainValidator = void 0;
|
|
17
|
+
const authorizedSignerSet_1 = require("./authorizedSignerSet");
|
|
18
|
+
const governancePayloadSerializer_1 = require("./governancePayloadSerializer");
|
|
15
19
|
/**
|
|
16
20
|
* Validates ledger chain integrity by walking entries and verifying:
|
|
17
21
|
* - Contiguous sequence numbers
|
|
@@ -19,25 +23,36 @@ exports.LedgerChainValidator = void 0;
|
|
|
19
23
|
* - Hash-chain links (previousEntryHash)
|
|
20
24
|
* - EntryHash recomputation
|
|
21
25
|
* - Signature verification
|
|
26
|
+
* - Authorization (signer is in the authorized set)
|
|
27
|
+
* - Governance constraints (admin role, quorum, safety)
|
|
22
28
|
*/
|
|
23
29
|
class LedgerChainValidator {
|
|
24
30
|
serializer;
|
|
25
31
|
signatureVerifier;
|
|
26
|
-
|
|
32
|
+
governanceSerializer;
|
|
33
|
+
constructor(serializer, signatureVerifier, governanceSerializer) {
|
|
27
34
|
this.serializer = serializer;
|
|
28
35
|
this.signatureVerifier = signatureVerifier;
|
|
36
|
+
this.governanceSerializer = governanceSerializer;
|
|
29
37
|
}
|
|
30
38
|
/**
|
|
31
39
|
* Validate the entire chain from genesis to head.
|
|
32
40
|
*
|
|
33
41
|
* Expects entries ordered by sequenceNumber starting from 0.
|
|
34
42
|
* Returns { isValid: true, entriesChecked: 0, errors: [] } for an empty chain.
|
|
43
|
+
*
|
|
44
|
+
* When a governanceSerializer is provided, also validates:
|
|
45
|
+
* - Genesis entry initializes the signer set
|
|
46
|
+
* - Each entry's signer is authorized at that chain position
|
|
47
|
+
* - Governance entries have admin role and satisfy quorum
|
|
48
|
+
* - Governance actions pass safety constraints
|
|
35
49
|
*/
|
|
36
50
|
validateAll(entries) {
|
|
37
51
|
if (entries.length === 0) {
|
|
38
52
|
return { isValid: true, entriesChecked: 0, errors: [] };
|
|
39
53
|
}
|
|
40
54
|
const errors = [];
|
|
55
|
+
let signerSet = null;
|
|
41
56
|
for (let i = 0; i < entries.length; i++) {
|
|
42
57
|
const entry = entries[i];
|
|
43
58
|
const expectedSeq = i;
|
|
@@ -58,6 +73,10 @@ class LedgerChainValidator {
|
|
|
58
73
|
message: 'Genesis entry (sequenceNumber 0) must have null previousEntryHash',
|
|
59
74
|
});
|
|
60
75
|
}
|
|
76
|
+
// Initialize signer set from genesis if governance is enabled
|
|
77
|
+
if (this.governanceSerializer) {
|
|
78
|
+
signerSet = this.initSignerSetFromGenesis(entry, errors);
|
|
79
|
+
}
|
|
61
80
|
}
|
|
62
81
|
else {
|
|
63
82
|
// Non-genesis: previousEntryHash must equal preceding entry's entryHash
|
|
@@ -70,6 +89,10 @@ class LedgerChainValidator {
|
|
|
70
89
|
message: `previousEntryHash does not match preceding entry's entryHash at sequenceNumber ${entry.sequenceNumber}`,
|
|
71
90
|
});
|
|
72
91
|
}
|
|
92
|
+
// Validate authorization and governance for non-genesis entries
|
|
93
|
+
if (signerSet && this.governanceSerializer) {
|
|
94
|
+
this.validateEntryAuthorization(entry, signerSet, errors);
|
|
95
|
+
}
|
|
73
96
|
}
|
|
74
97
|
// Recompute entryHash and verify
|
|
75
98
|
this.verifyEntryHash(entry, errors);
|
|
@@ -88,13 +111,16 @@ class LedgerChainValidator {
|
|
|
88
111
|
* @param entries - The sub-range of entries to validate (ordered by sequenceNumber).
|
|
89
112
|
* @param predecessor - The entry immediately before the sub-range, or null if
|
|
90
113
|
* the sub-range starts at genesis.
|
|
114
|
+
* @param signerSetAtPredecessor - Optional AuthorizedSignerSet state at the predecessor
|
|
115
|
+
* for governance validation of the sub-range.
|
|
91
116
|
*/
|
|
92
|
-
validateRange(entries, predecessor) {
|
|
117
|
+
validateRange(entries, predecessor, signerSetAtPredecessor) {
|
|
93
118
|
if (entries.length === 0) {
|
|
94
119
|
return { isValid: true, entriesChecked: 0, errors: [] };
|
|
95
120
|
}
|
|
96
121
|
const errors = [];
|
|
97
122
|
const startSeq = predecessor !== null ? predecessor.sequenceNumber + 1 : 0;
|
|
123
|
+
let signerSet = signerSetAtPredecessor?.clone() ?? null;
|
|
98
124
|
for (let i = 0; i < entries.length; i++) {
|
|
99
125
|
const entry = entries[i];
|
|
100
126
|
const expectedSeq = startSeq + i;
|
|
@@ -127,6 +153,10 @@ class LedgerChainValidator {
|
|
|
127
153
|
message: 'Genesis entry (sequenceNumber 0) must have null previousEntryHash',
|
|
128
154
|
});
|
|
129
155
|
}
|
|
156
|
+
// Initialize signer set from genesis if governance is enabled
|
|
157
|
+
if (this.governanceSerializer && !signerSet) {
|
|
158
|
+
signerSet = this.initSignerSetFromGenesis(entry, errors);
|
|
159
|
+
}
|
|
130
160
|
}
|
|
131
161
|
}
|
|
132
162
|
else {
|
|
@@ -141,6 +171,12 @@ class LedgerChainValidator {
|
|
|
141
171
|
});
|
|
142
172
|
}
|
|
143
173
|
}
|
|
174
|
+
// Validate authorization for non-genesis entries
|
|
175
|
+
if (i > 0 || predecessor !== null) {
|
|
176
|
+
if (signerSet && this.governanceSerializer) {
|
|
177
|
+
this.validateEntryAuthorization(entry, signerSet, errors);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
144
180
|
// Recompute entryHash and verify
|
|
145
181
|
this.verifyEntryHash(entry, errors);
|
|
146
182
|
// Verify signature
|
|
@@ -153,6 +189,121 @@ class LedgerChainValidator {
|
|
|
153
189
|
};
|
|
154
190
|
}
|
|
155
191
|
// ── private helpers ──────────────────────────────────────────────────
|
|
192
|
+
/**
|
|
193
|
+
* Initialize the AuthorizedSignerSet from a genesis entry.
|
|
194
|
+
* Returns the signer set, or null if the genesis is not a valid governance payload.
|
|
195
|
+
*/
|
|
196
|
+
initSignerSetFromGenesis(entry, errors) {
|
|
197
|
+
if (!this.governanceSerializer)
|
|
198
|
+
return null;
|
|
199
|
+
if (!governancePayloadSerializer_1.GovernancePayloadSerializer.isGovernancePayload(entry.payload)) {
|
|
200
|
+
errors.push({
|
|
201
|
+
sequenceNumber: entry.sequenceNumber,
|
|
202
|
+
errorType: 'invalid_governance_payload',
|
|
203
|
+
message: 'Genesis entry must be a governance genesis payload',
|
|
204
|
+
});
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const parsed = this.governanceSerializer.deserialize(entry.payload);
|
|
209
|
+
if (!parsed.genesis) {
|
|
210
|
+
errors.push({
|
|
211
|
+
sequenceNumber: entry.sequenceNumber,
|
|
212
|
+
errorType: 'invalid_governance_payload',
|
|
213
|
+
message: 'Genesis entry must use genesis subtype',
|
|
214
|
+
});
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
const signerSet = new authorizedSignerSet_1.AuthorizedSignerSet(parsed.genesis.signers, parsed.genesis.quorumPolicy);
|
|
218
|
+
// Verify genesis signer is authorized
|
|
219
|
+
if (!signerSet.canAppend(entry.signerPublicKey)) {
|
|
220
|
+
errors.push({
|
|
221
|
+
sequenceNumber: entry.sequenceNumber,
|
|
222
|
+
errorType: 'unauthorized_signer',
|
|
223
|
+
message: 'Genesis entry signer is not in the initial authorized set',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return signerSet;
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
errors.push({
|
|
230
|
+
sequenceNumber: entry.sequenceNumber,
|
|
231
|
+
errorType: 'invalid_governance_payload',
|
|
232
|
+
message: 'Failed to deserialize genesis governance payload',
|
|
233
|
+
});
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Validate authorization and governance constraints for a non-genesis entry.
|
|
239
|
+
* If the entry is a governance payload, also validates admin role, quorum,
|
|
240
|
+
* and applies actions to the signer set.
|
|
241
|
+
*/
|
|
242
|
+
validateEntryAuthorization(entry, signerSet, errors) {
|
|
243
|
+
const isGovernance = this.governanceSerializer &&
|
|
244
|
+
governancePayloadSerializer_1.GovernancePayloadSerializer.isGovernancePayload(entry.payload);
|
|
245
|
+
if (isGovernance) {
|
|
246
|
+
// Governance entries require active admin
|
|
247
|
+
if (!signerSet.isActiveAdmin(entry.signerPublicKey)) {
|
|
248
|
+
errors.push({
|
|
249
|
+
sequenceNumber: entry.sequenceNumber,
|
|
250
|
+
errorType: 'unauthorized_governance',
|
|
251
|
+
message: 'Governance entry signer is not an active admin',
|
|
252
|
+
});
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
// Parse and validate governance payload
|
|
256
|
+
try {
|
|
257
|
+
const parsed = this.governanceSerializer.deserialize(entry.payload);
|
|
258
|
+
// Verify quorum from cosignatures + primary signer
|
|
259
|
+
const signerKeys = [
|
|
260
|
+
entry.signerPublicKey,
|
|
261
|
+
...parsed.cosignatures.map((c) => c.signerPublicKey),
|
|
262
|
+
];
|
|
263
|
+
if (!signerSet.verifyQuorum(signerKeys)) {
|
|
264
|
+
errors.push({
|
|
265
|
+
sequenceNumber: entry.sequenceNumber,
|
|
266
|
+
errorType: 'quorum_not_met',
|
|
267
|
+
message: `Quorum not met for governance entry at sequenceNumber ${entry.sequenceNumber}`,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// Apply actions to signer set (validates safety constraints)
|
|
271
|
+
for (const action of parsed.actions) {
|
|
272
|
+
try {
|
|
273
|
+
signerSet.applyAction(action);
|
|
274
|
+
}
|
|
275
|
+
catch (e) {
|
|
276
|
+
errors.push({
|
|
277
|
+
sequenceNumber: entry.sequenceNumber,
|
|
278
|
+
errorType: 'governance_safety_violation',
|
|
279
|
+
message: `Governance action failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch (e) {
|
|
285
|
+
// Only push if not already a LedgerValidationError we added
|
|
286
|
+
if (!(e instanceof Error) ||
|
|
287
|
+
!e.message.includes('Governance action failed')) {
|
|
288
|
+
errors.push({
|
|
289
|
+
sequenceNumber: entry.sequenceNumber,
|
|
290
|
+
errorType: 'invalid_governance_payload',
|
|
291
|
+
message: `Failed to parse governance payload: ${e instanceof Error ? e.message : String(e)}`,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// Regular entry: signer must be authorized to append
|
|
298
|
+
if (!signerSet.canAppend(entry.signerPublicKey)) {
|
|
299
|
+
errors.push({
|
|
300
|
+
sequenceNumber: entry.sequenceNumber,
|
|
301
|
+
errorType: 'unauthorized_signer',
|
|
302
|
+
message: `Signer is not authorized to append at sequenceNumber ${entry.sequenceNumber}`,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
156
307
|
/**
|
|
157
308
|
* Recompute the entryHash for the given entry and compare it to the
|
|
158
309
|
* stored entryHash. Pushes an error if they don't match.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledgerChainValidator.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/ledger/ledgerChainValidator.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"ledgerChainValidator.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/ledger/ledgerChainValidator.ts"],"names":[],"mappings":"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"}
|