@mainsail/consensus 0.0.1-alpha.1

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 (62) hide show
  1. package/LICENSE +623 -0
  2. package/distribution/aggregator.d.ts +11 -0
  3. package/distribution/aggregator.d.ts.map +1 -0
  4. package/distribution/aggregator.js +58 -0
  5. package/distribution/aggregator.js.map +1 -0
  6. package/distribution/bootstrapper.d.ts +8 -0
  7. package/distribution/bootstrapper.d.ts.map +1 -0
  8. package/distribution/bootstrapper.js +68 -0
  9. package/distribution/bootstrapper.js.map +1 -0
  10. package/distribution/commit-state.d.ts +19 -0
  11. package/distribution/commit-state.d.ts.map +1 -0
  12. package/distribution/commit-state.js +102 -0
  13. package/distribution/commit-state.js.map +1 -0
  14. package/distribution/consensus.d.ts +45 -0
  15. package/distribution/consensus.d.ts.map +1 -0
  16. package/distribution/consensus.js +445 -0
  17. package/distribution/consensus.js.map +1 -0
  18. package/distribution/index.d.ts +6 -0
  19. package/distribution/index.d.ts.map +1 -0
  20. package/distribution/index.js +59 -0
  21. package/distribution/index.js.map +1 -0
  22. package/distribution/processors/abstract-processor.d.ts +16 -0
  23. package/distribution/processors/abstract-processor.d.ts.map +1 -0
  24. package/distribution/processors/abstract-processor.js +52 -0
  25. package/distribution/processors/abstract-processor.js.map +1 -0
  26. package/distribution/processors/commit-processor.d.ts +14 -0
  27. package/distribution/processors/commit-processor.d.ts.map +1 -0
  28. package/distribution/processors/commit-processor.js +103 -0
  29. package/distribution/processors/commit-processor.js.map +1 -0
  30. package/distribution/processors/index.d.ts +5 -0
  31. package/distribution/processors/index.d.ts.map +1 -0
  32. package/distribution/processors/index.js +21 -0
  33. package/distribution/processors/index.js.map +1 -0
  34. package/distribution/processors/precommit-processor.d.ts +12 -0
  35. package/distribution/processors/precommit-processor.d.ts.map +1 -0
  36. package/distribution/processors/precommit-processor.js +81 -0
  37. package/distribution/processors/precommit-processor.js.map +1 -0
  38. package/distribution/processors/prevote-processor.d.ts +12 -0
  39. package/distribution/processors/prevote-processor.d.ts.map +1 -0
  40. package/distribution/processors/prevote-processor.js +81 -0
  41. package/distribution/processors/prevote-processor.js.map +1 -0
  42. package/distribution/processors/proposal-processor.d.ts +16 -0
  43. package/distribution/processors/proposal-processor.d.ts.map +1 -0
  44. package/distribution/processors/proposal-processor.js +148 -0
  45. package/distribution/processors/proposal-processor.js.map +1 -0
  46. package/distribution/round-state-repository.d.ts +9 -0
  47. package/distribution/round-state-repository.d.ts.map +1 -0
  48. package/distribution/round-state-repository.js +54 -0
  49. package/distribution/round-state-repository.js.map +1 -0
  50. package/distribution/round-state.d.ts +49 -0
  51. package/distribution/round-state.d.ts.map +1 -0
  52. package/distribution/round-state.js +315 -0
  53. package/distribution/round-state.js.map +1 -0
  54. package/distribution/scheduler.d.ts +13 -0
  55. package/distribution/scheduler.d.ts.map +1 -0
  56. package/distribution/scheduler.js +125 -0
  57. package/distribution/scheduler.js.map +1 -0
  58. package/distribution/storage.d.ts +19 -0
  59. package/distribution/storage.d.ts.map +1 -0
  60. package/distribution/storage.js +114 -0
  61. package/distribution/storage.js.map +1 -0
  62. package/package.json +41 -0
