@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
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Governance payload serializer for the blockchain ledger.
|
|
4
|
+
*
|
|
5
|
+
* Handles deterministic binary serialization of governance payloads,
|
|
6
|
+
* including the 0x01 type prefix that distinguishes governance entries
|
|
7
|
+
* from regular (0x00) entries.
|
|
8
|
+
*
|
|
9
|
+
* Binary format (after 0x01 type prefix):
|
|
10
|
+
* - 1 byte: subtype (0x00 = genesis, 0x01 = amendment)
|
|
11
|
+
* - For genesis: quorum policy + initial signer list
|
|
12
|
+
* - 2 bytes: actionCount (uint16 BE)
|
|
13
|
+
* - variable: serialized actions
|
|
14
|
+
* - 2 bytes: cosignatureCount (uint16 BE)
|
|
15
|
+
* - variable: cosignatures
|
|
16
|
+
*
|
|
17
|
+
* @see Design: Governance Payload Serialization Format
|
|
18
|
+
* @see Requirements 13.9
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.GovernancePayloadSerializer = void 0;
|
|
22
|
+
const governanceAction_1 = require("../interfaces/ledger/governanceAction");
|
|
23
|
+
const quorumPolicy_1 = require("../interfaces/ledger/quorumPolicy");
|
|
24
|
+
const signerRole_1 = require("../interfaces/ledger/signerRole");
|
|
25
|
+
const signerStatus_1 = require("../interfaces/ledger/signerStatus");
|
|
26
|
+
const ledgerSerializationError_1 = require("../errors/ledgerSerializationError");
|
|
27
|
+
/** Governance payload type prefix byte. */
|
|
28
|
+
const GOVERNANCE_PREFIX = 0x01;
|
|
29
|
+
/** Subtype bytes. */
|
|
30
|
+
const SUBTYPE_GENESIS = 0x00;
|
|
31
|
+
const SUBTYPE_AMENDMENT = 0x01;
|
|
32
|
+
/** Action type byte mapping. */
|
|
33
|
+
const ACTION_TYPE_BYTES = {
|
|
34
|
+
[governanceAction_1.GovernanceActionType.AddSigner]: 0x00,
|
|
35
|
+
[governanceAction_1.GovernanceActionType.RemoveSigner]: 0x01,
|
|
36
|
+
[governanceAction_1.GovernanceActionType.ChangeRole]: 0x02,
|
|
37
|
+
[governanceAction_1.GovernanceActionType.UpdateQuorum]: 0x03,
|
|
38
|
+
[governanceAction_1.GovernanceActionType.SuspendSigner]: 0x04,
|
|
39
|
+
[governanceAction_1.GovernanceActionType.ReactivateSigner]: 0x05,
|
|
40
|
+
[governanceAction_1.GovernanceActionType.SetMemberData]: 0x06,
|
|
41
|
+
};
|
|
42
|
+
/** Reverse mapping from byte to action type. */
|
|
43
|
+
const BYTE_TO_ACTION_TYPE = {};
|
|
44
|
+
for (const [key, value] of Object.entries(ACTION_TYPE_BYTES)) {
|
|
45
|
+
BYTE_TO_ACTION_TYPE[value] = key;
|
|
46
|
+
}
|
|
47
|
+
/** Role byte mapping. */
|
|
48
|
+
const ROLE_BYTES = {
|
|
49
|
+
[signerRole_1.SignerRole.Admin]: 0x00,
|
|
50
|
+
[signerRole_1.SignerRole.Writer]: 0x01,
|
|
51
|
+
[signerRole_1.SignerRole.Reader]: 0x02,
|
|
52
|
+
};
|
|
53
|
+
const BYTE_TO_ROLE = {
|
|
54
|
+
0x00: signerRole_1.SignerRole.Admin,
|
|
55
|
+
0x01: signerRole_1.SignerRole.Writer,
|
|
56
|
+
0x02: signerRole_1.SignerRole.Reader,
|
|
57
|
+
};
|
|
58
|
+
/** Status byte mapping. */
|
|
59
|
+
const STATUS_BYTES = {
|
|
60
|
+
[signerStatus_1.SignerStatus.Active]: 0x00,
|
|
61
|
+
[signerStatus_1.SignerStatus.Suspended]: 0x01,
|
|
62
|
+
[signerStatus_1.SignerStatus.Retired]: 0x02,
|
|
63
|
+
};
|
|
64
|
+
const BYTE_TO_STATUS = {
|
|
65
|
+
0x00: signerStatus_1.SignerStatus.Active,
|
|
66
|
+
0x01: signerStatus_1.SignerStatus.Suspended,
|
|
67
|
+
0x02: signerStatus_1.SignerStatus.Retired,
|
|
68
|
+
};
|
|
69
|
+
/** Quorum type byte mapping. */
|
|
70
|
+
const QUORUM_TYPE_BYTES = {
|
|
71
|
+
[quorumPolicy_1.QuorumType.Unanimous]: 0x00,
|
|
72
|
+
[quorumPolicy_1.QuorumType.Majority]: 0x01,
|
|
73
|
+
[quorumPolicy_1.QuorumType.Threshold]: 0x02,
|
|
74
|
+
};
|
|
75
|
+
const BYTE_TO_QUORUM_TYPE = {
|
|
76
|
+
0x00: quorumPolicy_1.QuorumType.Unanimous,
|
|
77
|
+
0x01: quorumPolicy_1.QuorumType.Majority,
|
|
78
|
+
0x02: quorumPolicy_1.QuorumType.Threshold,
|
|
79
|
+
};
|
|
80
|
+
/** Text encoder/decoder for UTF-8 string serialization. */
|
|
81
|
+
const textEncoder = new TextEncoder();
|
|
82
|
+
const textDecoder = new TextDecoder();
|
|
83
|
+
class GovernancePayloadSerializer {
|
|
84
|
+
/**
|
|
85
|
+
* Check if a payload Uint8Array is a governance payload (starts with 0x01).
|
|
86
|
+
*/
|
|
87
|
+
static isGovernancePayload(payload) {
|
|
88
|
+
return payload.length > 0 && payload[0] === GOVERNANCE_PREFIX;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Serialize a governance payload into a Uint8Array with 0x01 prefix.
|
|
92
|
+
* This produces an amendment-subtype payload.
|
|
93
|
+
*/
|
|
94
|
+
serialize(payload) {
|
|
95
|
+
const actionBytes = this.serializeActions(payload.actions);
|
|
96
|
+
const cosigBytes = this.serializeCosignatures(payload.cosignatures);
|
|
97
|
+
// 1 (prefix) + 1 (subtype) + 2 (actionCount) + actions + 2 (cosigCount) + cosigs
|
|
98
|
+
const totalSize = 1 + 1 + 2 + actionBytes.length + 2 + cosigBytes.length;
|
|
99
|
+
const result = new Uint8Array(totalSize);
|
|
100
|
+
let offset = 0;
|
|
101
|
+
result[offset++] = GOVERNANCE_PREFIX;
|
|
102
|
+
result[offset++] = SUBTYPE_AMENDMENT;
|
|
103
|
+
// Action count (uint16 BE)
|
|
104
|
+
const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
|
|
105
|
+
view.setUint16(offset, payload.actions.length, false);
|
|
106
|
+
offset += 2;
|
|
107
|
+
// Actions
|
|
108
|
+
result.set(actionBytes, offset);
|
|
109
|
+
offset += actionBytes.length;
|
|
110
|
+
// Cosignature count (uint16 BE)
|
|
111
|
+
view.setUint16(offset, payload.cosignatures.length, false);
|
|
112
|
+
offset += 2;
|
|
113
|
+
// Cosignatures
|
|
114
|
+
result.set(cosigBytes, offset);
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Serialize a genesis governance payload with initial signer set and quorum policy.
|
|
119
|
+
*/
|
|
120
|
+
serializeGenesis(data) {
|
|
121
|
+
const quorumBytes = this.serializeQuorumPolicy(data.quorumPolicy);
|
|
122
|
+
const signerBytes = this.serializeSignerList(data.signers);
|
|
123
|
+
// 1 (prefix) + 1 (subtype) + quorum + 2 (signerCount) + signers + 2 (cosigCount=0)
|
|
124
|
+
const totalSize = 1 + 1 + quorumBytes.length + 2 + signerBytes.length + 2;
|
|
125
|
+
const result = new Uint8Array(totalSize);
|
|
126
|
+
let offset = 0;
|
|
127
|
+
result[offset++] = GOVERNANCE_PREFIX;
|
|
128
|
+
result[offset++] = SUBTYPE_GENESIS;
|
|
129
|
+
// Quorum policy
|
|
130
|
+
result.set(quorumBytes, offset);
|
|
131
|
+
offset += quorumBytes.length;
|
|
132
|
+
// Signer count (uint16 BE)
|
|
133
|
+
const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
|
|
134
|
+
view.setUint16(offset, data.signers.length, false);
|
|
135
|
+
offset += 2;
|
|
136
|
+
// Signers
|
|
137
|
+
result.set(signerBytes, offset);
|
|
138
|
+
offset += signerBytes.length;
|
|
139
|
+
// Cosignature count = 0 for genesis
|
|
140
|
+
view.setUint16(offset, 0, false);
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Deserialize a Uint8Array (with 0x01 prefix) back into an IGovernancePayload.
|
|
145
|
+
* For genesis payloads, also returns the genesis data.
|
|
146
|
+
*/
|
|
147
|
+
deserialize(data) {
|
|
148
|
+
if (data.length < 4) {
|
|
149
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.DataTooShort, 'Governance payload too short');
|
|
150
|
+
}
|
|
151
|
+
if (data[0] !== GOVERNANCE_PREFIX) {
|
|
152
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.InvalidMagic, `Expected governance prefix 0x01, got 0x${data[0].toString(16).padStart(2, '0')}`);
|
|
153
|
+
}
|
|
154
|
+
const subtype = data[1];
|
|
155
|
+
let offset = 2;
|
|
156
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
157
|
+
if (subtype === SUBTYPE_GENESIS) {
|
|
158
|
+
return this.deserializeGenesis(data, offset, view);
|
|
159
|
+
}
|
|
160
|
+
else if (subtype === SUBTYPE_AMENDMENT) {
|
|
161
|
+
return this.deserializeAmendment(data, offset, view);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.UnsupportedVersion, `Unknown governance subtype: 0x${subtype.toString(16).padStart(2, '0')}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Serialize the governance actions only (without cosignatures) for hashing/signing by co-signers.
|
|
169
|
+
*/
|
|
170
|
+
serializeActionsForSigning(actions) {
|
|
171
|
+
const actionBytes = this.serializeActions(actions);
|
|
172
|
+
// 2 (actionCount) + actions
|
|
173
|
+
const result = new Uint8Array(2 + actionBytes.length);
|
|
174
|
+
const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
|
|
175
|
+
view.setUint16(0, actions.length, false);
|
|
176
|
+
result.set(actionBytes, 2);
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
// ---- Private serialization helpers ----
|
|
180
|
+
serializeActions(actions) {
|
|
181
|
+
const parts = [];
|
|
182
|
+
for (const action of actions) {
|
|
183
|
+
parts.push(this.serializeAction(action));
|
|
184
|
+
}
|
|
185
|
+
return concatUint8Arrays(parts);
|
|
186
|
+
}
|
|
187
|
+
serializeAction(action) {
|
|
188
|
+
const parts = [];
|
|
189
|
+
// Action type byte
|
|
190
|
+
parts.push(new Uint8Array([ACTION_TYPE_BYTES[action.type]]));
|
|
191
|
+
switch (action.type) {
|
|
192
|
+
case governanceAction_1.GovernanceActionType.AddSigner: {
|
|
193
|
+
parts.push(serializePubKey(action.publicKey));
|
|
194
|
+
parts.push(new Uint8Array([ROLE_BYTES[action.role]]));
|
|
195
|
+
parts.push(this.serializeMetadata(action.metadata ?? new Map()));
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
case governanceAction_1.GovernanceActionType.RemoveSigner:
|
|
199
|
+
case governanceAction_1.GovernanceActionType.SuspendSigner:
|
|
200
|
+
case governanceAction_1.GovernanceActionType.ReactivateSigner: {
|
|
201
|
+
parts.push(serializePubKey(action.publicKey));
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
case governanceAction_1.GovernanceActionType.ChangeRole: {
|
|
205
|
+
parts.push(serializePubKey(action.publicKey));
|
|
206
|
+
parts.push(new Uint8Array([ROLE_BYTES[action.newRole]]));
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case governanceAction_1.GovernanceActionType.UpdateQuorum: {
|
|
210
|
+
parts.push(this.serializeQuorumPolicy(action.newPolicy));
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
case governanceAction_1.GovernanceActionType.SetMemberData: {
|
|
214
|
+
parts.push(serializePubKey(action.publicKey));
|
|
215
|
+
parts.push(this.serializeMetadata(action.metadata));
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return concatUint8Arrays(parts);
|
|
220
|
+
}
|
|
221
|
+
serializeQuorumPolicy(policy) {
|
|
222
|
+
if (policy.type === quorumPolicy_1.QuorumType.Threshold) {
|
|
223
|
+
const result = new Uint8Array(5);
|
|
224
|
+
result[0] = QUORUM_TYPE_BYTES[policy.type];
|
|
225
|
+
const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
|
|
226
|
+
view.setUint32(1, policy.threshold ?? 1, false);
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
return new Uint8Array([QUORUM_TYPE_BYTES[policy.type]]);
|
|
230
|
+
}
|
|
231
|
+
serializeMetadata(metadata) {
|
|
232
|
+
const parts = [];
|
|
233
|
+
// Entry count (uint16 BE)
|
|
234
|
+
const countBuf = new Uint8Array(2);
|
|
235
|
+
new DataView(countBuf.buffer).setUint16(0, metadata.size, false);
|
|
236
|
+
parts.push(countBuf);
|
|
237
|
+
// Sort keys for deterministic serialization
|
|
238
|
+
const sortedEntries = [...metadata.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
239
|
+
for (const [key, value] of sortedEntries) {
|
|
240
|
+
const keyBytes = textEncoder.encode(key);
|
|
241
|
+
const valueBytes = textEncoder.encode(value);
|
|
242
|
+
const keyLenBuf = new Uint8Array(2);
|
|
243
|
+
new DataView(keyLenBuf.buffer).setUint16(0, keyBytes.length, false);
|
|
244
|
+
parts.push(keyLenBuf);
|
|
245
|
+
parts.push(keyBytes);
|
|
246
|
+
const valueLenBuf = new Uint8Array(2);
|
|
247
|
+
new DataView(valueLenBuf.buffer).setUint16(0, valueBytes.length, false);
|
|
248
|
+
parts.push(valueLenBuf);
|
|
249
|
+
parts.push(valueBytes);
|
|
250
|
+
}
|
|
251
|
+
return concatUint8Arrays(parts);
|
|
252
|
+
}
|
|
253
|
+
serializeSignerList(signers) {
|
|
254
|
+
const parts = [];
|
|
255
|
+
for (const signer of signers) {
|
|
256
|
+
parts.push(serializePubKey(signer.publicKey));
|
|
257
|
+
parts.push(new Uint8Array([ROLE_BYTES[signer.role]]));
|
|
258
|
+
parts.push(new Uint8Array([STATUS_BYTES[signer.status]]));
|
|
259
|
+
parts.push(this.serializeMetadata(signer.metadata));
|
|
260
|
+
}
|
|
261
|
+
return concatUint8Arrays(parts);
|
|
262
|
+
}
|
|
263
|
+
serializeCosignatures(cosignatures) {
|
|
264
|
+
const parts = [];
|
|
265
|
+
for (const cosig of cosignatures) {
|
|
266
|
+
parts.push(serializePubKey(cosig.signerPublicKey));
|
|
267
|
+
parts.push(new Uint8Array(cosig.signature));
|
|
268
|
+
}
|
|
269
|
+
return concatUint8Arrays(parts);
|
|
270
|
+
}
|
|
271
|
+
// ---- Private deserialization helpers ----
|
|
272
|
+
deserializeGenesis(data, offset, view) {
|
|
273
|
+
// Quorum policy
|
|
274
|
+
const { policy: quorumPolicy, bytesRead: quorumBytes } = this.deserializeQuorumPolicy(data, offset, view);
|
|
275
|
+
offset += quorumBytes;
|
|
276
|
+
// Signer count
|
|
277
|
+
this.ensureBytes(data, offset, 2, 'signer count');
|
|
278
|
+
const signerCount = view.getUint16(offset, false);
|
|
279
|
+
offset += 2;
|
|
280
|
+
// Signers
|
|
281
|
+
const signers = [];
|
|
282
|
+
for (let i = 0; i < signerCount; i++) {
|
|
283
|
+
const { signer, bytesRead } = this.deserializeSigner(data, offset, view);
|
|
284
|
+
signers.push(signer);
|
|
285
|
+
offset += bytesRead;
|
|
286
|
+
}
|
|
287
|
+
// Cosignature count
|
|
288
|
+
this.ensureBytes(data, offset, 2, 'cosignature count');
|
|
289
|
+
const cosigCount = view.getUint16(offset, false);
|
|
290
|
+
offset += 2;
|
|
291
|
+
const cosignatures = this.deserializeCosignatures(data, offset, view, cosigCount);
|
|
292
|
+
return {
|
|
293
|
+
actions: [],
|
|
294
|
+
cosignatures: cosignatures.cosigs,
|
|
295
|
+
genesis: { quorumPolicy, signers },
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
deserializeAmendment(data, offset, view) {
|
|
299
|
+
// Action count
|
|
300
|
+
this.ensureBytes(data, offset, 2, 'action count');
|
|
301
|
+
const actionCount = view.getUint16(offset, false);
|
|
302
|
+
offset += 2;
|
|
303
|
+
// Actions
|
|
304
|
+
const actions = [];
|
|
305
|
+
for (let i = 0; i < actionCount; i++) {
|
|
306
|
+
const { action, bytesRead } = this.deserializeAction(data, offset, view);
|
|
307
|
+
actions.push(action);
|
|
308
|
+
offset += bytesRead;
|
|
309
|
+
}
|
|
310
|
+
// Cosignature count
|
|
311
|
+
this.ensureBytes(data, offset, 2, 'cosignature count');
|
|
312
|
+
const cosigCount = view.getUint16(offset, false);
|
|
313
|
+
offset += 2;
|
|
314
|
+
const cosignatures = this.deserializeCosignatures(data, offset, view, cosigCount);
|
|
315
|
+
return { actions, cosignatures: cosignatures.cosigs };
|
|
316
|
+
}
|
|
317
|
+
deserializeAction(data, offset, view) {
|
|
318
|
+
const startOffset = offset;
|
|
319
|
+
this.ensureBytes(data, offset, 1, 'action type');
|
|
320
|
+
const actionTypeByte = data[offset++];
|
|
321
|
+
const actionType = BYTE_TO_ACTION_TYPE[actionTypeByte];
|
|
322
|
+
if (actionType === undefined) {
|
|
323
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, `Unknown action type byte: 0x${actionTypeByte.toString(16).padStart(2, '0')}`);
|
|
324
|
+
}
|
|
325
|
+
switch (actionType) {
|
|
326
|
+
case governanceAction_1.GovernanceActionType.AddSigner: {
|
|
327
|
+
const { publicKey, bytesRead: pkBytes } = deserializePubKey(data, offset, view);
|
|
328
|
+
offset += pkBytes;
|
|
329
|
+
this.ensureBytes(data, offset, 1, 'role');
|
|
330
|
+
const role = BYTE_TO_ROLE[data[offset++]];
|
|
331
|
+
if (role === undefined) {
|
|
332
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, 'Invalid role byte');
|
|
333
|
+
}
|
|
334
|
+
const { metadata, bytesRead: metaBytes } = this.deserializeMetadata(data, offset, view);
|
|
335
|
+
offset += metaBytes;
|
|
336
|
+
return {
|
|
337
|
+
action: { type: actionType, publicKey, role, metadata },
|
|
338
|
+
bytesRead: offset - startOffset,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
case governanceAction_1.GovernanceActionType.RemoveSigner:
|
|
342
|
+
case governanceAction_1.GovernanceActionType.SuspendSigner:
|
|
343
|
+
case governanceAction_1.GovernanceActionType.ReactivateSigner: {
|
|
344
|
+
const { publicKey, bytesRead: pkBytes } = deserializePubKey(data, offset, view);
|
|
345
|
+
offset += pkBytes;
|
|
346
|
+
return {
|
|
347
|
+
action: { type: actionType, publicKey },
|
|
348
|
+
bytesRead: offset - startOffset,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
case governanceAction_1.GovernanceActionType.ChangeRole: {
|
|
352
|
+
const { publicKey, bytesRead: pkBytes } = deserializePubKey(data, offset, view);
|
|
353
|
+
offset += pkBytes;
|
|
354
|
+
this.ensureBytes(data, offset, 1, 'new role');
|
|
355
|
+
const newRole = BYTE_TO_ROLE[data[offset++]];
|
|
356
|
+
if (newRole === undefined) {
|
|
357
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, 'Invalid role byte');
|
|
358
|
+
}
|
|
359
|
+
return {
|
|
360
|
+
action: { type: actionType, publicKey, newRole },
|
|
361
|
+
bytesRead: offset - startOffset,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
case governanceAction_1.GovernanceActionType.UpdateQuorum: {
|
|
365
|
+
const { policy, bytesRead: qBytes } = this.deserializeQuorumPolicy(data, offset, view);
|
|
366
|
+
offset += qBytes;
|
|
367
|
+
return {
|
|
368
|
+
action: { type: actionType, newPolicy: policy },
|
|
369
|
+
bytesRead: offset - startOffset,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
case governanceAction_1.GovernanceActionType.SetMemberData: {
|
|
373
|
+
const { publicKey, bytesRead: pkBytes } = deserializePubKey(data, offset, view);
|
|
374
|
+
offset += pkBytes;
|
|
375
|
+
const { metadata, bytesRead: metaBytes } = this.deserializeMetadata(data, offset, view);
|
|
376
|
+
offset += metaBytes;
|
|
377
|
+
return {
|
|
378
|
+
action: { type: actionType, publicKey, metadata },
|
|
379
|
+
bytesRead: offset - startOffset,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
default:
|
|
383
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, `Unhandled action type: ${actionType}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
deserializeQuorumPolicy(data, offset, view) {
|
|
387
|
+
this.ensureBytes(data, offset, 1, 'quorum type');
|
|
388
|
+
const quorumTypeByte = data[offset];
|
|
389
|
+
const quorumType = BYTE_TO_QUORUM_TYPE[quorumTypeByte];
|
|
390
|
+
if (quorumType === undefined) {
|
|
391
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, `Unknown quorum type byte: 0x${quorumTypeByte.toString(16).padStart(2, '0')}`);
|
|
392
|
+
}
|
|
393
|
+
if (quorumType === quorumPolicy_1.QuorumType.Threshold) {
|
|
394
|
+
this.ensureBytes(data, offset, 5, 'quorum threshold');
|
|
395
|
+
const threshold = view.getUint32(offset + 1, false);
|
|
396
|
+
return { policy: { type: quorumType, threshold }, bytesRead: 5 };
|
|
397
|
+
}
|
|
398
|
+
return { policy: { type: quorumType }, bytesRead: 1 };
|
|
399
|
+
}
|
|
400
|
+
deserializeMetadata(data, offset, view) {
|
|
401
|
+
const startOffset = offset;
|
|
402
|
+
this.ensureBytes(data, offset, 2, 'metadata entry count');
|
|
403
|
+
const entryCount = view.getUint16(offset, false);
|
|
404
|
+
offset += 2;
|
|
405
|
+
const metadata = new Map();
|
|
406
|
+
for (let i = 0; i < entryCount; i++) {
|
|
407
|
+
// Key
|
|
408
|
+
this.ensureBytes(data, offset, 2, 'metadata key length');
|
|
409
|
+
const keyLen = view.getUint16(offset, false);
|
|
410
|
+
offset += 2;
|
|
411
|
+
this.ensureBytes(data, offset, keyLen, 'metadata key');
|
|
412
|
+
const key = textDecoder.decode(data.subarray(offset, offset + keyLen));
|
|
413
|
+
offset += keyLen;
|
|
414
|
+
// Value
|
|
415
|
+
this.ensureBytes(data, offset, 2, 'metadata value length');
|
|
416
|
+
const valueLen = view.getUint16(offset, false);
|
|
417
|
+
offset += 2;
|
|
418
|
+
this.ensureBytes(data, offset, valueLen, 'metadata value');
|
|
419
|
+
const value = textDecoder.decode(data.subarray(offset, offset + valueLen));
|
|
420
|
+
offset += valueLen;
|
|
421
|
+
metadata.set(key, value);
|
|
422
|
+
}
|
|
423
|
+
return { metadata, bytesRead: offset - startOffset };
|
|
424
|
+
}
|
|
425
|
+
deserializeSigner(data, offset, view) {
|
|
426
|
+
const startOffset = offset;
|
|
427
|
+
const { publicKey, bytesRead: pkBytes } = deserializePubKey(data, offset, view);
|
|
428
|
+
offset += pkBytes;
|
|
429
|
+
this.ensureBytes(data, offset, 1, 'signer role');
|
|
430
|
+
const role = BYTE_TO_ROLE[data[offset++]];
|
|
431
|
+
if (role === undefined) {
|
|
432
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, 'Invalid role byte in signer list');
|
|
433
|
+
}
|
|
434
|
+
this.ensureBytes(data, offset, 1, 'signer status');
|
|
435
|
+
const status = BYTE_TO_STATUS[data[offset++]];
|
|
436
|
+
if (status === undefined) {
|
|
437
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, 'Invalid status byte in signer list');
|
|
438
|
+
}
|
|
439
|
+
const { metadata, bytesRead: metaBytes } = this.deserializeMetadata(data, offset, view);
|
|
440
|
+
offset += metaBytes;
|
|
441
|
+
return {
|
|
442
|
+
signer: { publicKey, role, status, metadata },
|
|
443
|
+
bytesRead: offset - startOffset,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
deserializeCosignatures(data, offset, view, count) {
|
|
447
|
+
const startOffset = offset;
|
|
448
|
+
const cosigs = [];
|
|
449
|
+
for (let i = 0; i < count; i++) {
|
|
450
|
+
const { publicKey, bytesRead: pkBytes } = deserializePubKey(data, offset, view);
|
|
451
|
+
offset += pkBytes;
|
|
452
|
+
this.ensureBytes(data, offset, 64, 'cosignature');
|
|
453
|
+
const signature = new Uint8Array(data.buffer, data.byteOffset + offset, 64);
|
|
454
|
+
offset += 64;
|
|
455
|
+
cosigs.push({ signerPublicKey: publicKey, signature: new Uint8Array(signature) });
|
|
456
|
+
}
|
|
457
|
+
return { cosigs, bytesRead: offset - startOffset };
|
|
458
|
+
}
|
|
459
|
+
ensureBytes(data, offset, needed, fieldName) {
|
|
460
|
+
if (offset + needed > data.length) {
|
|
461
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, `Not enough bytes for ${fieldName}: need ${needed} at offset ${offset}, have ${data.length - offset}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
exports.GovernancePayloadSerializer = GovernancePayloadSerializer;
|
|
466
|
+
// ---- Module-level utility functions ----
|
|
467
|
+
function serializePubKey(publicKey) {
|
|
468
|
+
const result = new Uint8Array(4 + publicKey.length);
|
|
469
|
+
const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
|
|
470
|
+
view.setUint32(0, publicKey.length, false);
|
|
471
|
+
result.set(publicKey, 4);
|
|
472
|
+
return result;
|
|
473
|
+
}
|
|
474
|
+
function deserializePubKey(data, offset, view) {
|
|
475
|
+
if (offset + 4 > data.length) {
|
|
476
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, 'Not enough bytes for public key length');
|
|
477
|
+
}
|
|
478
|
+
const keyLen = view.getUint32(offset, false);
|
|
479
|
+
offset += 4;
|
|
480
|
+
if (offset + keyLen > data.length) {
|
|
481
|
+
throw new ledgerSerializationError_1.LedgerSerializationError(ledgerSerializationError_1.LedgerSerializationErrorType.FieldOverflow, `Not enough bytes for public key: need ${keyLen}, have ${data.length - offset}`);
|
|
482
|
+
}
|
|
483
|
+
const publicKey = new Uint8Array(data.subarray(offset, offset + keyLen));
|
|
484
|
+
return { publicKey, bytesRead: 4 + keyLen };
|
|
485
|
+
}
|
|
486
|
+
function concatUint8Arrays(arrays) {
|
|
487
|
+
let totalLength = 0;
|
|
488
|
+
for (const arr of arrays) {
|
|
489
|
+
totalLength += arr.length;
|
|
490
|
+
}
|
|
491
|
+
const result = new Uint8Array(totalLength);
|
|
492
|
+
let offset = 0;
|
|
493
|
+
for (const arr of arrays) {
|
|
494
|
+
result.set(arr, offset);
|
|
495
|
+
offset += arr.length;
|
|
496
|
+
}
|
|
497
|
+
return result;
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=governancePayloadSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governancePayloadSerializer.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/ledger/governancePayloadSerializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,14 +13,25 @@
|
|
|
13
13
|
* subclass that allows a caller-specified checksum to differ from the
|
|
14
14
|
* content hash.
|
|
15
15
|
*
|
|
16
|
+
* Governance support: the Ledger enforces role-based access control via an
|
|
17
|
+
* AuthorizedSignerSet. The genesis entry must be a governance genesis payload
|
|
18
|
+
* containing the initial signer set and quorum policy. Subsequent governance
|
|
19
|
+
* entries require admin role and quorum satisfaction.
|
|
20
|
+
*
|
|
16
21
|
* @see Design: Block Chain Ledger — Ledger
|
|
17
|
-
* @see Requirements 5.1–5.6, 6.1–6.6, 7.1–7.5, 10.1–10.4, 11.2–11.4
|
|
22
|
+
* @see Requirements 5.1–5.6, 6.1–6.6, 7.1–7.5, 10.1–10.4, 11.2–11.4,
|
|
23
|
+
* 12.2–12.8, 13.1–13.9, 14.1–14.7, 15.1–15.5, 17.6–17.9, 18.5–18.7
|
|
18
24
|
*/
|
|
25
|
+
import { SignatureUint8Array } from '@digitaldefiance/ecies-lib';
|
|
19
26
|
import { BlockSize } from '../enumerations/blockSize';
|
|
27
|
+
import { IAuthorizedSigner } from '../interfaces/ledger/authorizedSigner';
|
|
28
|
+
import { IGovernanceAction } from '../interfaces/ledger/governanceAction';
|
|
20
29
|
import { ILedgerEntry } from '../interfaces/ledger/ledgerEntry';
|
|
21
30
|
import { ILedgerSigner } from '../interfaces/ledger/ledgerSigner';
|
|
31
|
+
import { IQuorumPolicy } from '../interfaces/ledger/quorumPolicy';
|
|
22
32
|
import { IBlockStore } from '../interfaces/storage/blockStore';
|
|
23
33
|
import { Checksum } from '../types/checksum';
|
|
34
|
+
import { GovernancePayloadSerializer } from './governancePayloadSerializer';
|
|
24
35
|
import { LedgerEntrySerializer } from './ledgerEntrySerializer';
|
|
25
36
|
/**
|
|
26
37
|
* Append-only blockchain ledger backed by an IBlockStore.
|
|
@@ -28,27 +39,53 @@ import { LedgerEntrySerializer } from './ledgerEntrySerializer';
|
|
|
28
39
|
* Maintains an in-memory index (sequenceNumber → block Checksum) for O(1)
|
|
29
40
|
* lookups and persists a metadata block after each append for cold-start
|
|
30
41
|
* reconstruction via `Ledger.load()`.
|
|
42
|
+
*
|
|
43
|
+
* Enforces role-based access control via an AuthorizedSignerSet when
|
|
44
|
+
* governance is enabled (i.e., when a GovernancePayloadSerializer is provided).
|
|
31
45
|
*/
|
|
32
46
|
export declare class Ledger {
|
|
33
47
|
private readonly store;
|
|
34
48
|
private readonly blockSize;
|
|
35
49
|
private readonly serializer;
|
|
36
50
|
private readonly ledgerId;
|
|
51
|
+
private readonly governanceSerializer?;
|
|
37
52
|
private readonly index;
|
|
38
53
|
private readonly checksumService;
|
|
39
54
|
private _length;
|
|
40
55
|
private _head;
|
|
41
56
|
private _headEntryHash;
|
|
42
|
-
|
|
57
|
+
private _authorizedSignerSet;
|
|
58
|
+
constructor(store: IBlockStore, blockSize: BlockSize, serializer: LedgerEntrySerializer, ledgerId: string, governanceSerializer?: GovernancePayloadSerializer | undefined);
|
|
43
59
|
/** Current chain length. */
|
|
44
60
|
get length(): number;
|
|
45
61
|
/** Head block Checksum (block storage key), or null if empty. */
|
|
46
62
|
get head(): Checksum | null;
|
|
63
|
+
/** Current quorum policy, or undefined if governance not initialized. */
|
|
64
|
+
get quorumPolicy(): IQuorumPolicy | undefined;
|
|
47
65
|
/**
|
|
48
66
|
* Append a new entry to the ledger.
|
|
49
67
|
* Returns the Checksum of the stored block.
|
|
68
|
+
*
|
|
69
|
+
* If governance is enabled:
|
|
70
|
+
* - Genesis entry (sequenceNumber 0) must be a governance genesis payload.
|
|
71
|
+
* - Subsequent entries require the signer to be authorized (active admin or writer).
|
|
50
72
|
*/
|
|
51
73
|
append(payload: Uint8Array, signer: ILedgerSigner): Promise<Checksum>;
|
|
74
|
+
/**
|
|
75
|
+
* Append a governance entry. Requires admin role and quorum satisfaction.
|
|
76
|
+
*
|
|
77
|
+
* @param actions - Governance actions to apply
|
|
78
|
+
* @param primarySigner - The primary signer (must be active admin)
|
|
79
|
+
* @param cosigners - Additional signers for quorum (each provides their own signature over the actions)
|
|
80
|
+
*/
|
|
81
|
+
appendGovernance(actions: IGovernanceAction[], primarySigner: ILedgerSigner, cosigners?: {
|
|
82
|
+
signer: ILedgerSigner;
|
|
83
|
+
signature: SignatureUint8Array;
|
|
84
|
+
}[]): Promise<Checksum>;
|
|
85
|
+
/** Get info about a specific signer. */
|
|
86
|
+
getSignerInfo(publicKey: Uint8Array): IAuthorizedSigner | undefined;
|
|
87
|
+
/** Get the full current authorized signer set. */
|
|
88
|
+
getAuthorizedSigners(): IAuthorizedSigner[];
|
|
52
89
|
/**
|
|
53
90
|
* Get entry by sequence number.
|
|
54
91
|
* @throws LedgerError if not found
|
|
@@ -63,6 +100,17 @@ export declare class Ledger {
|
|
|
63
100
|
* Get the most recent entry, or null if empty.
|
|
64
101
|
*/
|
|
65
102
|
getLatestEntry(): Promise<ILedgerEntry | null>;
|
|
103
|
+
/**
|
|
104
|
+
* Handle the genesis entry for a governance-enabled ledger.
|
|
105
|
+
* The payload must be a governance genesis payload containing the
|
|
106
|
+
* initial signer set and quorum policy.
|
|
107
|
+
*/
|
|
108
|
+
private appendGenesisEntry;
|
|
109
|
+
/**
|
|
110
|
+
* Internal append logic shared by regular and governance appends.
|
|
111
|
+
* Does NOT check authorization — callers must do that first.
|
|
112
|
+
*/
|
|
113
|
+
private appendInternal;
|
|
66
114
|
/**
|
|
67
115
|
* Compute the deterministic storage key for this ledger's metadata block.
|
|
68
116
|
* The key is SHA3-512("ledger-meta:" + ledgerId).
|
|
@@ -84,10 +132,6 @@ export declare class Ledger {
|
|
|
84
132
|
private serializeMetadata;
|
|
85
133
|
/**
|
|
86
134
|
* Persist the metadata block to the store under a deterministic key.
|
|
87
|
-
*
|
|
88
|
-
* Uses a LedgerMetadataBlock (validation-exempt RawDataBlock subclass)
|
|
89
|
-
* so the block can be stored at the deterministic checksum derived from
|
|
90
|
-
* the ledgerId, even though the content hash differs.
|
|
91
135
|
*/
|
|
92
136
|
private persistMetadata;
|
|
93
137
|
/**
|
|
@@ -98,9 +142,15 @@ export declare class Ledger {
|
|
|
98
142
|
* 3. If not found, return empty ledger
|
|
99
143
|
* 4. Parse metadata to get head checksum, length, and index
|
|
100
144
|
* 5. Restore headEntryHash by reading the head entry
|
|
101
|
-
* 6.
|
|
145
|
+
* 6. Replay governance entries to reconstruct AuthorizedSignerSet
|
|
146
|
+
* 7. Return populated ledger
|
|
147
|
+
*/
|
|
148
|
+
static load(store: IBlockStore, blockSize: BlockSize, serializer: LedgerEntrySerializer, ledgerId: string, governanceSerializer?: GovernancePayloadSerializer): Promise<Ledger>;
|
|
149
|
+
/**
|
|
150
|
+
* Replay all entries from genesis to head to reconstruct the
|
|
151
|
+
* AuthorizedSignerSet from governance entries.
|
|
102
152
|
*/
|
|
103
|
-
|
|
153
|
+
private replayGovernance;
|
|
104
154
|
/**
|
|
105
155
|
* Parse a metadata block's binary content.
|
|
106
156
|
*/
|