@lodestar/beacon-node 1.19.0-rc.0 → 1.19.0-rc.2
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/lib/api/rest/base.js +6 -2
- package/lib/api/rest/base.js.map +1 -1
- package/lib/chain/bls/index.d.ts +2 -3
- package/lib/chain/bls/index.js +1 -1
- package/lib/chain/bls/index.js.map +1 -1
- package/lib/chain/bls/interface.d.ts +1 -1
- package/lib/chain/bls/maybeBatch.d.ts +12 -0
- package/lib/chain/bls/maybeBatch.js +36 -0
- package/lib/chain/bls/maybeBatch.js.map +1 -0
- package/lib/chain/bls/{multiThread.d.ts → multithread/index.d.ts} +12 -6
- package/lib/chain/bls/{multiThread.js → multithread/index.js} +131 -40
- package/lib/chain/bls/multithread/index.js.map +1 -0
- package/lib/chain/bls/{jobItem.d.ts → multithread/jobItem.d.ts} +5 -5
- package/lib/chain/bls/{jobItem.js → multithread/jobItem.js} +9 -13
- package/lib/chain/bls/multithread/jobItem.js.map +1 -0
- package/lib/chain/bls/multithread/poolSize.d.ts +6 -0
- package/lib/chain/bls/multithread/poolSize.js +17 -0
- package/lib/chain/bls/multithread/poolSize.js.map +1 -0
- package/lib/chain/bls/{types.d.ts → multithread/types.d.ts} +10 -11
- package/lib/chain/bls/multithread/types.js.map +1 -0
- package/lib/chain/bls/multithread/utils.d.ts +5 -0
- package/lib/chain/bls/multithread/utils.js +17 -0
- package/lib/chain/bls/multithread/utils.js.map +1 -0
- package/lib/chain/bls/multithread/worker.d.ts +2 -0
- package/lib/chain/bls/{runBlsWorkReq.js → multithread/worker.js} +32 -9
- package/lib/chain/bls/multithread/worker.js.map +1 -0
- package/lib/chain/bls/singleThread.d.ts +1 -1
- package/lib/chain/bls/singleThread.js +9 -9
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.d.ts +1 -7
- package/lib/chain/bls/utils.js +2 -24
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.js +1 -1
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +4 -4
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.js +9 -5
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +6 -5
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +4 -4
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +6 -0
- package/lib/chain/opPools/utils.js +9 -0
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +1 -1
- package/lib/chain/validation/signatureSets/selectionProof.d.ts +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -1
- package/lib/node/utils/interop/deposits.js +2 -2
- package/lib/node/utils/interop/deposits.js.map +1 -1
- package/package.json +17 -16
- package/lib/chain/bls/jobItem.js.map +0 -1
- package/lib/chain/bls/multiThread.js.map +0 -1
- package/lib/chain/bls/runBlsWorkReq.d.ts +0 -3
- package/lib/chain/bls/runBlsWorkReq.js.map +0 -1
- package/lib/chain/bls/types.js.map +0 -1
- package/lib/chain/bls/verifySets.d.ts +0 -8
- package/lib/chain/bls/verifySets.js +0 -46
- package/lib/chain/bls/verifySets.js.map +0 -1
- /package/lib/chain/bls/{types.js → multithread/types.js} +0 -0
package/lib/api/rest/base.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { parse as parseQueryString } from "qs";
|
|
2
|
-
import { fastify } from "fastify";
|
|
2
|
+
import { fastify, errorCodes } from "fastify";
|
|
3
3
|
import { fastifyCors } from "@fastify/cors";
|
|
4
4
|
import bearerAuthPlugin from "@fastify/bearer-auth";
|
|
5
5
|
import { ErrorAborted } from "@lodestar/utils";
|
|
6
6
|
import { isLocalhostIP } from "../../util/ip.js";
|
|
7
7
|
import { ApiError, NodeIsSyncing } from "../impl/errors.js";
|
|
8
8
|
import { HttpActiveSocketsTracker } from "./activeSockets.js";
|
|
9
|
+
/**
|
|
10
|
+
* Error code used by Fastify if media type is not supported (415)
|
|
11
|
+
*/
|
|
12
|
+
const INVALID_MEDIA_TYPE_CODE = errorCodes.FST_ERR_CTP_INVALID_MEDIA_TYPE().code;
|
|
9
13
|
/**
|
|
10
14
|
* REST API powered by `fastify` server.
|
|
11
15
|
*/
|
|
@@ -69,7 +73,7 @@ export class RestApiServer {
|
|
|
69
73
|
if (err instanceof ErrorAborted || err instanceof NodeIsSyncing)
|
|
70
74
|
return;
|
|
71
75
|
const operationId = getOperationId(req);
|
|
72
|
-
if (err instanceof ApiError) {
|
|
76
|
+
if (err instanceof ApiError || err.code === INVALID_MEDIA_TYPE_CODE) {
|
|
73
77
|
this.logger.warn(`Req ${req.id} ${operationId} failed`, { reason: err.message });
|
|
74
78
|
}
|
|
75
79
|
else {
|
package/lib/api/rest/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/api/rest/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,IAAI,gBAAgB,EAAC,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAkC,OAAO,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/api/rest/base.ts"],"names":[],"mappings":"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"}
|
package/lib/chain/bls/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export type { IBlsVerifier } from "./interface.js";
|
|
2
|
-
export type { JobQueueItemType } from "./
|
|
3
|
-
export
|
|
4
|
-
export { BlsMultiThreadWorkerPool } from "./multiThread.js";
|
|
2
|
+
export type { BlsMultiThreadWorkerPoolModules, JobQueueItemType } from "./multithread/index.js";
|
|
3
|
+
export { BlsMultiThreadWorkerPool } from "./multithread/index.js";
|
|
5
4
|
export { BlsSingleThreadVerifier } from "./singleThread.js";
|
|
6
5
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/chain/bls/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chain/bls/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chain/bls/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,uBAAuB,EAAC,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PublicKey } from "@chainsafe/bls/types";
|
|
2
|
+
export type SignatureSetDeserialized = {
|
|
3
|
+
publicKey: PublicKey;
|
|
4
|
+
message: Uint8Array;
|
|
5
|
+
signature: Uint8Array;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Verify signatures sets with batch verification or regular core verify depending on the set count.
|
|
9
|
+
* Abstracted in a separate file to be consumed by the threaded pool and the main thread implementation.
|
|
10
|
+
*/
|
|
11
|
+
export declare function verifySignatureSetsMaybeBatch(sets: SignatureSetDeserialized[]): boolean;
|
|
12
|
+
//# sourceMappingURL=maybeBatch.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CoordType } from "@chainsafe/bls/types";
|
|
2
|
+
import bls from "@chainsafe/bls";
|
|
3
|
+
const MIN_SET_COUNT_TO_BATCH = 2;
|
|
4
|
+
/**
|
|
5
|
+
* Verify signatures sets with batch verification or regular core verify depending on the set count.
|
|
6
|
+
* Abstracted in a separate file to be consumed by the threaded pool and the main thread implementation.
|
|
7
|
+
*/
|
|
8
|
+
export function verifySignatureSetsMaybeBatch(sets) {
|
|
9
|
+
try {
|
|
10
|
+
if (sets.length >= MIN_SET_COUNT_TO_BATCH) {
|
|
11
|
+
return bls.Signature.verifyMultipleSignatures(sets.map((s) => ({
|
|
12
|
+
publicKey: s.publicKey,
|
|
13
|
+
message: s.message,
|
|
14
|
+
// true = validate signature
|
|
15
|
+
signature: bls.Signature.fromBytes(s.signature, CoordType.affine, true),
|
|
16
|
+
})));
|
|
17
|
+
}
|
|
18
|
+
// .every on an empty array returns true
|
|
19
|
+
if (sets.length === 0) {
|
|
20
|
+
throw Error("Empty signature set");
|
|
21
|
+
}
|
|
22
|
+
// If too few signature sets verify them without batching
|
|
23
|
+
return sets.every((set) => {
|
|
24
|
+
// true = validate signature
|
|
25
|
+
const sig = bls.Signature.fromBytes(set.signature, CoordType.affine, true);
|
|
26
|
+
return sig.verify(set.publicKey, set.message);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (_) {
|
|
30
|
+
// A signature could be malformed, in that case fromBytes throws error
|
|
31
|
+
// blst-ts `verifyMultipleSignatures` is also a fallible operation if mul_n_aggregate fails
|
|
32
|
+
// see https://github.com/ChainSafe/blst-ts/blob/b1ba6333f664b08e5c50b2b0d18c4f079203962b/src/lib.ts#L291
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=maybeBatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybeBatch.js","sourceRoot":"","sources":["../../../src/chain/bls/maybeBatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,GAAG,MAAM,gBAAgB,CAAC;AAEjC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAQjC;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,IAAgC;IAC5E,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,IAAI,sBAAsB,EAAE,CAAC;YAC1C,OAAO,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACf,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,4BAA4B;gBAC5B,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;aACxE,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;QAED,wCAAwC;QACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QAED,yDAAyD;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACxB,4BAA4B;YAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC3E,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,sEAAsE;QACtE,2FAA2F;QAC3F,yGAAyG;QACzG,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { PublicKey } from "@chainsafe/
|
|
1
|
+
import { PublicKey } from "@chainsafe/bls/types";
|
|
2
2
|
import { Logger } from "@lodestar/utils";
|
|
3
3
|
import { ISignatureSet } from "@lodestar/state-transition";
|
|
4
|
-
import { Metrics } from "
|
|
5
|
-
import { IBlsVerifier, VerifySignatureOpts } from "
|
|
4
|
+
import { Metrics } from "../../../metrics/index.js";
|
|
5
|
+
import { IBlsVerifier, VerifySignatureOpts } from "../interface.js";
|
|
6
|
+
import { JobQueueItemType } from "./jobItem.js";
|
|
6
7
|
export type BlsMultiThreadWorkerPoolModules = {
|
|
7
8
|
logger: Logger;
|
|
8
9
|
metrics: Metrics | null;
|
|
@@ -10,6 +11,7 @@ export type BlsMultiThreadWorkerPoolModules = {
|
|
|
10
11
|
export type BlsMultiThreadWorkerPoolOptions = {
|
|
11
12
|
blsVerifyAllMultiThread?: boolean;
|
|
12
13
|
};
|
|
14
|
+
export type { JobQueueItemType };
|
|
13
15
|
/**
|
|
14
16
|
* Wraps "threads" library thread pool queue system with the goals:
|
|
15
17
|
* - Complete total outstanding jobs in total minimum time possible.
|
|
@@ -21,12 +23,13 @@ export type BlsMultiThreadWorkerPoolOptions = {
|
|
|
21
23
|
export declare class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
22
24
|
private readonly logger;
|
|
23
25
|
private readonly metrics;
|
|
24
|
-
private
|
|
25
|
-
private
|
|
26
|
+
private readonly format;
|
|
27
|
+
private readonly workers;
|
|
26
28
|
private readonly jobs;
|
|
27
29
|
private bufferedJobs;
|
|
28
30
|
private blsVerifyAllMultiThread;
|
|
29
31
|
private closed;
|
|
32
|
+
private workersBusy;
|
|
30
33
|
constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules);
|
|
31
34
|
canAcceptWork(): boolean;
|
|
32
35
|
verifySignatureSets(sets: ISignatureSet[], opts?: VerifySignatureOpts): Promise<boolean>;
|
|
@@ -38,6 +41,7 @@ export declare class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
38
41
|
signature: Uint8Array;
|
|
39
42
|
}[], message: Uint8Array, opts?: Omit<VerifySignatureOpts, "verifyOnMainThread">): Promise<boolean[]>;
|
|
40
43
|
close(): Promise<void>;
|
|
44
|
+
private createWorkers;
|
|
41
45
|
/**
|
|
42
46
|
* Register BLS work to be done eventually in a worker
|
|
43
47
|
*/
|
|
@@ -55,5 +59,7 @@ export declare class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
55
59
|
*/
|
|
56
60
|
private runBufferedJobs;
|
|
57
61
|
private retryJobItemSameMessage;
|
|
62
|
+
/** For testing */
|
|
63
|
+
private waitTillInitialized;
|
|
58
64
|
}
|
|
59
|
-
//# sourceMappingURL=
|
|
65
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,13 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/* eslint-disable @typescript-eslint/strict-boolean-expressions */
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { spawn, Worker } from "@chainsafe/threads";
|
|
4
|
+
// `threads` library creates self global variable which breaks `timeout-abort-controller` https://github.com/jacobheun/timeout-abort-controller/issues/9
|
|
5
|
+
// Don't add an eslint disable here as a reminder that this has to be fixed eventually
|
|
6
|
+
// eslint-disable-next-line
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
// eslint-disable-next-line
|
|
9
|
+
self = undefined;
|
|
10
|
+
import bls from "@chainsafe/bls";
|
|
11
|
+
import { PointFormat } from "@chainsafe/bls/types";
|
|
12
|
+
import { QueueError, QueueErrorCode } from "../../../util/queue/index.js";
|
|
13
|
+
import { getAggregatedPubkey, getAggregatedPubkeysCount } from "../utils.js";
|
|
14
|
+
import { verifySignatureSetsMaybeBatch } from "../maybeBatch.js";
|
|
15
|
+
import { LinkedList } from "../../../util/array.js";
|
|
16
|
+
import { callInNextEventLoop } from "../../../util/eventLoop.js";
|
|
7
17
|
import { WorkResultCode } from "./types.js";
|
|
8
18
|
import { chunkifyMaximizeChunkSize } from "./utils.js";
|
|
9
|
-
import {
|
|
19
|
+
import { defaultPoolSize } from "./poolSize.js";
|
|
10
20
|
import { JobQueueItemType, jobItemSameMessageToMultiSet, jobItemSigSets, jobItemWorkReq, } from "./jobItem.js";
|
|
21
|
+
// Worker constructor consider the path relative to the current working directory
|
|
22
|
+
const workerDir = process.env.NODE_ENV === "test" ? "../../../../lib/chain/bls/multithread" : "./";
|
|
23
|
+
// 1 worker for the main thread
|
|
24
|
+
const blsPoolSize = Math.max(defaultPoolSize - 1, 1);
|
|
11
25
|
/**
|
|
12
26
|
* Split big signature sets into smaller sets so they can be sent to multiple workers.
|
|
13
27
|
*
|
|
@@ -38,6 +52,14 @@ const MAX_BUFFER_WAIT_MS = 100;
|
|
|
38
52
|
* Max concurrent jobs on `canAcceptWork` status
|
|
39
53
|
*/
|
|
40
54
|
const MAX_JOBS_CAN_ACCEPT_WORK = 512;
|
|
55
|
+
var WorkerStatusCode;
|
|
56
|
+
(function (WorkerStatusCode) {
|
|
57
|
+
WorkerStatusCode[WorkerStatusCode["notInitialized"] = 0] = "notInitialized";
|
|
58
|
+
WorkerStatusCode[WorkerStatusCode["initializing"] = 1] = "initializing";
|
|
59
|
+
WorkerStatusCode[WorkerStatusCode["initializationError"] = 2] = "initializationError";
|
|
60
|
+
WorkerStatusCode[WorkerStatusCode["idle"] = 3] = "idle";
|
|
61
|
+
WorkerStatusCode[WorkerStatusCode["running"] = 4] = "running";
|
|
62
|
+
})(WorkerStatusCode || (WorkerStatusCode = {}));
|
|
41
63
|
/**
|
|
42
64
|
* Wraps "threads" library thread pool queue system with the goals:
|
|
43
65
|
* - Complete total outstanding jobs in total minimum time possible.
|
|
@@ -48,10 +70,10 @@ const MAX_JOBS_CAN_ACCEPT_WORK = 512;
|
|
|
48
70
|
*/
|
|
49
71
|
export class BlsMultiThreadWorkerPool {
|
|
50
72
|
constructor(options, modules) {
|
|
51
|
-
this.workersBusy = 0;
|
|
52
73
|
this.jobs = new LinkedList();
|
|
53
74
|
this.bufferedJobs = null;
|
|
54
75
|
this.closed = false;
|
|
76
|
+
this.workersBusy = 0;
|
|
55
77
|
/**
|
|
56
78
|
* Potentially submit jobs to an idle worker, only if there's a worker and jobs
|
|
57
79
|
*/
|
|
@@ -59,11 +81,21 @@ export class BlsMultiThreadWorkerPool {
|
|
|
59
81
|
if (this.closed) {
|
|
60
82
|
return;
|
|
61
83
|
}
|
|
84
|
+
// Find idle worker
|
|
85
|
+
const worker = this.workers.find((worker) => worker.status.code === WorkerStatusCode.idle);
|
|
86
|
+
if (!worker || worker.status.code !== WorkerStatusCode.idle) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
62
89
|
// Prepare work package
|
|
63
90
|
const jobsInput = this.prepareWork();
|
|
64
91
|
if (jobsInput.length === 0) {
|
|
65
92
|
return;
|
|
66
93
|
}
|
|
94
|
+
// TODO: After sending the work to the worker the main thread can drop the job arguments
|
|
95
|
+
// and free-up memory, only needs to keep the job's Promise handlers.
|
|
96
|
+
// Maybe it's not useful since all data referenced in jobs is likely referenced by others
|
|
97
|
+
const workerApi = worker.status.workerApi;
|
|
98
|
+
worker.status = { code: WorkerStatusCode.running, workerApi };
|
|
67
99
|
this.workersBusy++;
|
|
68
100
|
try {
|
|
69
101
|
let startedJobsDefault = 0;
|
|
@@ -78,7 +110,7 @@ export class BlsMultiThreadWorkerPool {
|
|
|
78
110
|
try {
|
|
79
111
|
// Note: This can throw, must be handled per-job.
|
|
80
112
|
// Pubkey and signature aggregation is defered here
|
|
81
|
-
workReq = jobItemWorkReq(job, this.metrics);
|
|
113
|
+
workReq = jobItemWorkReq(job, this.format, this.metrics);
|
|
82
114
|
}
|
|
83
115
|
catch (e) {
|
|
84
116
|
this.metrics?.blsThreadPool.errorAggregateSignatureSetsCount.inc({ type: job.type });
|
|
@@ -115,9 +147,9 @@ export class BlsMultiThreadWorkerPool {
|
|
|
115
147
|
// If the job, metrics or any code below throws: the job will reject never going stale.
|
|
116
148
|
// Only downside is the job promise may be resolved twice, but that's not an issue
|
|
117
149
|
const [jobStartSec, jobStartNs] = process.hrtime();
|
|
118
|
-
const workResult = await
|
|
150
|
+
const workResult = await workerApi.verifyManySignatureSets(workReqs);
|
|
119
151
|
const [jobEndSec, jobEndNs] = process.hrtime();
|
|
120
|
-
const { batchRetries, batchSigsSuccess, workerStartTime, workerEndTime, results } = workResult;
|
|
152
|
+
const { workerId, batchRetries, batchSigsSuccess, workerStartTime, workerEndTime, results } = workResult;
|
|
121
153
|
const [workerStartSec, workerStartNs] = workerStartTime;
|
|
122
154
|
const [workerEndSec, workerEndNs] = workerEndTime;
|
|
123
155
|
let successCount = 0;
|
|
@@ -130,7 +162,7 @@ export class BlsMultiThreadWorkerPool {
|
|
|
130
162
|
// TODO: enable exhaustive switch case checks lint rule
|
|
131
163
|
switch (job.type) {
|
|
132
164
|
case JobQueueItemType.default:
|
|
133
|
-
if (jobResult.code !== WorkResultCode.success) {
|
|
165
|
+
if (!jobResult || jobResult.code !== WorkResultCode.success) {
|
|
134
166
|
job.reject(getJobResultError(jobResult, i));
|
|
135
167
|
errorCount += sigSetCount;
|
|
136
168
|
}
|
|
@@ -141,7 +173,7 @@ export class BlsMultiThreadWorkerPool {
|
|
|
141
173
|
break;
|
|
142
174
|
// handle result of the verification of aggregated signature against aggregated pubkeys
|
|
143
175
|
case JobQueueItemType.sameMessage:
|
|
144
|
-
if (jobResult.code !== WorkResultCode.success) {
|
|
176
|
+
if (!jobResult || jobResult.code !== WorkResultCode.success) {
|
|
145
177
|
job.reject(getJobResultError(jobResult, i));
|
|
146
178
|
errorCount += 1;
|
|
147
179
|
}
|
|
@@ -159,12 +191,11 @@ export class BlsMultiThreadWorkerPool {
|
|
|
159
191
|
break;
|
|
160
192
|
}
|
|
161
193
|
}
|
|
162
|
-
// TODO: (@matthewkeil) all of these metrics need to be revisited
|
|
163
194
|
const workerJobTimeSec = workerEndSec - workerStartSec + (workerEndNs - workerStartNs) / 1e9;
|
|
164
195
|
const latencyToWorkerSec = workerStartSec - jobStartSec + (workerStartNs - jobStartNs) / 1e9;
|
|
165
196
|
const latencyFromWorkerSec = jobEndSec - workerEndSec + Number(jobEndNs - workerEndNs) / 1e9;
|
|
166
197
|
this.metrics?.blsThreadPool.timePerSigSet.observe(workerJobTimeSec / startedSigSets);
|
|
167
|
-
this.metrics?.blsThreadPool.jobsWorkerTime.inc({ workerId
|
|
198
|
+
this.metrics?.blsThreadPool.jobsWorkerTime.inc({ workerId }, workerJobTimeSec);
|
|
168
199
|
this.metrics?.blsThreadPool.latencyToWorker.observe(latencyToWorkerSec);
|
|
169
200
|
this.metrics?.blsThreadPool.latencyFromWorker.observe(latencyFromWorkerSec);
|
|
170
201
|
this.metrics?.blsThreadPool.successJobsSignatureSetsCount.inc(successCount);
|
|
@@ -182,6 +213,7 @@ export class BlsMultiThreadWorkerPool {
|
|
|
182
213
|
job.reject(e);
|
|
183
214
|
}
|
|
184
215
|
}
|
|
216
|
+
worker.status = { code: WorkerStatusCode.idle, workerApi };
|
|
185
217
|
this.workersBusy--;
|
|
186
218
|
// Potentially run a new job
|
|
187
219
|
callInNextEventLoop(this.runJob);
|
|
@@ -201,31 +233,26 @@ export class BlsMultiThreadWorkerPool {
|
|
|
201
233
|
callInNextEventLoop(this.runJob);
|
|
202
234
|
}
|
|
203
235
|
};
|
|
204
|
-
|
|
205
|
-
this.
|
|
206
|
-
this.blsPoolSize = Number(process.env.UV_THREADPOOL_SIZE);
|
|
207
|
-
const defaultThreadpoolSize = os.availableParallelism();
|
|
208
|
-
this.logger.info(`BLS libuv pool size: ${this.blsPoolSize}`);
|
|
209
|
-
/**
|
|
210
|
-
* Help users ensure that thread pool is large enough for optimal performance
|
|
211
|
-
*
|
|
212
|
-
* Node reports available CPUs. There is enough idle time on the main and
|
|
213
|
-
* network threads that setting UV_THREADPOOL_SIZE to $(nproc) provides the
|
|
214
|
-
* best performance. Recommend this value to consumers
|
|
215
|
-
*/
|
|
216
|
-
if (this.blsPoolSize < defaultThreadpoolSize) {
|
|
217
|
-
this.logger.warn(`UV_THREADPOOL_SIZE=${this.blsPoolSize} which is less than available CPUs: ${defaultThreadpoolSize}. This will cause performance degradation.`);
|
|
218
|
-
}
|
|
219
|
-
const { metrics } = modules;
|
|
236
|
+
const { logger, metrics } = modules;
|
|
237
|
+
this.logger = logger;
|
|
220
238
|
this.metrics = metrics;
|
|
239
|
+
this.blsVerifyAllMultiThread = options.blsVerifyAllMultiThread ?? false;
|
|
240
|
+
// TODO: Allow to customize implementation
|
|
241
|
+
const implementation = bls.implementation;
|
|
242
|
+
// Use compressed for herumi for now.
|
|
243
|
+
// THe worker is not able to deserialize from uncompressed
|
|
244
|
+
// `Error: err _wrapDeserialize`
|
|
245
|
+
this.format = implementation === "blst-native" ? PointFormat.uncompressed : PointFormat.compressed;
|
|
246
|
+
this.workers = this.createWorkers(implementation, blsPoolSize);
|
|
221
247
|
if (metrics) {
|
|
222
248
|
metrics.blsThreadPool.queueLength.addCollect(() => {
|
|
223
249
|
metrics.blsThreadPool.queueLength.set(this.jobs.length);
|
|
250
|
+
metrics.blsThreadPool.workersBusy.set(this.workersBusy);
|
|
224
251
|
});
|
|
225
252
|
}
|
|
226
253
|
}
|
|
227
254
|
canAcceptWork() {
|
|
228
|
-
return (this.workersBusy <
|
|
255
|
+
return (this.workersBusy < blsPoolSize &&
|
|
229
256
|
// TODO: Should also bound the jobs queue?
|
|
230
257
|
this.jobs.length < MAX_JOBS_CAN_ACCEPT_WORK);
|
|
231
258
|
}
|
|
@@ -241,13 +268,17 @@ export class BlsMultiThreadWorkerPool {
|
|
|
241
268
|
}
|
|
242
269
|
if (opts.verifyOnMainThread && !this.blsVerifyAllMultiThread) {
|
|
243
270
|
const timer = this.metrics?.blsThreadPool.mainThreadDurationInThreadPool.startTimer();
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
271
|
+
try {
|
|
272
|
+
return verifySignatureSetsMaybeBatch(sets.map((set) => ({
|
|
273
|
+
publicKey: getAggregatedPubkey(set),
|
|
274
|
+
message: set.signingRoot.valueOf(),
|
|
275
|
+
signature: set.signature,
|
|
276
|
+
})));
|
|
277
|
+
}
|
|
278
|
+
finally {
|
|
279
|
+
if (timer)
|
|
280
|
+
timer();
|
|
281
|
+
}
|
|
251
282
|
}
|
|
252
283
|
// Split large array of sets into smaller.
|
|
253
284
|
// Very helpful when syncing finalized, sync may submit +1000 sets so chunkify allows to distribute to many workers
|
|
@@ -294,6 +325,44 @@ export class BlsMultiThreadWorkerPool {
|
|
|
294
325
|
job.reject(new QueueError({ code: QueueErrorCode.QUEUE_ABORTED }));
|
|
295
326
|
}
|
|
296
327
|
this.jobs.clear();
|
|
328
|
+
// Terminate all workers. await to ensure no workers are left hanging
|
|
329
|
+
await Promise.all(Array.from(this.workers.entries()).map(([id, worker]) =>
|
|
330
|
+
// NOTE: 'threads' has not yet updated types, and NodeJS complains with
|
|
331
|
+
// [DEP0132] DeprecationWarning: Passing a callback to worker.terminate() is deprecated. It returns a Promise instead.
|
|
332
|
+
worker.worker.terminate().catch((e) => {
|
|
333
|
+
this.logger.error("Error terminating worker", { id }, e);
|
|
334
|
+
})));
|
|
335
|
+
}
|
|
336
|
+
createWorkers(implementation, poolSize) {
|
|
337
|
+
const workers = [];
|
|
338
|
+
for (let i = 0; i < poolSize; i++) {
|
|
339
|
+
const workerData = { implementation, workerId: i };
|
|
340
|
+
const worker = new Worker(path.join(workerDir, "worker.js"), {
|
|
341
|
+
workerData,
|
|
342
|
+
});
|
|
343
|
+
const workerDescriptor = {
|
|
344
|
+
worker,
|
|
345
|
+
status: { code: WorkerStatusCode.notInitialized },
|
|
346
|
+
};
|
|
347
|
+
workers.push(workerDescriptor);
|
|
348
|
+
// TODO: Consider initializing only when necessary
|
|
349
|
+
const initPromise = spawn(worker, {
|
|
350
|
+
// A Lodestar Node may do very expensive task at start blocking the event loop and causing
|
|
351
|
+
// the initialization to timeout. The number below is big enough to almost disable the timeout
|
|
352
|
+
timeout: 5 * 60 * 1000,
|
|
353
|
+
});
|
|
354
|
+
workerDescriptor.status = { code: WorkerStatusCode.initializing, initPromise };
|
|
355
|
+
initPromise
|
|
356
|
+
.then((workerApi) => {
|
|
357
|
+
workerDescriptor.status = { code: WorkerStatusCode.idle, workerApi };
|
|
358
|
+
// Potentially run jobs that were queued before initialization of the first worker
|
|
359
|
+
setTimeout(this.runJob, 0);
|
|
360
|
+
})
|
|
361
|
+
.catch((error) => {
|
|
362
|
+
workerDescriptor.status = { code: WorkerStatusCode.initializationError, error };
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
return workers;
|
|
297
366
|
}
|
|
298
367
|
/**
|
|
299
368
|
* Register BLS work to be done eventually in a worker
|
|
@@ -302,6 +371,14 @@ export class BlsMultiThreadWorkerPool {
|
|
|
302
371
|
if (this.closed) {
|
|
303
372
|
throw new QueueError({ code: QueueErrorCode.QUEUE_ABORTED });
|
|
304
373
|
}
|
|
374
|
+
// TODO: Consider if limiting queue size is necessary here.
|
|
375
|
+
// It would be bad to reject signatures because the node is slow.
|
|
376
|
+
// However, if the worker communication broke jobs won't ever finish
|
|
377
|
+
if (this.workers.length > 0 &&
|
|
378
|
+
this.workers[0].status.code === WorkerStatusCode.initializationError &&
|
|
379
|
+
this.workers.every((worker) => worker.status.code === WorkerStatusCode.initializationError)) {
|
|
380
|
+
return job.reject(this.workers[0].status.error);
|
|
381
|
+
}
|
|
305
382
|
// Append batchable sets to `bufferedJobs`, starting a timeout to push them into `jobs`.
|
|
306
383
|
// Do not call `runJob()`, it is called from `runBufferedJobs()`
|
|
307
384
|
if (job.opts.batchable) {
|
|
@@ -364,5 +441,19 @@ export class BlsMultiThreadWorkerPool {
|
|
|
364
441
|
this.metrics?.blsThreadPool.sameMessageRetryJobs.inc(1);
|
|
365
442
|
this.metrics?.blsThreadPool.sameMessageRetrySets.inc(job.sets.length);
|
|
366
443
|
}
|
|
444
|
+
/** For testing */
|
|
445
|
+
async waitTillInitialized() {
|
|
446
|
+
await Promise.all(this.workers.map(async (worker) => {
|
|
447
|
+
if (worker.status.code === WorkerStatusCode.initializing) {
|
|
448
|
+
await worker.status.initPromise;
|
|
449
|
+
}
|
|
450
|
+
}));
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function getJobResultError(jobResult, i) {
|
|
454
|
+
const workerError = jobResult ? Error(jobResult.error.message) : Error(`No jobResult for index ${i}`);
|
|
455
|
+
if (jobResult?.error?.stack)
|
|
456
|
+
workerError.stack = jobResult.error.stack;
|
|
457
|
+
return workerError;
|
|
367
458
|
}
|
|
368
|
-
//# sourceMappingURL=
|
|
459
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { PublicKey } from "@chainsafe/
|
|
1
|
+
import { PointFormat, PublicKey } from "@chainsafe/bls/types";
|
|
2
2
|
import { ISignatureSet } from "@lodestar/state-transition";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { VerifySignatureOpts } from "../interface.js";
|
|
4
|
+
import { LinkedList } from "../../../util/array.js";
|
|
5
|
+
import { Metrics } from "../../../metrics/metrics.js";
|
|
6
6
|
import { BlsWorkReq } from "./types.js";
|
|
7
7
|
export type JobQueueItem = JobQueueItemDefault | JobQueueItemSameMessage;
|
|
8
8
|
export type JobQueueItemDefault = {
|
|
@@ -37,7 +37,7 @@ export declare function jobItemSigSets(job: JobQueueItem): number;
|
|
|
37
37
|
* Prepare BlsWorkReq from JobQueueItem
|
|
38
38
|
* WARNING: May throw with untrusted user input
|
|
39
39
|
*/
|
|
40
|
-
export declare function jobItemWorkReq(job: JobQueueItem, metrics: Metrics | null): BlsWorkReq;
|
|
40
|
+
export declare function jobItemWorkReq(job: JobQueueItem, format: PointFormat, metrics: Metrics | null): BlsWorkReq;
|
|
41
41
|
/**
|
|
42
42
|
* Convert a JobQueueItemSameMessage into multiple JobQueueItemDefault linked to the original promise
|
|
43
43
|
*/
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import bls from "@chainsafe/bls";
|
|
2
|
+
import { CoordType } from "@chainsafe/bls/types";
|
|
3
3
|
import { SignatureSetType } from "@lodestar/state-transition";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { getAggregatedPubkey } from "../utils.js";
|
|
5
|
+
import { LinkedList } from "../../../util/array.js";
|
|
6
6
|
export var JobQueueItemType;
|
|
7
7
|
(function (JobQueueItemType) {
|
|
8
8
|
JobQueueItemType["default"] = "default";
|
|
@@ -23,14 +23,14 @@ export function jobItemSigSets(job) {
|
|
|
23
23
|
* Prepare BlsWorkReq from JobQueueItem
|
|
24
24
|
* WARNING: May throw with untrusted user input
|
|
25
25
|
*/
|
|
26
|
-
export function jobItemWorkReq(job, metrics) {
|
|
26
|
+
export function jobItemWorkReq(job, format, metrics) {
|
|
27
27
|
switch (job.type) {
|
|
28
28
|
case JobQueueItemType.default:
|
|
29
29
|
return {
|
|
30
30
|
opts: job.opts,
|
|
31
31
|
sets: job.sets.map((set) => ({
|
|
32
32
|
// this can throw, handled in the consumer code
|
|
33
|
-
publicKey: getAggregatedPubkey(set, metrics),
|
|
33
|
+
publicKey: getAggregatedPubkey(set, metrics).toBytes(format),
|
|
34
34
|
signature: set.signature,
|
|
35
35
|
message: set.signingRoot,
|
|
36
36
|
})),
|
|
@@ -44,19 +44,15 @@ export function jobItemWorkReq(job, metrics) {
|
|
|
44
44
|
// and not a problem in the near future
|
|
45
45
|
// this is monitored on v1.11.0 https://github.com/ChainSafe/lodestar/pull/5912#issuecomment-1700320307
|
|
46
46
|
const timer = metrics?.blsThreadPool.signatureDeserializationMainThreadDuration.startTimer();
|
|
47
|
-
const signatures = job.sets.map((set) =>
|
|
47
|
+
const signatures = job.sets.map((set) => bls.Signature.fromBytes(set.signature, CoordType.affine, true));
|
|
48
48
|
timer?.();
|
|
49
|
-
const randomness = [];
|
|
50
|
-
for (let i = 0; i < job.sets.length; i++) {
|
|
51
|
-
randomness.push(randomBytesNonZero(8));
|
|
52
|
-
}
|
|
53
49
|
return {
|
|
54
50
|
opts: job.opts,
|
|
55
51
|
sets: [
|
|
56
52
|
{
|
|
53
|
+
publicKey: bls.PublicKey.aggregate(job.sets.map((set) => set.publicKey)).toBytes(format),
|
|
54
|
+
signature: bls.Signature.aggregate(signatures).toBytes(format),
|
|
57
55
|
message: job.message,
|
|
58
|
-
publicKey: aggregatePublicKeys(job.sets.map((set, i) => set.publicKey.multiplyBy(randomness[i]))),
|
|
59
|
-
signature: aggregateSignatures(signatures.map((sig, i) => sig.multiplyBy(randomness[i]))),
|
|
60
56
|
},
|
|
61
57
|
],
|
|
62
58
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobItem.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/jobItem.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,EAAC,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAgB,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAC,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAChD,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAyBlD,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,uCAAmB,CAAA;IACnB,gDAA4B,CAAA;AAC9B,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAiB;IAC9C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,gBAAgB,CAAC,OAAO;YAC3B,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QACzB,KAAK,gBAAgB,CAAC,WAAW;YAC/B,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAiB,EAAE,MAAmB,EAAE,OAAuB;IAC5F,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,gBAAgB,CAAC,OAAO;YAC3B,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC3B,+CAA+C;oBAC/C,SAAS,EAAE,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC5D,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,WAAW;iBACzB,CAAC,CAAC;aACJ,CAAC;QACJ,KAAK,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YAClC,2HAA2H;YAC3H,sGAAsG;YACtG,8CAA8C;YAC9C,2FAA2F;YAC3F,2GAA2G;YAC3G,uCAAuC;YACvC,uGAAuG;YACvG,MAAM,KAAK,GAAG,OAAO,EAAE,aAAa,CAAC,0CAA0C,CAAC,UAAU,EAAE,CAAC;YAC7F,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACzG,KAAK,EAAE,EAAE,CAAC;YAEV,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE;oBACJ;wBACE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;wBACxF,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;wBAC9D,OAAO,EAAE,GAAG,CAAC,OAAO;qBACrB;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,GAA4B;IACvE,0BAA0B;IAC1B,uEAAuE;IACvE,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,UAAU,EAAuB,CAAC;IAEnD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CACX,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,gBAAgB,CAAC,OAAO;gBAC9B,OAAO;gBACP,MAAM;gBACN,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,IAAI,EAAE,EAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAC;gBACrD,IAAI,EAAE;oBACJ;wBACE,IAAI,EAAE,gBAAgB,CAAC,MAAM;wBAC7B,MAAM,EAAE,GAAG,CAAC,SAAS;wBACrB,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,WAAW,EAAE,GAAG,CAAC,OAAO;qBACzB;iBACF;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
let defaultPoolSize;
|
|
2
|
+
try {
|
|
3
|
+
if (typeof navigator !== "undefined") {
|
|
4
|
+
defaultPoolSize = navigator.hardwareConcurrency ?? 4;
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
defaultPoolSize = (await import("node:os")).availableParallelism();
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
defaultPoolSize = 8;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Cross-platform aprox number of logical cores
|
|
15
|
+
*/
|
|
16
|
+
export { defaultPoolSize };
|
|
17
|
+
//# sourceMappingURL=poolSize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poolSize.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/poolSize.ts"],"names":[],"mappings":"AAAA,IAAI,eAAuB,CAAC;AAE5B,IAAI,CAAC;IACH,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,eAAe,GAAG,SAAS,CAAC,mBAAmB,IAAI,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACrE,CAAC;AACH,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,eAAe,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,OAAO,EAAC,eAAe,EAAC,CAAC"}
|