@@ -0,0 +1,14 @@
1
+ import { Contracts } from "@mainsail/contracts";
2
+ import { AbstractProcessor } from "./abstract-processor";
3
+ export declare class CommitProcessor extends AbstractProcessor implements Contracts.Consensus.CommitProcessor {
4
+ #private;
5
+ private readonly configuration;
6
+ private readonly processor;
7
+ private readonly validatorSet;
8
+ private readonly serializer;
9
+ private readonly aggregator;
10
+ private readonly commitStateFactory;
11
+ process(commit: Contracts.Crypto.Commit): Promise<Contracts.Consensus.ProcessorResult>;
12
+ hasValidSignature(commit: Contracts.Crypto.Commit): Promise<boolean>;
13
+ }
14
+ //# sourceMappingURL=commit-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-processor.d.ts","sourceRoot":"","sources":["../../source/processors/commit-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBACa,eAAgB,SAAQ,iBAAkB,YAAW,SAAS,CAAC,SAAS,CAAC,eAAe;;IAEpG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAGhE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAGhE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAG/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IAGjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAG7D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA0C;IAEvE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC;IA6BtF,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CA+B1E"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _CommitProcessor_instances, _CommitProcessor_hasValidHeight;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.CommitProcessor = void 0;
19
+ const container_1 = require("@mainsail/container");
20
+ const contracts_1 = require("@mainsail/contracts");
21
+ const kernel_1 = require("@mainsail/kernel");
22
+ const abstract_processor_1 = require("./abstract-processor");
23
+ let CommitProcessor = class CommitProcessor extends abstract_processor_1.AbstractProcessor {
24
+ constructor() {
25
+ super(...arguments);
26
+ _CommitProcessor_instances.add(this);
27
+ }
28
+ async process(commit) {
29
+ let promise;
30
+ const result = await this.commitLock.runNonExclusive(async () => {
31
+ if (!__classPrivateFieldGet(this, _CommitProcessor_instances, "m", _CommitProcessor_hasValidHeight).call(this, commit)) {
32
+ return contracts_1.Contracts.Consensus.ProcessorResult.Skipped;
33
+ }
34
+ const commitState = this.commitStateFactory(commit);
35
+ const result = await this.processor.process(commitState);
36
+ if (result === false) {
37
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
38
+ }
39
+ commitState.setProcessorResult(result);
40
+ promise = this.getConsensus().handleCommitState(commitState);
41
+ return contracts_1.Contracts.Consensus.ProcessorResult.Accepted;
42
+ });
43
+ // Execute outside the lock, to avoid deadlocks.
44
+ // We want to make sure that the block is handled before we return the result to block downloader. This is different from the other processors.
45
+ await promise;
46
+ return result;
47
+ }
48
+ async hasValidSignature(commit) {
49
+ const { proof, block } = commit;
50
+ const publicKeys = [];
51
+ for (const [index, validator] of proof.validators.entries()) {
52
+ if (!validator) {
53
+ continue;
54
+ }
55
+ const validatorPublicKey = this.validatorSet.getValidator(index).getConsensusPublicKey();
56
+ publicKeys.push(Buffer.from(validatorPublicKey, "hex"));
57
+ }
58
+ const { activeValidators } = this.configuration.getMilestone(block.header.height);
59
+ if (!kernel_1.Utils.isMajority(publicKeys.length, activeValidators)) {
60
+ return false;
61
+ }
62
+ const precommit = await this.serializer.serializePrecommitForSignature({
63
+ blockId: block.data.id,
64
+ height: block.data.height,
65
+ round: proof.round,
66
+ type: contracts_1.Contracts.Crypto.MessageType.Precommit,
67
+ });
68
+ return this.aggregator.verify(proof, precommit, activeValidators);
69
+ }
70
+ };
71
+ exports.CommitProcessor = CommitProcessor;
72
+ _CommitProcessor_instances = new WeakSet();
73
+ _CommitProcessor_hasValidHeight = function _CommitProcessor_hasValidHeight(commit) {
74
+ return commit.block.data.height === this.getConsensus().getHeight();
75
+ };
76
+ __decorate([
77
+ (0, container_1.inject)(contracts_1.Identifiers.Cryptography.Configuration),
78
+ __metadata("design:type", Object)
79
+ ], CommitProcessor.prototype, "configuration", void 0);
80
+ __decorate([
81
+ (0, container_1.inject)(contracts_1.Identifiers.Processor.BlockProcessor),
82
+ __metadata("design:type", Object)
83
+ ], CommitProcessor.prototype, "processor", void 0);
84
+ __decorate([
85
+ (0, container_1.inject)(contracts_1.Identifiers.ValidatorSet.Service),
86
+ __metadata("design:type", Object)
87
+ ], CommitProcessor.prototype, "validatorSet", void 0);
88
+ __decorate([
89
+ (0, container_1.inject)(contracts_1.Identifiers.Cryptography.Message.Serializer),
90
+ __metadata("design:type", Object)
91
+ ], CommitProcessor.prototype, "serializer", void 0);
92
+ __decorate([
93
+ (0, container_1.inject)(contracts_1.Identifiers.Consensus.Aggregator),
94
+ __metadata("design:type", Object)
95
+ ], CommitProcessor.prototype, "aggregator", void 0);
96
+ __decorate([
97
+ (0, container_1.inject)(contracts_1.Identifiers.Consensus.CommitState.Factory),
98
+ __metadata("design:type", Function)
99
+ ], CommitProcessor.prototype, "commitStateFactory", void 0);
100
+ exports.CommitProcessor = CommitProcessor = __decorate([
101
+ (0, container_1.injectable)()
102
+ ], CommitProcessor);
103
+ //# sourceMappingURL=commit-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-processor.js","sourceRoot":"","sources":["../../source/processors/commit-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./commit-processor";
2
+ export * from "./precommit-processor";
3
+ export * from "./prevote-processor";
4
+ export * from "./proposal-processor";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/processors/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./commit-processor"), exports);
18
+ __exportStar(require("./precommit-processor"), exports);
19
+ __exportStar(require("./prevote-processor"), exports);
20
+ __exportStar(require("./proposal-processor"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/processors/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,wDAAsC;AACtC,sDAAoC;AACpC,uDAAqC"}
@@ -0,0 +1,12 @@
1
+ import { Contracts } from "@mainsail/contracts";
2
+ import { AbstractProcessor } from "./abstract-processor";
3
+ export declare class PrecommitProcessor extends AbstractProcessor implements Contracts.Consensus.PrecommitProcessor {
4
+ #private;
5
+ private readonly serializer;
6
+ private readonly validatorSet;
7
+ private readonly roundStateRepo;
8
+ private readonly broadcaster;
9
+ private readonly workerPool;
10
+ process(precommit: Contracts.Crypto.Precommit, broadcast?: boolean): Promise<Contracts.Consensus.ProcessorResult>;
11
+ }
12
+ //# sourceMappingURL=precommit-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precommit-processor.d.ts","sourceRoot":"","sources":["../../source/processors/precommit-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBACa,kBAAmB,SAAQ,iBAAkB,YAAW,SAAS,CAAC,SAAS,CAAC,kBAAkB;;IAE1G,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IAGjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAG/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAG3E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAGzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IAE7C,OAAO,CACZ,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,EACrC,SAAS,UAAO,GACd,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC;CAwC/C"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _PrecommitProcessor_instances, _PrecommitProcessor_hasValidSignature;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.PrecommitProcessor = void 0;
19
+ const container_1 = require("@mainsail/container");
20
+ const contracts_1 = require("@mainsail/contracts");
21
+ const kernel_1 = require("@mainsail/kernel");
22
+ const abstract_processor_1 = require("./abstract-processor");
23
+ let PrecommitProcessor = class PrecommitProcessor extends abstract_processor_1.AbstractProcessor {
24
+ constructor() {
25
+ super(...arguments);
26
+ _PrecommitProcessor_instances.add(this);
27
+ }
28
+ async process(precommit, broadcast = true) {
29
+ return this.commitLock.runNonExclusive(async () => {
30
+ if (!this.hasValidHeightOrRound(precommit)) {
31
+ return contracts_1.Contracts.Consensus.ProcessorResult.Skipped;
32
+ }
33
+ if (!this.isRoundInBounds(precommit)) {
34
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
35
+ }
36
+ if (!(await __classPrivateFieldGet(this, _PrecommitProcessor_instances, "m", _PrecommitProcessor_hasValidSignature).call(this, precommit))) {
37
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
38
+ }
39
+ const roundState = this.roundStateRepo.getRoundState(precommit.height, precommit.round);
40
+ if (roundState.hasPrecommit(precommit.validatorIndex)) {
41
+ return contracts_1.Contracts.Consensus.ProcessorResult.Skipped;
42
+ }
43
+ roundState.addPrecommit(precommit);
44
+ if (broadcast) {
45
+ void this.broadcaster.broadcastPrecommit(precommit);
46
+ }
47
+ void this.getConsensus().handle(roundState);
48
+ return contracts_1.Contracts.Consensus.ProcessorResult.Accepted;
49
+ });
50
+ }
51
+ };
52
+ exports.PrecommitProcessor = PrecommitProcessor;
53
+ _PrecommitProcessor_instances = new WeakSet();
54
+ _PrecommitProcessor_hasValidSignature = async function _PrecommitProcessor_hasValidSignature(precommit) {
55
+ const worker = await this.workerPool.getWorker();
56
+ return worker.consensusSignature("verify", Buffer.from(precommit.signature, "hex"), await this.serializer.serializePrecommitForSignature(precommit), Buffer.from(this.validatorSet.getValidator(precommit.validatorIndex).getConsensusPublicKey(), "hex"));
57
+ };
58
+ __decorate([
59
+ (0, container_1.inject)(contracts_1.Identifiers.Cryptography.Message.Serializer),
60
+ __metadata("design:type", Object)
61
+ ], PrecommitProcessor.prototype, "serializer", void 0);
62
+ __decorate([
63
+ (0, container_1.inject)(contracts_1.Identifiers.ValidatorSet.Service),
64
+ __metadata("design:type", Object)
65
+ ], PrecommitProcessor.prototype, "validatorSet", void 0);
66
+ __decorate([
67
+ (0, container_1.inject)(contracts_1.Identifiers.Consensus.RoundStateRepository),
68
+ __metadata("design:type", Object)
69
+ ], PrecommitProcessor.prototype, "roundStateRepo", void 0);
70
+ __decorate([
71
+ (0, container_1.inject)(contracts_1.Identifiers.P2P.Broadcaster),
72
+ __metadata("design:type", Object)
73
+ ], PrecommitProcessor.prototype, "broadcaster", void 0);
74
+ __decorate([
75
+ (0, container_1.inject)(contracts_1.Identifiers.CryptoWorker.WorkerPool),
76
+ __metadata("design:type", Object)
77
+ ], PrecommitProcessor.prototype, "workerPool", void 0);
78
+ exports.PrecommitProcessor = PrecommitProcessor = __decorate([
79
+ (0, container_1.injectable)()
80
+ ], PrecommitProcessor);
81
+ //# sourceMappingURL=precommit-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precommit-processor.js","sourceRoot":"","sources":["../../source/processors/precommit-processor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,mDAAyD;AACzD,mDAA6D;AAC7D,6CAA6C;AAE7C,6DAAyD;AAGlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,sCAAiB;IAAlD;;;IA2DP,CAAC;IA3CA,KAAK,CAAC,OAAO,CACZ,SAAqC,EACrC,SAAS,GAAG,IAAI;QAEhB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE;YACjD,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5C,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,CAAC,MAAM,uBAAA,IAAI,4EAAmB,MAAvB,IAAI,EAAoB,SAAS,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YACxF,IAAI,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvD,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAEnC,IAAI,SAAS,EAAE,CAAC;gBACf,KAAK,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACrD,CAAC;YAED,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAE5C,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC;QACrD,CAAC,CAAC,CAAC;IACJ,CAAC;CAWD,CAAA;AA3DY,gDAAkB;;wCAkD9B,KAAK,gDAAoB,SAAqC;IAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;IACjD,OAAO,MAAM,CAAC,kBAAkB,CAC/B,QAAQ,EACR,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,EACvC,MAAM,IAAI,CAAC,UAAU,CAAC,8BAA8B,CAAC,SAAS,CAAC,EAC/D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,qBAAqB,EAAE,EAAE,KAAK,CAAC,CACpG,CAAC;AACH,CAAC;AAxDgB;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;;sDACa;AAGhD;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,YAAY,CAAC,OAAO,CAAC;;wDACsB;AAG9C;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,SAAS,CAAC,oBAAoB,CAAC;;0DACwB;AAG1D;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,GAAG,CAAC,WAAW,CAAC;;uDACqB;AAGxC;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,YAAY,CAAC,UAAU,CAAC;;sDACO;6BAdvC,kBAAkB;IAD9B,IAAA,sBAAU,GAAE;GACA,kBAAkB,CA2D9B"}
@@ -0,0 +1,12 @@
1
+ import { Contracts } from "@mainsail/contracts";
2
+ import { AbstractProcessor } from "./abstract-processor";
3
+ export declare class PrevoteProcessor extends AbstractProcessor implements Contracts.Consensus.PrevoteProcessor {
4
+ #private;
5
+ private readonly serializer;
6
+ private readonly validatorSet;
7
+ private readonly roundStateRepo;
8
+ private readonly broadcaster;
9
+ private readonly workerPool;
10
+ process(prevote: Contracts.Crypto.Prevote, broadcast?: boolean): Promise<Contracts.Consensus.ProcessorResult>;
11
+ }
12
+ //# sourceMappingURL=prevote-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prevote-processor.d.ts","sourceRoot":"","sources":["../../source/processors/prevote-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBACa,gBAAiB,SAAQ,iBAAkB,YAAW,SAAS,CAAC,SAAS,CAAC,gBAAgB;;IAEtG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IAGjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAG/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAG3E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAGzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IAE7C,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,UAAO,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC;CAwChH"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _PrevoteProcessor_instances, _PrevoteProcessor_hasValidSignature;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.PrevoteProcessor = void 0;
19
+ const container_1 = require("@mainsail/container");
20
+ const contracts_1 = require("@mainsail/contracts");
21
+ const kernel_1 = require("@mainsail/kernel");
22
+ const abstract_processor_1 = require("./abstract-processor");
23
+ let PrevoteProcessor = class PrevoteProcessor extends abstract_processor_1.AbstractProcessor {
24
+ constructor() {
25
+ super(...arguments);
26
+ _PrevoteProcessor_instances.add(this);
27
+ }
28
+ async process(prevote, broadcast = true) {
29
+ return this.commitLock.runNonExclusive(async () => {
30
+ if (!this.hasValidHeightOrRound(prevote)) {
31
+ return contracts_1.Contracts.Consensus.ProcessorResult.Skipped;
32
+ }
33
+ if (!this.isRoundInBounds(prevote)) {
34
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
35
+ }
36
+ if (!(await __classPrivateFieldGet(this, _PrevoteProcessor_instances, "m", _PrevoteProcessor_hasValidSignature).call(this, prevote))) {
37
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
38
+ }
39
+ const roundState = this.roundStateRepo.getRoundState(prevote.height, prevote.round);
40
+ if (roundState.hasPrevote(prevote.validatorIndex)) {
41
+ return contracts_1.Contracts.Consensus.ProcessorResult.Skipped;
42
+ }
43
+ roundState.addPrevote(prevote);
44
+ if (broadcast) {
45
+ void this.broadcaster.broadcastPrevote(prevote);
46
+ }
47
+ void this.getConsensus().handle(roundState);
48
+ return contracts_1.Contracts.Consensus.ProcessorResult.Accepted;
49
+ });
50
+ }
51
+ };
52
+ exports.PrevoteProcessor = PrevoteProcessor;
53
+ _PrevoteProcessor_instances = new WeakSet();
54
+ _PrevoteProcessor_hasValidSignature = async function _PrevoteProcessor_hasValidSignature(prevote) {
55
+ const worker = await this.workerPool.getWorker();
56
+ return worker.consensusSignature("verify", Buffer.from(prevote.signature, "hex"), await this.serializer.serializePrevoteForSignature(prevote), Buffer.from(this.validatorSet.getValidator(prevote.validatorIndex).getConsensusPublicKey(), "hex"));
57
+ };
58
+ __decorate([
59
+ (0, container_1.inject)(contracts_1.Identifiers.Cryptography.Message.Serializer),
60
+ __metadata("design:type", Object)
61
+ ], PrevoteProcessor.prototype, "serializer", void 0);
62
+ __decorate([
63
+ (0, container_1.inject)(contracts_1.Identifiers.ValidatorSet.Service),
64
+ __metadata("design:type", Object)
65
+ ], PrevoteProcessor.prototype, "validatorSet", void 0);
66
+ __decorate([
67
+ (0, container_1.inject)(contracts_1.Identifiers.Consensus.RoundStateRepository),
68
+ __metadata("design:type", Object)
69
+ ], PrevoteProcessor.prototype, "roundStateRepo", void 0);
70
+ __decorate([
71
+ (0, container_1.inject)(contracts_1.Identifiers.P2P.Broadcaster),
72
+ __metadata("design:type", Object)
73
+ ], PrevoteProcessor.prototype, "broadcaster", void 0);
74
+ __decorate([
75
+ (0, container_1.inject)(contracts_1.Identifiers.CryptoWorker.WorkerPool),
76
+ __metadata("design:type", Object)
77
+ ], PrevoteProcessor.prototype, "workerPool", void 0);
78
+ exports.PrevoteProcessor = PrevoteProcessor = __decorate([
79
+ (0, container_1.injectable)()
80
+ ], PrevoteProcessor);
81
+ //# sourceMappingURL=prevote-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prevote-processor.js","sourceRoot":"","sources":["../../source/processors/prevote-processor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,mDAAyD;AACzD,mDAA6D;AAC7D,6CAA6C;AAE7C,6DAAyD;AAGlD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,sCAAiB;IAAhD;;;IAwDP,CAAC;IAxCA,KAAK,CAAC,OAAO,CAAC,OAAiC,EAAE,SAAS,GAAG,IAAI;QAChE,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE;YACjD,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1C,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,CAAC,MAAM,uBAAA,IAAI,wEAAmB,MAAvB,IAAI,EAAoB,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC/C,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACpF,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnD,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC;YACpD,CAAC;YAED,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAE/B,IAAI,SAAS,EAAE,CAAC;gBACf,KAAK,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;YAED,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAE5C,OAAO,qBAAS,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC;QACrD,CAAC,CAAC,CAAC;IACJ,CAAC;CAWD,CAAA;AAxDY,4CAAgB;;sCA+C5B,KAAK,8CAAoB,OAAiC;IACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;IACjD,OAAO,MAAM,CAAC,kBAAkB,CAC/B,QAAQ,EACR,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EACrC,MAAM,IAAI,CAAC,UAAU,CAAC,4BAA4B,CAAC,OAAO,CAAC,EAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,qBAAqB,EAAE,EAAE,KAAK,CAAC,CAClG,CAAC;AACH,CAAC;AArDgB;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;;oDACa;AAGhD;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,YAAY,CAAC,OAAO,CAAC;;sDACsB;AAG9C;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,SAAS,CAAC,oBAAoB,CAAC;;wDACwB;AAG1D;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,GAAG,CAAC,WAAW,CAAC;;qDACqB;AAGxC;IADhB,IAAA,kBAAM,EAAC,uBAAW,CAAC,YAAY,CAAC,UAAU,CAAC;;oDACO;2BAdvC,gBAAgB;IAD5B,IAAA,sBAAU,GAAE;GACA,gBAAgB,CAwD5B"}
@@ -0,0 +1,16 @@
1
+ import { Contracts } from "@mainsail/contracts";
2
+ import { AbstractProcessor } from "./abstract-processor";
3
+ export declare class ProposalProcessor extends AbstractProcessor implements Contracts.Consensus.ProposalProcessor {
4
+ #private;
5
+ private readonly messageSerializer;
6
+ private readonly configuration;
7
+ private readonly aggregator;
8
+ private readonly proposerSelector;
9
+ private readonly validatorSet;
10
+ private readonly roundStateRepo;
11
+ private readonly broadcaster;
12
+ private readonly logger;
13
+ private readonly workerPool;
14
+ process(proposal: Contracts.Crypto.Proposal, broadcast?: boolean): Promise<Contracts.Consensus.ProcessorResult>;
15
+ }
16
+ //# sourceMappingURL=proposal-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-processor.d.ts","sourceRoot":"","sources":["../../source/processors/proposal-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBACa,iBAAkB,SAAQ,iBAAkB,YAAW,SAAS,CAAC,SAAS,CAAC,iBAAiB;;IAExG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IAGxE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAGhE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAG7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAGhE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAG/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAG3E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAGzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAGlD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IAE7C,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,UAAO,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC;CA6GlH"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _ProposalProcessor_instances, _ProposalProcessor_hasValidProposer, _ProposalProcessor_hasValidSignature, _ProposalProcessor_hasValidLockProof, _ProposalProcessor_hasValidBlockGenerator;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ProposalProcessor = void 0;
19
+ const container_1 = require("@mainsail/container");
20
+ const contracts_1 = require("@mainsail/contracts");
21
+ const kernel_1 = require("@mainsail/kernel");
22
+ const abstract_processor_1 = require("./abstract-processor");
23
+ let ProposalProcessor = class ProposalProcessor extends abstract_processor_1.AbstractProcessor {
24
+ constructor() {
25
+ super(...arguments);
26
+ _ProposalProcessor_instances.add(this);
27
+ }
28
+ async process(proposal, broadcast = true) {
29
+ return this.commitLock.runNonExclusive(async () => {
30
+ if (!this.hasValidHeightOrRound(proposal)) {
31
+ return contracts_1.Contracts.Consensus.ProcessorResult.Skipped;
32
+ }
33
+ if (!this.isRoundInBounds(proposal)) {
34
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
35
+ }
36
+ if (!__classPrivateFieldGet(this, _ProposalProcessor_instances, "m", _ProposalProcessor_hasValidProposer).call(this, proposal)) {
37
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
38
+ }
39
+ if (!(await __classPrivateFieldGet(this, _ProposalProcessor_instances, "m", _ProposalProcessor_hasValidSignature).call(this, proposal))) {
40
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
41
+ }
42
+ if (!__classPrivateFieldGet(this, _ProposalProcessor_instances, "m", _ProposalProcessor_hasValidBlockGenerator).call(this, proposal)) {
43
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
44
+ }
45
+ if (!(await __classPrivateFieldGet(this, _ProposalProcessor_instances, "m", _ProposalProcessor_hasValidLockProof).call(this, proposal))) {
46
+ return contracts_1.Contracts.Consensus.ProcessorResult.Invalid;
47
+ }
48
+ const roundState = this.roundStateRepo.getRoundState(proposal.height, proposal.round);
49
+ if (roundState.hasProposal()) {
50
+ return contracts_1.Contracts.Consensus.ProcessorResult.Skipped;
51
+ }
52
+ roundState.addProposal(proposal);
53
+ if (broadcast) {
54
+ void this.broadcaster.broadcastProposal(proposal);
55
+ }
56
+ void this.getConsensus().handle(roundState);
57
+ return contracts_1.Contracts.Consensus.ProcessorResult.Accepted;
58
+ });
59
+ }
60
+ };
61
+ exports.ProposalProcessor = ProposalProcessor;
62
+ _ProposalProcessor_instances = new WeakSet();
63
+ _ProposalProcessor_hasValidProposer = function _ProposalProcessor_hasValidProposer(proposal) {
64
+ return proposal.validatorIndex === this.proposerSelector.getValidatorIndex(proposal.round);
65
+ };
66
+ _ProposalProcessor_hasValidSignature = async function _ProposalProcessor_hasValidSignature(proposal) {
67
+ const worker = await this.workerPool.getWorker();
68
+ return worker.consensusSignature("verify", Buffer.from(proposal.signature, "hex"), await this.messageSerializer.serializeProposal(proposal, { includeSignature: false }), Buffer.from(this.validatorSet.getValidator(proposal.validatorIndex).getConsensusPublicKey(), "hex"));
69
+ };
70
+ _ProposalProcessor_hasValidLockProof = async function _ProposalProcessor_hasValidLockProof(proposal) {
71
+ if (proposal.validRound === undefined) {
72
+ return true;
73
+ }
74
+ if (proposal.validRound >= proposal.round) {
75
+ this.logger.debug(`Received proposal ${proposal.height}/${proposal.round} has validRound ${proposal.validRound} >= round ${proposal.round}`);
76
+ return false;
77
+ }
78
+ const lockProof = proposal.block.lockProof;
79
+ if (!lockProof) {
80
+ this.logger.debug(`Received proposal ${proposal.height}/${proposal.round} with missing lock proof`);
81
+ return true;
82
+ }
83
+ const data = await this.messageSerializer.serializePrevoteForSignature({
84
+ blockId: proposal.block.block.header.id,
85
+ height: proposal.height,
86
+ round: proposal.validRound,
87
+ type: contracts_1.Contracts.Crypto.MessageType.Prevote,
88
+ });
89
+ const { activeValidators } = this.configuration.getMilestone(proposal.height);
90
+ const verified = await this.aggregator.verify(lockProof, data, activeValidators);
91
+ if (!verified) {
92
+ this.logger.debug(`Received proposal ${proposal.height}/${proposal.round} with invalid lock proof`);
93
+ }
94
+ return verified;
95
+ };
96
+ _ProposalProcessor_hasValidBlockGenerator = function _ProposalProcessor_hasValidBlockGenerator(proposal) {
97
+ if (proposal.validRound !== undefined) {
98
+ // We assume that this check passed when block was proposed first time, so we don't need to check it again.
99
+ // The check also cannot be repeated because we don't hold the value when the block was proposed first time.
100
+ return true;
101
+ }
102
+ const proposer = this.validatorSet.getValidator(this.proposerSelector.getValidatorIndex(proposal.round));
103
+ const isValid = proposal.block.block.data.generatorPublicKey === proposer.getWalletPublicKey();
104
+ if (!isValid) {
105
+ this.logger.debug(`Received proposal ${proposal.height}/${proposal.round} with invalid block generator`);
106
+ }
107
+ return isValid;
108
+ };
109
+ __decorate([
110
+ (0, container_1.inject)(contracts_1.Identifiers.Cryptography.Message.Serializer),
111
+ __metadata("design:type", Object)
112
+ ], ProposalProcessor.prototype, "messageSerializer", void 0);
113
+ __decorate([
114
+ (0, container_1.inject)(contracts_1.Identifiers.Cryptography.Configuration),
115
+ __metadata("design:type", Object)
116
+ ], ProposalProcessor.prototype, "configuration", void 0);
117
+ __decorate([
118
+ (0, container_1.inject)(contracts_1.Identifiers.Consensus.Aggregator),
119
+ __metadata("design:type", Object)
120
+ ], ProposalProcessor.prototype, "aggregator", void 0);
121
+ __decorate([
122
+ (0, container_1.inject)(contracts_1.Identifiers.Proposer.Selector),
123
+ __metadata("design:type", Object)
124
+ ], ProposalProcessor.prototype, "proposerSelector", void 0);
125
+ __decorate([
126
+ (0, container_1.inject)(contracts_1.Identifiers.ValidatorSet.Service),
127
+ __metadata("design:type", Object)
128
+ ], ProposalProcessor.prototype, "validatorSet", void 0);
129
+ __decorate([
130
+ (0, container_1.inject)(contracts_1.Identifiers.Consensus.RoundStateRepository),
131
+ __metadata("design:type", Object)
132
+ ], ProposalProcessor.prototype, "roundStateRepo", void 0);
133
+ __decorate([
134
+ (0, container_1.inject)(contracts_1.Identifiers.P2P.Broadcaster),
135
+ __metadata("design:type", Object)
136
+ ], ProposalProcessor.prototype, "broadcaster", void 0);
137
+ __decorate([
138
+ (0, container_1.inject)(contracts_1.Identifiers.Services.Log.Service),
139
+ __metadata("design:type", Object)
140
+ ], ProposalProcessor.prototype, "logger", void 0);
141
+ __decorate([
142
+ (0, container_1.inject)(contracts_1.Identifiers.CryptoWorker.WorkerPool),
143
+ __metadata("design:type", Object)
144
+ ], ProposalProcessor.prototype, "workerPool", void 0);
145
+ exports.ProposalProcessor = ProposalProcessor = __decorate([
146
+ (0, container_1.injectable)()
147
+ ], ProposalProcessor);
148
+ //# sourceMappingURL=proposal-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-processor.js","sourceRoot":"","sources":["../../source/processors/proposal-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Contracts } from "@mainsail/contracts";
2
+ export declare class RoundStateRepository implements Contracts.Consensus.RoundStateRepository {
3
+ #private;
4
+ private readonly app;
5
+ getRoundState(height: number, round: number): Contracts.Consensus.RoundState;
6
+ getRoundStates(): Contracts.Consensus.RoundState[];
7
+ clear(): void;
8
+ }
9
+ //# sourceMappingURL=round-state-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"round-state-repository.d.ts","sourceRoot":"","sources":["../source/round-state-repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAC;AAI7D,qBACa,oBAAqB,YAAW,SAAS,CAAC,SAAS,CAAC,oBAAoB;;IAEpF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgC;IAI7C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,UAAU;IAU5E,cAAc,IAAI,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE;IAIlD,KAAK,IAAI,IAAI;CAOpB"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _RoundStateRepository_instances, _RoundStateRepository_roundStates, _RoundStateRepository_createRoundState;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.RoundStateRepository = void 0;
19
+ const container_1 = require("@mainsail/container");
20
+ const contracts_1 = require("@mainsail/contracts");
21
+ const round_state_1 = require("./round-state");
22
+ let RoundStateRepository = class RoundStateRepository {
23
+ constructor() {
24
+ _RoundStateRepository_instances.add(this);
25
+ _RoundStateRepository_roundStates.set(this, new Map());
26
+ }
27
+ getRoundState(height, round) {
28
+ const key = `${height}-${round}`;
29
+ if (!__classPrivateFieldGet(this, _RoundStateRepository_roundStates, "f").has(key)) {
30
+ __classPrivateFieldGet(this, _RoundStateRepository_roundStates, "f").set(key, __classPrivateFieldGet(this, _RoundStateRepository_instances, "m", _RoundStateRepository_createRoundState).call(this, height, round));
31
+ }
32
+ return __classPrivateFieldGet(this, _RoundStateRepository_roundStates, "f").get(key);
33
+ }
34
+ getRoundStates() {
35
+ return [...__classPrivateFieldGet(this, _RoundStateRepository_roundStates, "f").values()];
36
+ }
37
+ clear() {
38
+ __classPrivateFieldGet(this, _RoundStateRepository_roundStates, "f").clear();
39
+ }
40
+ };
41
+ exports.RoundStateRepository = RoundStateRepository;
42
+ _RoundStateRepository_roundStates = new WeakMap();
43
+ _RoundStateRepository_instances = new WeakSet();
44
+ _RoundStateRepository_createRoundState = function _RoundStateRepository_createRoundState(height, round) {
45
+ return this.app.resolve(round_state_1.RoundState).configure(height, round);
46
+ };
47
+ __decorate([
48
+ (0, container_1.inject)(contracts_1.Identifiers.Application.Instance),
49
+ __metadata("design:type", Object)
50
+ ], RoundStateRepository.prototype, "app", void 0);
51
+ exports.RoundStateRepository = RoundStateRepository = __decorate([
52
+ (0, container_1.injectable)()
53
+ ], RoundStateRepository);
54
+ //# sourceMappingURL=round-state-repository.js.map