@brightchain/brightchain-lib 0.25.0 → 0.26.0
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 +45 -4
- package/src/lib/enumerations/brightChainStrings.d.ts +6 -0
- package/src/lib/enumerations/brightChainStrings.d.ts.map +1 -1
- package/src/lib/enumerations/brightChainStrings.js +7 -0
- package/src/lib/enumerations/brightChainStrings.js.map +1 -1
- package/src/lib/enumerations/messaging/index.d.ts +2 -0
- package/src/lib/enumerations/messaging/index.d.ts.map +1 -1
- package/src/lib/enumerations/messaging/index.js +2 -0
- package/src/lib/enumerations/messaging/index.js.map +1 -1
- package/src/lib/enumerations/messaging/outboundDeliveryStatus.d.ts +48 -0
- package/src/lib/enumerations/messaging/outboundDeliveryStatus.d.ts.map +1 -0
- package/src/lib/enumerations/messaging/outboundDeliveryStatus.js +70 -0
- package/src/lib/enumerations/messaging/outboundDeliveryStatus.js.map +1 -0
- package/src/lib/enumerations/messaging/spamClassification.d.ts +17 -0
- package/src/lib/enumerations/messaging/spamClassification.d.ts.map +1 -0
- package/src/lib/enumerations/messaging/spamClassification.js +21 -0
- package/src/lib/enumerations/messaging/spamClassification.js.map +1 -0
- package/src/lib/enumerations/proposalActionType.d.ts +2 -0
- package/src/lib/enumerations/proposalActionType.d.ts.map +1 -1
- package/src/lib/enumerations/proposalActionType.js +2 -0
- package/src/lib/enumerations/proposalActionType.js.map +1 -1
- package/src/lib/enumerations/quorumErrorType.d.ts +6 -0
- package/src/lib/enumerations/quorumErrorType.d.ts.map +1 -1
- package/src/lib/enumerations/quorumErrorType.js +7 -0
- package/src/lib/enumerations/quorumErrorType.js.map +1 -1
- package/src/lib/errors/quorumError.d.ts.map +1 -1
- package/src/lib/errors/quorumError.js +7 -0
- package/src/lib/errors/quorumError.js.map +1 -1
- package/src/lib/i18n/strings/englishUs.d.ts.map +1 -1
- package/src/lib/i18n/strings/englishUs.js +7 -0
- package/src/lib/i18n/strings/englishUs.js.map +1 -1
- package/src/lib/i18n/strings/french.d.ts.map +1 -1
- package/src/lib/i18n/strings/french.js +7 -0
- package/src/lib/i18n/strings/french.js.map +1 -1
- package/src/lib/i18n/strings/german.d.ts.map +1 -1
- package/src/lib/i18n/strings/german.js +7 -0
- package/src/lib/i18n/strings/german.js.map +1 -1
- package/src/lib/i18n/strings/japanese.d.ts.map +1 -1
- package/src/lib/i18n/strings/japanese.js +7 -0
- package/src/lib/i18n/strings/japanese.js.map +1 -1
- package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
- package/src/lib/i18n/strings/mandarin.js +7 -0
- package/src/lib/i18n/strings/mandarin.js.map +1 -1
- package/src/lib/i18n/strings/spanish.d.ts.map +1 -1
- package/src/lib/i18n/strings/spanish.js +7 -0
- package/src/lib/i18n/strings/spanish.js.map +1 -1
- package/src/lib/i18n/strings/ukrainian.d.ts.map +1 -1
- package/src/lib/i18n/strings/ukrainian.js +7 -0
- package/src/lib/i18n/strings/ukrainian.js.map +1 -1
- package/src/lib/interfaces/auditLogEntry.d.ts +1 -1
- package/src/lib/interfaces/auditLogEntry.d.ts.map +1 -1
- package/src/lib/interfaces/availability/gossipService.d.ts +8 -0
- package/src/lib/interfaces/availability/gossipService.d.ts.map +1 -1
- package/src/lib/interfaces/availability/gossipService.js.map +1 -1
- package/src/lib/interfaces/messaging/emailGateway.d.ts +197 -0
- package/src/lib/interfaces/messaging/emailGateway.d.ts.map +1 -0
- package/src/lib/interfaces/messaging/emailGateway.js +14 -0
- package/src/lib/interfaces/messaging/emailGateway.js.map +1 -0
- package/src/lib/interfaces/messaging/index.d.ts +1 -0
- package/src/lib/interfaces/messaging/index.d.ts.map +1 -1
- package/src/lib/interfaces/messaging/index.js +1 -0
- package/src/lib/interfaces/messaging/index.js.map +1 -1
- package/src/lib/interfaces/network/banConfig.d.ts +46 -0
- package/src/lib/interfaces/network/banConfig.d.ts.map +1 -0
- package/src/lib/interfaces/network/banConfig.js +42 -0
- package/src/lib/interfaces/network/banConfig.js.map +1 -0
- package/src/lib/interfaces/network/banListCache.d.ts +39 -0
- package/src/lib/interfaces/network/banListCache.d.ts.map +1 -0
- package/src/lib/interfaces/network/banListCache.js +12 -0
- package/src/lib/interfaces/network/banListCache.js.map +1 -0
- package/src/lib/interfaces/network/banRecord.d.ts +48 -0
- package/src/lib/interfaces/network/banRecord.d.ts.map +1 -0
- package/src/lib/interfaces/network/banRecord.js +12 -0
- package/src/lib/interfaces/network/banRecord.js.map +1 -0
- package/src/lib/interfaces/network/index.d.ts +4 -0
- package/src/lib/interfaces/network/index.d.ts.map +1 -1
- package/src/lib/interfaces/network/index.js +5 -0
- package/src/lib/interfaces/network/index.js.map +1 -1
- package/src/lib/interfaces/proposal.d.ts +7 -0
- package/src/lib/interfaces/proposal.d.ts.map +1 -1
- package/src/lib/interfaces/services/quorumDatabase.d.ts +30 -0
- package/src/lib/interfaces/services/quorumDatabase.d.ts.map +1 -1
- package/src/lib/interfaces/vote.d.ts +2 -0
- package/src/lib/interfaces/vote.d.ts.map +1 -1
- package/src/lib/services/banListCache.d.ts +49 -0
- package/src/lib/services/banListCache.d.ts.map +1 -0
- package/src/lib/services/banListCache.js +113 -0
- package/src/lib/services/banListCache.js.map +1 -0
- package/src/lib/services/banProposalValidator.d.ts +67 -0
- package/src/lib/services/banProposalValidator.d.ts.map +1 -0
- package/src/lib/services/banProposalValidator.js +134 -0
- package/src/lib/services/banProposalValidator.js.map +1 -0
- package/src/lib/services/messaging/emailMessageService.d.ts +38 -0
- package/src/lib/services/messaging/emailMessageService.d.ts.map +1 -1
- package/src/lib/services/messaging/emailMessageService.js +104 -22
- package/src/lib/services/messaging/emailMessageService.js.map +1 -1
- package/src/lib/services/quorumStateMachine.d.ts +28 -1
- package/src/lib/services/quorumStateMachine.d.ts.map +1 -1
- package/src/lib/services/quorumStateMachine.js +161 -2
- package/src/lib/services/quorumStateMachine.js.map +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview BanListCache interface for the network trust system.
|
|
3
|
+
*
|
|
4
|
+
* Each node maintains a local cache of the active ban list, updated via
|
|
5
|
+
* gossip announcements. Enforcement points (gossip, discovery, reconciliation,
|
|
6
|
+
* block store) check this cache with O(1) lookups.
|
|
7
|
+
*
|
|
8
|
+
* @see Network Trust and Ban Mechanism spec
|
|
9
|
+
*/
|
|
10
|
+
import { HexString, PlatformID } from '@digitaldefiance/ecies-lib';
|
|
11
|
+
import { IBanRecord } from './banRecord';
|
|
12
|
+
/**
|
|
13
|
+
* Interface for the local ban list cache.
|
|
14
|
+
* Implementations must provide O(1) lookup for isBanned().
|
|
15
|
+
*
|
|
16
|
+
* @template TID - Platform ID type
|
|
17
|
+
*/
|
|
18
|
+
export interface IBanListCache<TID extends PlatformID = Uint8Array> {
|
|
19
|
+
/** Check if a member is banned — must be O(1) */
|
|
20
|
+
isBanned(memberId: TID): boolean;
|
|
21
|
+
/** Add a verified ban record to the cache */
|
|
22
|
+
addBan(record: IBanRecord<TID>): void;
|
|
23
|
+
/** Remove a ban record (unban) */
|
|
24
|
+
removeBan(memberId: TID): void;
|
|
25
|
+
/** Get all active ban records */
|
|
26
|
+
getAll(): IBanRecord<TID>[];
|
|
27
|
+
/** Get a specific ban record by member ID, or null if not banned */
|
|
28
|
+
getBan(memberId: TID): IBanRecord<TID> | null;
|
|
29
|
+
/** Bulk load ban records (used on startup/reconnect sync) */
|
|
30
|
+
loadFrom(records: IBanRecord<TID>[]): void;
|
|
31
|
+
/** Number of currently banned members */
|
|
32
|
+
readonly size: number;
|
|
33
|
+
/**
|
|
34
|
+
* Verify a ban record's quorum signatures against known public keys.
|
|
35
|
+
* Returns true if the record has at least `requiredSignatures` valid signatures.
|
|
36
|
+
*/
|
|
37
|
+
verifySignatures(record: IBanRecord<TID>, quorumPublicKeys: Map<HexString, Uint8Array>): Promise<boolean>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=banListCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banListCache.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/banListCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAChE,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC;IAEjC,6CAA6C;IAC7C,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAEtC,kCAAkC;IAClC,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IAE/B,iCAAiC;IACjC,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAE5B,oEAAoE;IACpE,MAAM,CAAC,QAAQ,EAAE,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAE9C,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAE3C,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,gBAAgB,CACd,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,EACvB,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,GAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview BanListCache interface for the network trust system.
|
|
4
|
+
*
|
|
5
|
+
* Each node maintains a local cache of the active ban list, updated via
|
|
6
|
+
* gossip announcements. Enforcement points (gossip, discovery, reconciliation,
|
|
7
|
+
* block store) check this cache with O(1) lookups.
|
|
8
|
+
*
|
|
9
|
+
* @see Network Trust and Ban Mechanism spec
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=banListCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banListCache.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/banListCache.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Ban record interfaces for the network trust system.
|
|
3
|
+
*
|
|
4
|
+
* A BanRecord is created when a BAN_MEMBER proposal is approved by the quorum.
|
|
5
|
+
* It carries the quorum's threshold signatures so any node can independently
|
|
6
|
+
* verify the ban is legitimate.
|
|
7
|
+
*
|
|
8
|
+
* @see Network Trust and Ban Mechanism spec
|
|
9
|
+
*/
|
|
10
|
+
import { PlatformID } from '@digitaldefiance/ecies-lib';
|
|
11
|
+
/**
|
|
12
|
+
* A signed record indicating a member has been banned from the network.
|
|
13
|
+
*
|
|
14
|
+
* @template TID - Platform ID type for frontend/backend DTO compatibility
|
|
15
|
+
*/
|
|
16
|
+
export interface IBanRecord<TID extends PlatformID = Uint8Array> {
|
|
17
|
+
/** The banned member's ID */
|
|
18
|
+
memberId: TID;
|
|
19
|
+
/** Human-readable reason for the ban */
|
|
20
|
+
reason: string;
|
|
21
|
+
/** The proposal ID that resulted in this ban */
|
|
22
|
+
proposalId: TID;
|
|
23
|
+
/** Epoch number when the ban was enacted */
|
|
24
|
+
epoch: number;
|
|
25
|
+
/** Timestamp when the ban took effect */
|
|
26
|
+
bannedAt: Date;
|
|
27
|
+
/** Optional block IDs referencing evidence (offending content, logs, etc.) */
|
|
28
|
+
evidenceBlockIds?: string[];
|
|
29
|
+
/** Quorum signatures approving this ban */
|
|
30
|
+
approvalSignatures: Array<{
|
|
31
|
+
memberId: TID;
|
|
32
|
+
signature: Uint8Array;
|
|
33
|
+
}>;
|
|
34
|
+
/** The minimum number of signatures required for this ban to be valid */
|
|
35
|
+
requiredSignatures: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Lightweight ban list entry for quick lookups.
|
|
39
|
+
* Used by the BanListCache for efficient membership checks.
|
|
40
|
+
*
|
|
41
|
+
* @template TID - Platform ID type
|
|
42
|
+
*/
|
|
43
|
+
export interface IBanListEntry<TID extends PlatformID = Uint8Array> {
|
|
44
|
+
memberId: TID;
|
|
45
|
+
bannedAt: Date;
|
|
46
|
+
epoch: number;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=banRecord.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banRecord.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/banRecord.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,UAAU,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAC7D,6BAA6B;IAC7B,QAAQ,EAAE,GAAG,CAAC;IAEd,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf,gDAAgD;IAChD,UAAU,EAAE,GAAG,CAAC;IAEhB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IAEd,yCAAyC;IACzC,QAAQ,EAAE,IAAI,CAAC;IAEf,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B,2CAA2C;IAC3C,kBAAkB,EAAE,KAAK,CAAC;QACxB,QAAQ,EAAE,GAAG,CAAC;QACd,SAAS,EAAE,UAAU,CAAC;KACvB,CAAC,CAAC;IAEH,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAChE,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Ban record interfaces for the network trust system.
|
|
4
|
+
*
|
|
5
|
+
* A BanRecord is created when a BAN_MEMBER proposal is approved by the quorum.
|
|
6
|
+
* It carries the quorum's threshold signatures so any node can independently
|
|
7
|
+
* verify the ban is legitimate.
|
|
8
|
+
*
|
|
9
|
+
* @see Network Trust and Ban Mechanism spec
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=banRecord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banRecord.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/banRecord.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
export type * from './banConfig';
|
|
2
|
+
export type * from './banListCache';
|
|
3
|
+
export type * from './banRecord';
|
|
4
|
+
export { DEFAULT_BAN_CONFIG, MIN_BAN_CONFIG, normalizeBanConfig } from './banConfig';
|
|
1
5
|
export type * from './node';
|
|
2
6
|
export type * from './nodeAdvertisement';
|
|
3
7
|
export type * from './nodeConfig';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,cAAc,CAAC;AAClC,mBAAmB,aAAa,CAAC;AACjC,mBAAmB,gBAAgB,CAAC;AACpC,mBAAmB,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,aAAa,CAAC;AACjC,mBAAmB,gBAAgB,CAAC;AACpC,mBAAmB,aAAa,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrF,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,cAAc,CAAC;AAClC,mBAAmB,aAAa,CAAC;AACjC,mBAAmB,gBAAgB,CAAC;AACpC,mBAAmB,iBAAiB,CAAC"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeBanConfig = exports.MIN_BAN_CONFIG = exports.DEFAULT_BAN_CONFIG = void 0;
|
|
4
|
+
var banConfig_1 = require("./banConfig");
|
|
5
|
+
Object.defineProperty(exports, "DEFAULT_BAN_CONFIG", { enumerable: true, get: function () { return banConfig_1.DEFAULT_BAN_CONFIG; } });
|
|
6
|
+
Object.defineProperty(exports, "MIN_BAN_CONFIG", { enumerable: true, get: function () { return banConfig_1.MIN_BAN_CONFIG; } });
|
|
7
|
+
Object.defineProperty(exports, "normalizeBanConfig", { enumerable: true, get: function () { return banConfig_1.normalizeBanConfig; } });
|
|
3
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/network/index.ts"],"names":[],"mappings":";;;AAGA,yCAAqF;AAA5E,+GAAA,kBAAkB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,+GAAA,kBAAkB,OAAA"}
|
|
@@ -45,6 +45,13 @@ export interface Proposal<TID extends PlatformID = Uint8Array> {
|
|
|
45
45
|
attachmentCblId?: string;
|
|
46
46
|
/** Epoch number at proposal creation */
|
|
47
47
|
epochNumber: number;
|
|
48
|
+
/**
|
|
49
|
+
* Optional cooling period end timestamp.
|
|
50
|
+
* When set, the proposal cannot be executed until this time has passed,
|
|
51
|
+
* even if the vote threshold is reached early.
|
|
52
|
+
* Used by BAN_MEMBER and UNBAN_MEMBER proposals.
|
|
53
|
+
*/
|
|
54
|
+
coolingPeriodEndsAt?: Date;
|
|
48
55
|
}
|
|
49
56
|
/**
|
|
50
57
|
* Input format for submitting a new proposal.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/interfaces/proposal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,QAAQ,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAC3D,iCAAiC;IACjC,EAAE,EAAE,GAAG,CAAC;IACR,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,EAAE,kBAAkB,CAAC;IAC/B,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,kDAAkD;IAClD,gBAAgB,EAAE,GAAG,CAAC;IACtB,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,SAAS,EAAE,IAAI,CAAC;IAChB,qCAAqC;IACrC,SAAS,EAAE,IAAI,CAAC;IAChB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"proposal.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/interfaces/proposal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,QAAQ,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAC3D,iCAAiC;IACjC,EAAE,EAAE,GAAG,CAAC;IACR,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,EAAE,kBAAkB,CAAC;IAC/B,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,kDAAkD;IAClD,gBAAgB,EAAE,GAAG,CAAC;IACtB,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,SAAS,EAAE,IAAI,CAAC;IAChB,qCAAqC;IACrC,SAAS,EAAE,IAAI,CAAC;IAChB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,EAAE,kBAAkB,CAAC;IAC/B,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,iDAAiD;IACjD,SAAS,EAAE,IAAI,CAAC;IAChB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -21,6 +21,7 @@ import { RedistributionJournalEntry } from '../redistributionJournalEntry';
|
|
|
21
21
|
import { StatuteOfLimitationsConfig } from '../statuteConfig';
|
|
22
22
|
import { Vote } from '../vote';
|
|
23
23
|
import { IQuorumMember } from './quorumService';
|
|
24
|
+
import { IBanRecord } from '../network/banRecord';
|
|
24
25
|
/**
|
|
25
26
|
* Abstraction over BrightDb with a dedicated "quorum-system" pool.
|
|
26
27
|
*
|
|
@@ -203,5 +204,34 @@ export interface IQuorumDatabase<TID extends PlatformID = Uint8Array> {
|
|
|
203
204
|
* @returns True if the database is available and healthy
|
|
204
205
|
*/
|
|
205
206
|
isAvailable(): Promise<boolean>;
|
|
207
|
+
/**
|
|
208
|
+
* Persist a ban record.
|
|
209
|
+
* @param record - The ban record to save
|
|
210
|
+
*/
|
|
211
|
+
saveBanRecord(record: IBanRecord<TID>): Promise<void>;
|
|
212
|
+
/**
|
|
213
|
+
* Delete a ban record (used when unbanning a member).
|
|
214
|
+
* @param memberId - The banned member's ID
|
|
215
|
+
*/
|
|
216
|
+
deleteBanRecord(memberId: TID): Promise<void>;
|
|
217
|
+
/**
|
|
218
|
+
* Retrieve a ban record by member ID.
|
|
219
|
+
* @param memberId - The member ID
|
|
220
|
+
* @returns The ban record, or null if not banned
|
|
221
|
+
*/
|
|
222
|
+
getBanRecord(memberId: TID): Promise<IBanRecord<TID> | null>;
|
|
223
|
+
/**
|
|
224
|
+
* Get all active ban records.
|
|
225
|
+
* @returns Array of all active ban records
|
|
226
|
+
*/
|
|
227
|
+
getAllBanRecords(): Promise<IBanRecord<TID>[]>;
|
|
228
|
+
/**
|
|
229
|
+
* Get the member ID of whoever proposed the admission of a given member.
|
|
230
|
+
* Returns null if the member was a founding member (no proposer).
|
|
231
|
+
* Used by BanProposalValidator for Sybil protection.
|
|
232
|
+
* @param memberId - The member whose admission proposer to look up
|
|
233
|
+
* @returns The proposer's member ID, or null
|
|
234
|
+
*/
|
|
235
|
+
getMemberAdmissionProposerId(memberId: TID): Promise<TID | null>;
|
|
206
236
|
}
|
|
207
237
|
//# sourceMappingURL=quorumDatabase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quorumDatabase.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/services/quorumDatabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"quorumDatabase.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/services/quorumDatabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,8 @@ export interface Vote<TID extends PlatformID = Uint8Array> {
|
|
|
21
21
|
comment?: string;
|
|
22
22
|
/** ECIES-encrypted share to proposer's public key, present only on approve */
|
|
23
23
|
encryptedShare?: Uint8Array;
|
|
24
|
+
/** Digital signature of the vote for ban record attestation */
|
|
25
|
+
signature?: Uint8Array;
|
|
24
26
|
/** Timestamp of vote creation */
|
|
25
27
|
createdAt: Date;
|
|
26
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vote.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/interfaces/vote.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,IAAI,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IACvD,wCAAwC;IACxC,UAAU,EAAE,GAAG,CAAC;IAChB,8BAA8B;IAC9B,aAAa,EAAE,GAAG,CAAC;IACnB,oBAAoB;IACpB,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,iCAAiC;IACjC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAC5D,wCAAwC;IACxC,UAAU,EAAE,GAAG,CAAC;IAChB,yEAAyE;IACzE,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,oBAAoB;IACpB,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
1
|
+
{"version":3,"file":"vote.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/interfaces/vote.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,IAAI,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IACvD,wCAAwC;IACxC,UAAU,EAAE,GAAG,CAAC;IAChB,8BAA8B;IAC9B,aAAa,EAAE,GAAG,CAAC;IACnB,oBAAoB;IACpB,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,iCAAiC;IACjC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAC5D,wCAAwC;IACxC,UAAU,EAAE,GAAG,CAAC;IAChB,yEAAyE;IACzE,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,oBAAoB;IACpB,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview In-memory ban list cache.
|
|
3
|
+
*
|
|
4
|
+
* Each node maintains a local cache of active bans, updated via gossip.
|
|
5
|
+
* Enforcement points check isBanned() which is O(1) via a hex-keyed Map.
|
|
6
|
+
*
|
|
7
|
+
* @see Network Trust and Ban Mechanism spec, Requirements 4.3, 4.4, 5.6
|
|
8
|
+
*/
|
|
9
|
+
import { HexString, PlatformID, TypedIdProviderWrapper } from '@digitaldefiance/ecies-lib';
|
|
10
|
+
import { IBanListCache } from '../interfaces/network/banListCache';
|
|
11
|
+
import { IBanRecord } from '../interfaces/network/banRecord';
|
|
12
|
+
/**
|
|
13
|
+
* In-memory implementation of the ban list cache.
|
|
14
|
+
* Uses a Map keyed by hex-encoded member IDs for O(1) lookups.
|
|
15
|
+
*
|
|
16
|
+
* @template TID - Platform ID type
|
|
17
|
+
*/
|
|
18
|
+
export declare class BanListCache<TID extends PlatformID = Uint8Array> implements IBanListCache<TID> {
|
|
19
|
+
private readonly idProvider;
|
|
20
|
+
private readonly bannedMembers;
|
|
21
|
+
constructor(idProvider: TypedIdProviderWrapper<TID>);
|
|
22
|
+
private toHex;
|
|
23
|
+
isBanned(memberId: TID): boolean;
|
|
24
|
+
addBan(record: IBanRecord<TID>): void;
|
|
25
|
+
removeBan(memberId: TID): void;
|
|
26
|
+
getAll(): IBanRecord<TID>[];
|
|
27
|
+
getBan(memberId: TID): IBanRecord<TID> | null;
|
|
28
|
+
loadFrom(records: IBanRecord<TID>[]): void;
|
|
29
|
+
get size(): number;
|
|
30
|
+
/**
|
|
31
|
+
* Verify a ban record's quorum signatures.
|
|
32
|
+
*
|
|
33
|
+
* Checks that at least `record.requiredSignatures` of the attached
|
|
34
|
+
* signatures are valid against the provided quorum public keys.
|
|
35
|
+
* Uses ECDSA signature verification (secp256k1).
|
|
36
|
+
*
|
|
37
|
+
* @param record - The ban record to verify
|
|
38
|
+
* @param quorumPublicKeys - Map of hex member ID → public key bytes
|
|
39
|
+
* @returns true if enough valid signatures are present
|
|
40
|
+
*/
|
|
41
|
+
verifySignatures(record: IBanRecord<TID>, quorumPublicKeys: Map<HexString, Uint8Array>): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Verify an ECDSA signature using the Web Crypto API (browser-compatible)
|
|
44
|
+
* or Node.js crypto. This is a minimal implementation; production code
|
|
45
|
+
* should delegate to the existing ECIESService or NodeAuthenticator.
|
|
46
|
+
*/
|
|
47
|
+
private verifyEcdsaSignature;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=banListCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banListCache.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/services/banListCache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,SAAS,EACT,UAAU,EACV,sBAAsB,EAEvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D;;;;;GAKG;AACH,qBAAa,YAAY,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU,CAC3D,YAAW,aAAa,CAAC,GAAG,CAAC;IAK3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAH7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;gBAGpD,UAAU,EAAE,sBAAsB,CAAC,GAAG,CAAC;IAG1D,OAAO,CAAC,KAAK;IAIb,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO;IAIhC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI;IAIrC,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAI9B,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE;IAI3B,MAAM,CAAC,QAAQ,EAAE,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI;IAI7C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAO1C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;;OAUG;IACG,gBAAgB,CACpB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,EACvB,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,GAC3C,OAAO,CAAC,OAAO,CAAC;IA2CnB;;;;OAIG;YACW,oBAAoB;CA6BnC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview In-memory ban list cache.
|
|
4
|
+
*
|
|
5
|
+
* Each node maintains a local cache of active bans, updated via gossip.
|
|
6
|
+
* Enforcement points check isBanned() which is O(1) via a hex-keyed Map.
|
|
7
|
+
*
|
|
8
|
+
* @see Network Trust and Ban Mechanism spec, Requirements 4.3, 4.4, 5.6
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.BanListCache = void 0;
|
|
12
|
+
const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
|
|
13
|
+
/**
|
|
14
|
+
* In-memory implementation of the ban list cache.
|
|
15
|
+
* Uses a Map keyed by hex-encoded member IDs for O(1) lookups.
|
|
16
|
+
*
|
|
17
|
+
* @template TID - Platform ID type
|
|
18
|
+
*/
|
|
19
|
+
class BanListCache {
|
|
20
|
+
idProvider;
|
|
21
|
+
bannedMembers = new Map();
|
|
22
|
+
constructor(idProvider) {
|
|
23
|
+
this.idProvider = idProvider;
|
|
24
|
+
}
|
|
25
|
+
toHex(id) {
|
|
26
|
+
return this.idProvider.toString(id, 'hex');
|
|
27
|
+
}
|
|
28
|
+
isBanned(memberId) {
|
|
29
|
+
return this.bannedMembers.has(this.toHex(memberId));
|
|
30
|
+
}
|
|
31
|
+
addBan(record) {
|
|
32
|
+
this.bannedMembers.set(this.toHex(record.memberId), record);
|
|
33
|
+
}
|
|
34
|
+
removeBan(memberId) {
|
|
35
|
+
this.bannedMembers.delete(this.toHex(memberId));
|
|
36
|
+
}
|
|
37
|
+
getAll() {
|
|
38
|
+
return Array.from(this.bannedMembers.values());
|
|
39
|
+
}
|
|
40
|
+
getBan(memberId) {
|
|
41
|
+
return this.bannedMembers.get(this.toHex(memberId)) ?? null;
|
|
42
|
+
}
|
|
43
|
+
loadFrom(records) {
|
|
44
|
+
this.bannedMembers.clear();
|
|
45
|
+
for (const record of records) {
|
|
46
|
+
this.bannedMembers.set(this.toHex(record.memberId), record);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
get size() {
|
|
50
|
+
return this.bannedMembers.size;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Verify a ban record's quorum signatures.
|
|
54
|
+
*
|
|
55
|
+
* Checks that at least `record.requiredSignatures` of the attached
|
|
56
|
+
* signatures are valid against the provided quorum public keys.
|
|
57
|
+
* Uses ECDSA signature verification (secp256k1).
|
|
58
|
+
*
|
|
59
|
+
* @param record - The ban record to verify
|
|
60
|
+
* @param quorumPublicKeys - Map of hex member ID → public key bytes
|
|
61
|
+
* @returns true if enough valid signatures are present
|
|
62
|
+
*/
|
|
63
|
+
async verifySignatures(record, quorumPublicKeys) {
|
|
64
|
+
if (record.approvalSignatures.length < record.requiredSignatures) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
// Build the message that was signed: memberId + reason + epoch + bannedAt
|
|
68
|
+
const memberHex = this.toHex(record.memberId);
|
|
69
|
+
const message = new TextEncoder().encode(`ban:${memberHex}:${record.reason}:${record.epoch}:${record.bannedAt.toISOString()}`);
|
|
70
|
+
let validCount = 0;
|
|
71
|
+
for (const sig of record.approvalSignatures) {
|
|
72
|
+
const signerHex = (0, ecies_lib_1.uint8ArrayToHex)(this.idProvider.toBytes(sig.memberId));
|
|
73
|
+
const publicKey = quorumPublicKeys.get(signerHex);
|
|
74
|
+
if (!publicKey) {
|
|
75
|
+
// Unknown signer — skip
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const isValid = await this.verifyEcdsaSignature(message, sig.signature, publicKey);
|
|
80
|
+
if (isValid) {
|
|
81
|
+
validCount++;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Verification error — skip this signature
|
|
86
|
+
}
|
|
87
|
+
if (validCount >= record.requiredSignatures) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return validCount >= record.requiredSignatures;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Verify an ECDSA signature using the Web Crypto API (browser-compatible)
|
|
95
|
+
* or Node.js crypto. This is a minimal implementation; production code
|
|
96
|
+
* should delegate to the existing ECIESService or NodeAuthenticator.
|
|
97
|
+
*/
|
|
98
|
+
async verifyEcdsaSignature(message, signature, publicKey) {
|
|
99
|
+
// Use SubtleCrypto if available (browser + Node 20+)
|
|
100
|
+
if (typeof globalThis.crypto?.subtle !== 'undefined') {
|
|
101
|
+
const key = await globalThis.crypto.subtle.importKey('raw', new Uint8Array(publicKey), { name: 'ECDSA', namedCurve: 'P-256' }, false, ['verify']);
|
|
102
|
+
return globalThis.crypto.subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, key, new Uint8Array(signature), new Uint8Array(message));
|
|
103
|
+
}
|
|
104
|
+
// Fallback: assume Node.js crypto is available via dynamic import
|
|
105
|
+
// This path is used in Node.js environments where SubtleCrypto
|
|
106
|
+
// may not support secp256k1 directly.
|
|
107
|
+
// In practice, the QuorumStateMachine will use the existing
|
|
108
|
+
// ECIESService for signature verification rather than this fallback.
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.BanListCache = BanListCache;
|
|
113
|
+
//# sourceMappingURL=banListCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banListCache.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/services/banListCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Ban proposal validation with Sybil attack protections.
|
|
3
|
+
*
|
|
4
|
+
* Validates BAN_MEMBER proposals before submission and filters votes
|
|
5
|
+
* to prevent coordinated abuse of the ban mechanism.
|
|
6
|
+
*
|
|
7
|
+
* Two key protections:
|
|
8
|
+
* 1. Epoch restriction: members who joined in the current epoch cannot propose bans.
|
|
9
|
+
* 2. Proposer-ally restriction: members admitted by the ban proposer cannot vote on
|
|
10
|
+
* that proposer's ban proposals.
|
|
11
|
+
*
|
|
12
|
+
* @see Network Trust and Ban Mechanism spec, Requirements 1.6, 6.4, 6.5
|
|
13
|
+
*/
|
|
14
|
+
import { PlatformID, TypedIdProviderWrapper } from '@digitaldefiance/ecies-lib';
|
|
15
|
+
import { Proposal } from '../interfaces/proposal';
|
|
16
|
+
import { QuorumEpoch } from '../interfaces/quorumEpoch';
|
|
17
|
+
import { IQuorumMember } from '../interfaces/services/quorumService';
|
|
18
|
+
import { Vote } from '../interfaces/vote';
|
|
19
|
+
/**
|
|
20
|
+
* Provides the data needed by the validator to check admission history.
|
|
21
|
+
* Implemented by the quorum database.
|
|
22
|
+
*/
|
|
23
|
+
export interface IBanValidationDataProvider<TID extends PlatformID = Uint8Array> {
|
|
24
|
+
/** Get a member by ID */
|
|
25
|
+
getMember(memberId: TID): Promise<IQuorumMember<TID> | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Get the member ID of whoever proposed the admission of a given member.
|
|
28
|
+
* Returns null if the member was a founding member (no proposer).
|
|
29
|
+
*/
|
|
30
|
+
getMemberAdmissionProposerId(memberId: TID): Promise<TID | null>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validates BAN_MEMBER proposals and filters votes for Sybil protection.
|
|
34
|
+
*/
|
|
35
|
+
export declare class BanProposalValidator<TID extends PlatformID = Uint8Array> {
|
|
36
|
+
private readonly dataProvider;
|
|
37
|
+
private readonly idProvider;
|
|
38
|
+
constructor(dataProvider: IBanValidationDataProvider<TID>, idProvider: TypedIdProviderWrapper<TID>);
|
|
39
|
+
private idsEqual;
|
|
40
|
+
/**
|
|
41
|
+
* Validate a BAN_MEMBER proposal before submission.
|
|
42
|
+
*
|
|
43
|
+
* Checks:
|
|
44
|
+
* 1. Proposer is not banning themselves
|
|
45
|
+
* 2. Target member exists and is not already banned
|
|
46
|
+
* 3. Proposer did not join in the current epoch (Sybil protection)
|
|
47
|
+
*
|
|
48
|
+
* @param proposerId - The member submitting the proposal
|
|
49
|
+
* @param targetMemberId - The member to be banned
|
|
50
|
+
* @param currentEpoch - The current quorum epoch
|
|
51
|
+
* @throws QuorumError if validation fails
|
|
52
|
+
*/
|
|
53
|
+
validateBanProposal(proposerId: TID, targetMemberId: TID, currentEpoch: QuorumEpoch<TID>): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Filter votes on a BAN_MEMBER proposal to exclude proposer-ally votes.
|
|
56
|
+
*
|
|
57
|
+
* A vote is excluded if the voter was admitted to the quorum by the same
|
|
58
|
+
* member who submitted the ban proposal. This prevents a single member
|
|
59
|
+
* from admitting allies and immediately using their votes to ban others.
|
|
60
|
+
*
|
|
61
|
+
* @param proposal - The BAN_MEMBER proposal
|
|
62
|
+
* @param votes - All votes cast on the proposal
|
|
63
|
+
* @returns Filtered votes with proposer-ally votes removed
|
|
64
|
+
*/
|
|
65
|
+
filterVotes(proposal: Proposal<TID>, votes: Vote<TID>[]): Promise<Vote<TID>[]>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=banProposalValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banProposalValidator.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/services/banProposalValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAEL,UAAU,EACV,sBAAsB,EACvB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,0BAA0B,CACzC,GAAG,SAAS,UAAU,GAAG,UAAU;IAEnC,yBAAyB;IACzB,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAE7D;;;OAGG;IACH,4BAA4B,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CAClE;AAED;;GAEG;AACH,qBAAa,oBAAoB,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAEjE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,YAAY,EAAE,0BAA0B,CAAC,GAAG,CAAC,EAC7C,UAAU,EAAE,sBAAsB,CAAC,GAAG,CAAC;IAG1D,OAAO,CAAC,QAAQ;IAUhB;;;;;;;;;;;;OAYG;IACG,mBAAmB,CACvB,UAAU,EAAE,GAAG,EACf,cAAc,EAAE,GAAG,EACnB,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IA+DhB;;;;;;;;;;OAUG;IACG,WAAW,CACf,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,EACvB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;CA6BxB"}
|