@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.
Files changed (100) hide show
  1. package/package.json +45 -4
  2. package/src/lib/enumerations/brightChainStrings.d.ts +6 -0
  3. package/src/lib/enumerations/brightChainStrings.d.ts.map +1 -1
  4. package/src/lib/enumerations/brightChainStrings.js +7 -0
  5. package/src/lib/enumerations/brightChainStrings.js.map +1 -1
  6. package/src/lib/enumerations/messaging/index.d.ts +2 -0
  7. package/src/lib/enumerations/messaging/index.d.ts.map +1 -1
  8. package/src/lib/enumerations/messaging/index.js +2 -0
  9. package/src/lib/enumerations/messaging/index.js.map +1 -1
  10. package/src/lib/enumerations/messaging/outboundDeliveryStatus.d.ts +48 -0
  11. package/src/lib/enumerations/messaging/outboundDeliveryStatus.d.ts.map +1 -0
  12. package/src/lib/enumerations/messaging/outboundDeliveryStatus.js +70 -0
  13. package/src/lib/enumerations/messaging/outboundDeliveryStatus.js.map +1 -0
  14. package/src/lib/enumerations/messaging/spamClassification.d.ts +17 -0
  15. package/src/lib/enumerations/messaging/spamClassification.d.ts.map +1 -0
  16. package/src/lib/enumerations/messaging/spamClassification.js +21 -0
  17. package/src/lib/enumerations/messaging/spamClassification.js.map +1 -0
  18. package/src/lib/enumerations/proposalActionType.d.ts +2 -0
  19. package/src/lib/enumerations/proposalActionType.d.ts.map +1 -1
  20. package/src/lib/enumerations/proposalActionType.js +2 -0
  21. package/src/lib/enumerations/proposalActionType.js.map +1 -1
  22. package/src/lib/enumerations/quorumErrorType.d.ts +6 -0
  23. package/src/lib/enumerations/quorumErrorType.d.ts.map +1 -1
  24. package/src/lib/enumerations/quorumErrorType.js +7 -0
  25. package/src/lib/enumerations/quorumErrorType.js.map +1 -1
  26. package/src/lib/errors/quorumError.d.ts.map +1 -1
  27. package/src/lib/errors/quorumError.js +7 -0
  28. package/src/lib/errors/quorumError.js.map +1 -1
  29. package/src/lib/i18n/strings/englishUs.d.ts.map +1 -1
  30. package/src/lib/i18n/strings/englishUs.js +7 -0
  31. package/src/lib/i18n/strings/englishUs.js.map +1 -1
  32. package/src/lib/i18n/strings/french.d.ts.map +1 -1
  33. package/src/lib/i18n/strings/french.js +7 -0
  34. package/src/lib/i18n/strings/french.js.map +1 -1
  35. package/src/lib/i18n/strings/german.d.ts.map +1 -1
  36. package/src/lib/i18n/strings/german.js +7 -0
  37. package/src/lib/i18n/strings/german.js.map +1 -1
  38. package/src/lib/i18n/strings/japanese.d.ts.map +1 -1
  39. package/src/lib/i18n/strings/japanese.js +7 -0
  40. package/src/lib/i18n/strings/japanese.js.map +1 -1
  41. package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
  42. package/src/lib/i18n/strings/mandarin.js +7 -0
  43. package/src/lib/i18n/strings/mandarin.js.map +1 -1
  44. package/src/lib/i18n/strings/spanish.d.ts.map +1 -1
  45. package/src/lib/i18n/strings/spanish.js +7 -0
  46. package/src/lib/i18n/strings/spanish.js.map +1 -1
  47. package/src/lib/i18n/strings/ukrainian.d.ts.map +1 -1
  48. package/src/lib/i18n/strings/ukrainian.js +7 -0
  49. package/src/lib/i18n/strings/ukrainian.js.map +1 -1
  50. package/src/lib/interfaces/auditLogEntry.d.ts +1 -1
  51. package/src/lib/interfaces/auditLogEntry.d.ts.map +1 -1
  52. package/src/lib/interfaces/availability/gossipService.d.ts +8 -0
  53. package/src/lib/interfaces/availability/gossipService.d.ts.map +1 -1
  54. package/src/lib/interfaces/availability/gossipService.js.map +1 -1
  55. package/src/lib/interfaces/messaging/emailGateway.d.ts +197 -0
  56. package/src/lib/interfaces/messaging/emailGateway.d.ts.map +1 -0
  57. package/src/lib/interfaces/messaging/emailGateway.js +14 -0
  58. package/src/lib/interfaces/messaging/emailGateway.js.map +1 -0
  59. package/src/lib/interfaces/messaging/index.d.ts +1 -0
  60. package/src/lib/interfaces/messaging/index.d.ts.map +1 -1
  61. package/src/lib/interfaces/messaging/index.js +1 -0
  62. package/src/lib/interfaces/messaging/index.js.map +1 -1
  63. package/src/lib/interfaces/network/banConfig.d.ts +46 -0
  64. package/src/lib/interfaces/network/banConfig.d.ts.map +1 -0
  65. package/src/lib/interfaces/network/banConfig.js +42 -0
  66. package/src/lib/interfaces/network/banConfig.js.map +1 -0
  67. package/src/lib/interfaces/network/banListCache.d.ts +39 -0
  68. package/src/lib/interfaces/network/banListCache.d.ts.map +1 -0
  69. package/src/lib/interfaces/network/banListCache.js +12 -0
  70. package/src/lib/interfaces/network/banListCache.js.map +1 -0
  71. package/src/lib/interfaces/network/banRecord.d.ts +48 -0
  72. package/src/lib/interfaces/network/banRecord.d.ts.map +1 -0
  73. package/src/lib/interfaces/network/banRecord.js +12 -0
  74. package/src/lib/interfaces/network/banRecord.js.map +1 -0
  75. package/src/lib/interfaces/network/index.d.ts +4 -0
  76. package/src/lib/interfaces/network/index.d.ts.map +1 -1
  77. package/src/lib/interfaces/network/index.js +5 -0
  78. package/src/lib/interfaces/network/index.js.map +1 -1
  79. package/src/lib/interfaces/proposal.d.ts +7 -0
  80. package/src/lib/interfaces/proposal.d.ts.map +1 -1
  81. package/src/lib/interfaces/services/quorumDatabase.d.ts +30 -0
  82. package/src/lib/interfaces/services/quorumDatabase.d.ts.map +1 -1
  83. package/src/lib/interfaces/vote.d.ts +2 -0
  84. package/src/lib/interfaces/vote.d.ts.map +1 -1
  85. package/src/lib/services/banListCache.d.ts +49 -0
  86. package/src/lib/services/banListCache.d.ts.map +1 -0
  87. package/src/lib/services/banListCache.js +113 -0
  88. package/src/lib/services/banListCache.js.map +1 -0
  89. package/src/lib/services/banProposalValidator.d.ts +67 -0
  90. package/src/lib/services/banProposalValidator.d.ts.map +1 -0
  91. package/src/lib/services/banProposalValidator.js +134 -0
  92. package/src/lib/services/banProposalValidator.js.map +1 -0
  93. package/src/lib/services/messaging/emailMessageService.d.ts +38 -0
  94. package/src/lib/services/messaging/emailMessageService.d.ts.map +1 -1
  95. package/src/lib/services/messaging/emailMessageService.js +104 -22
  96. package/src/lib/services/messaging/emailMessageService.js.map +1 -1
  97. package/src/lib/services/quorumStateMachine.d.ts +28 -1
  98. package/src/lib/services/quorumStateMachine.d.ts.map +1 -1
  99. package/src/lib/services/quorumStateMachine.js +161 -2
  100. 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;CACrB;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"}
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":"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"}
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"}