@lodestar/beacon-node 1.47.0-dev.5275d4ed88 → 1.47.0-dev.57f6ac1a8b
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/impl/beacon/blocks/index.js +1 -1
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +8 -1
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/events/index.d.ts +1 -1
- package/lib/api/impl/events/index.d.ts.map +1 -1
- package/lib/api/impl/events/index.js +10 -3
- package/lib/api/impl/events/index.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +2 -7
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +1 -1
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +2 -2
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
- package/lib/chain/bls/index.d.ts +1 -1
- package/lib/chain/bls/index.d.ts.map +1 -1
- package/lib/chain/bls/interface.d.ts +5 -5
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +5 -11
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +116 -101
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/jobItem.d.ts +5 -19
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
- package/lib/chain/bls/multithread/jobItem.js +10 -65
- package/lib/chain/bls/multithread/jobItem.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +29 -8
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/types.js +12 -0
- package/lib/chain/bls/multithread/types.js.map +1 -1
- package/lib/chain/bls/multithread/utils.d.ts +4 -0
- package/lib/chain/bls/multithread/utils.d.ts.map +1 -1
- package/lib/chain/bls/multithread/utils.js +10 -0
- package/lib/chain/bls/multithread/utils.js.map +1 -1
- package/lib/chain/bls/multithread/worker.js +49 -23
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.d.ts +4 -10
- package/lib/chain/bls/singleThread.d.ts.map +1 -1
- package/lib/chain/bls/singleThread.js +8 -45
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.d.ts +4 -4
- package/lib/chain/bls/utils.d.ts.map +1 -1
- package/lib/chain/bls/utils.js +18 -19
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +2 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +6 -4
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/proposerPreferences.d.ts +6 -0
- package/lib/chain/errors/proposerPreferences.d.ts.map +1 -1
- package/lib/chain/errors/proposerPreferences.js +1 -0
- package/lib/chain/errors/proposerPreferences.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -1
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +1 -1
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +3 -3
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/seenCache/seenAttesters.d.ts +9 -5
- package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
- package/lib/chain/seenCache/seenAttesters.js +25 -4
- package/lib/chain/seenCache/seenAttesters.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts.map +1 -1
- package/lib/chain/validation/attestation.js +1 -4
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +1 -1
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +1 -2
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +5 -14
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validation/proposerPreferences.d.ts +1 -1
- package/lib/chain/validation/proposerPreferences.d.ts.map +1 -1
- package/lib/chain/validation/proposerPreferences.js +13 -4
- package/lib/chain/validation/proposerPreferences.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +38 -18
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +80 -50
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -0
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +37 -0
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +10 -2
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +22 -43
- package/lib/network/network.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +5 -11
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/util.d.ts +0 -1
- package/lib/network/util.d.ts.map +1 -1
- package/lib/network/util.js +0 -4
- package/lib/network/util.js.map +1 -1
- package/lib/node/nodejs.d.ts +2 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/types.d.ts.map +1 -1
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +9 -0
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +93 -9
- package/lib/sync/unknownBlock.js.map +1 -1
- package/package.json +15 -15
- package/src/api/impl/beacon/blocks/index.ts +1 -1
- package/src/api/impl/beacon/pool/index.ts +7 -1
- package/src/api/impl/beacon/state/utils.ts +2 -1
- package/src/api/impl/events/index.ts +10 -4
- package/src/chain/blocks/importBlock.ts +1 -6
- package/src/chain/blocks/importExecutionPayload.ts +0 -1
- package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +1 -9
- package/src/chain/bls/index.ts +1 -1
- package/src/chain/bls/interface.ts +7 -3
- package/src/chain/bls/multithread/index.ts +148 -120
- package/src/chain/bls/multithread/jobItem.ts +12 -82
- package/src/chain/bls/multithread/types.ts +33 -8
- package/src/chain/bls/multithread/utils.ts +11 -0
- package/src/chain/bls/multithread/worker.ts +85 -27
- package/src/chain/bls/singleThread.ts +11 -55
- package/src/chain/bls/utils.ts +23 -24
- package/src/chain/chain.ts +7 -5
- package/src/chain/errors/proposerPreferences.ts +7 -0
- package/src/chain/interface.ts +2 -1
- package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
- package/src/chain/opPools/attestationPool.ts +1 -1
- package/src/chain/opPools/payloadAttestationPool.ts +3 -3
- package/src/chain/opPools/syncCommitteeMessagePool.ts +1 -1
- package/src/chain/opPools/syncContributionAndProofPool.ts +1 -1
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/seenCache/seenAttesters.ts +31 -5
- package/src/chain/validation/attestation.ts +1 -7
- package/src/chain/validation/attesterSlashing.ts +1 -8
- package/src/chain/validation/executionPayloadBid.ts +1 -2
- package/src/chain/validation/executionPayloadEnvelope.ts +0 -1
- package/src/chain/validation/payloadAttestationMessage.ts +6 -17
- package/src/chain/validation/proposerPreferences.ts +15 -5
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/metrics/metrics/lodestar.ts +85 -51
- package/src/network/gossip/topic.ts +38 -0
- package/src/network/libp2p/index.ts +11 -2
- package/src/network/network.ts +27 -55
- package/src/network/reqresp/score.ts +5 -11
- package/src/network/util.ts +0 -5
- package/src/node/nodejs.ts +2 -1
- package/src/sync/types.ts +3 -1
- package/src/sync/unknownBlock.ts +108 -12
- package/lib/chain/bls/maybeBatch.d.ts +0 -12
- package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
- package/lib/chain/bls/maybeBatch.js +0 -35
- package/lib/chain/bls/maybeBatch.js.map +0 -1
- package/src/chain/bls/maybeBatch.ts +0 -45
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { LinkedList } from "../../../util/array.js";
|
|
5
|
-
import { VerifySignatureOpts } from "../interface.js";
|
|
6
|
-
import { BlsWorkReq } from "./types.js";
|
|
1
|
+
import { ISignatureSet } from "@lodestar/state-transition";
|
|
2
|
+
import { SameMessageSignatureSet, VerifySignatureOpts } from "../interface.js";
|
|
3
|
+
import { BlsWorkReq, JobQueueItemType } from "./types.js";
|
|
7
4
|
export type JobQueueItem = JobQueueItemDefault | JobQueueItemSameMessage;
|
|
8
5
|
export type JobQueueItemDefault = {
|
|
9
6
|
type: JobQueueItemType.default;
|
|
@@ -19,16 +16,9 @@ export type JobQueueItemSameMessage = {
|
|
|
19
16
|
reject: (error?: Error) => void;
|
|
20
17
|
addedTimeMs: number;
|
|
21
18
|
opts: VerifySignatureOpts;
|
|
22
|
-
sets:
|
|
23
|
-
publicKey: PublicKey;
|
|
24
|
-
signature: Uint8Array;
|
|
25
|
-
}[];
|
|
19
|
+
sets: SameMessageSignatureSet[];
|
|
26
20
|
message: Uint8Array;
|
|
27
21
|
};
|
|
28
|
-
export declare enum JobQueueItemType {
|
|
29
|
-
default = "default",
|
|
30
|
-
sameMessage = "same_message"
|
|
31
|
-
}
|
|
32
22
|
/**
|
|
33
23
|
* Return count of signature sets from a JobQueueItem
|
|
34
24
|
*/
|
|
@@ -37,9 +27,5 @@ export declare function jobItemSigSets(job: JobQueueItem): number;
|
|
|
37
27
|
* Prepare BlsWorkReq from JobQueueItem
|
|
38
28
|
* WARNING: May throw with untrusted user input
|
|
39
29
|
*/
|
|
40
|
-
export declare function jobItemWorkReq(job: JobQueueItem
|
|
41
|
-
/**
|
|
42
|
-
* Convert a JobQueueItemSameMessage into multiple JobQueueItemDefault linked to the original promise
|
|
43
|
-
*/
|
|
44
|
-
export declare function jobItemSameMessageToMultiSet(job: JobQueueItemSameMessage): LinkedList<JobQueueItemDefault>;
|
|
30
|
+
export declare function jobItemWorkReq(job: JobQueueItem): BlsWorkReq;
|
|
45
31
|
//# sourceMappingURL=jobItem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobItem.d.ts","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/jobItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"jobItem.d.ts","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/jobItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAoB,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAC,uBAAuB,EAAE,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAC,UAAU,EAAE,gBAAgB,EAAC,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,uBAAuB,CAAC;AAEzE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC;IAC/B,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC;IACnC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,uBAAuB,EAAE,CAAC;IAChC,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,CAgB5D"}
|
|
@@ -1,85 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { LinkedList } from "../../../util/array.js";
|
|
4
|
-
import { getAggregatedPubkey } from "../utils.js";
|
|
5
|
-
export var JobQueueItemType;
|
|
6
|
-
(function (JobQueueItemType) {
|
|
7
|
-
JobQueueItemType["default"] = "default";
|
|
8
|
-
JobQueueItemType["sameMessage"] = "same_message";
|
|
9
|
-
})(JobQueueItemType || (JobQueueItemType = {}));
|
|
1
|
+
import { toBlsSignatureSet } from "@lodestar/state-transition";
|
|
2
|
+
import { JobQueueItemType } from "./types.js";
|
|
10
3
|
/**
|
|
11
4
|
* Return count of signature sets from a JobQueueItem
|
|
12
5
|
*/
|
|
13
6
|
export function jobItemSigSets(job) {
|
|
14
|
-
|
|
15
|
-
case JobQueueItemType.default:
|
|
16
|
-
return job.sets.length;
|
|
17
|
-
case JobQueueItemType.sameMessage:
|
|
18
|
-
return 1;
|
|
19
|
-
}
|
|
7
|
+
return job.sets.length;
|
|
20
8
|
}
|
|
21
9
|
/**
|
|
22
10
|
* Prepare BlsWorkReq from JobQueueItem
|
|
23
11
|
* WARNING: May throw with untrusted user input
|
|
24
12
|
*/
|
|
25
|
-
export
|
|
13
|
+
export function jobItemWorkReq(job) {
|
|
26
14
|
switch (job.type) {
|
|
27
15
|
case JobQueueItemType.default:
|
|
28
16
|
return {
|
|
17
|
+
type: JobQueueItemType.default,
|
|
29
18
|
opts: job.opts,
|
|
30
|
-
sets: job.sets.map(
|
|
31
|
-
// this can throw, handled in the consumer code
|
|
32
|
-
publicKey: getAggregatedPubkey(set, pubkeyCache, metrics).toBytes(),
|
|
33
|
-
signature: set.signature,
|
|
34
|
-
message: set.signingRoot,
|
|
35
|
-
})),
|
|
19
|
+
sets: job.sets.map(toBlsSignatureSet),
|
|
36
20
|
};
|
|
37
|
-
case JobQueueItemType.sameMessage:
|
|
38
|
-
const timer = metrics?.blsThreadPool.aggregateWithRandomnessAsyncDuration.startTimer();
|
|
39
|
-
const { pk, sig } = await asyncAggregateWithRandomness(job.sets.map((set) => ({ pk: set.publicKey, sig: set.signature })));
|
|
40
|
-
timer?.();
|
|
21
|
+
case JobQueueItemType.sameMessage:
|
|
41
22
|
return {
|
|
23
|
+
type: JobQueueItemType.sameMessage,
|
|
42
24
|
opts: job.opts,
|
|
43
|
-
sets:
|
|
44
|
-
|
|
45
|
-
publicKey: pk.toBytes(),
|
|
46
|
-
signature: sig.toBytes(),
|
|
47
|
-
message: job.message,
|
|
48
|
-
},
|
|
49
|
-
],
|
|
25
|
+
sets: job.sets,
|
|
26
|
+
message: job.message,
|
|
50
27
|
};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Convert a JobQueueItemSameMessage into multiple JobQueueItemDefault linked to the original promise
|
|
56
|
-
*/
|
|
57
|
-
export function jobItemSameMessageToMultiSet(job) {
|
|
58
|
-
// Retry each individually
|
|
59
|
-
// Create new jobs for each pubkey set, and Promise.all all the results
|
|
60
|
-
const promises = [];
|
|
61
|
-
const jobs = new LinkedList();
|
|
62
|
-
for (const set of job.sets) {
|
|
63
|
-
promises.push(new Promise((resolve, reject) => {
|
|
64
|
-
jobs.push({
|
|
65
|
-
type: JobQueueItemType.default,
|
|
66
|
-
resolve,
|
|
67
|
-
reject,
|
|
68
|
-
addedTimeMs: job.addedTimeMs,
|
|
69
|
-
opts: { batchable: false, priority: job.opts.priority },
|
|
70
|
-
sets: [
|
|
71
|
-
{
|
|
72
|
-
type: SignatureSetType.single,
|
|
73
|
-
pubkey: set.publicKey,
|
|
74
|
-
signature: set.signature,
|
|
75
|
-
signingRoot: job.message,
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
});
|
|
79
|
-
}));
|
|
80
28
|
}
|
|
81
|
-
// Connect jobs to main job
|
|
82
|
-
Promise.all(promises).then(job.resolve, job.reject);
|
|
83
|
-
return jobs;
|
|
84
29
|
}
|
|
85
30
|
//# sourceMappingURL=jobItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobItem.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/jobItem.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"jobItem.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/jobItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,iBAAiB,EAAC,MAAM,4BAA4B,CAAC;AAE5E,OAAO,EAAa,gBAAgB,EAAC,MAAM,YAAY,CAAC;AAuBxD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAiB;IAC9C,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAiB;IAC9C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,gBAAgB,CAAC,OAAO;YAC3B,OAAO;gBACL,IAAI,EAAE,gBAAgB,CAAC,OAAO;gBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC;aACtC,CAAC;QACJ,KAAK,gBAAgB,CAAC,WAAW;YAC/B,OAAO;gBACL,IAAI,EAAE,gBAAgB,CAAC,WAAW;gBAClC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -1,20 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type BlsSignatureSet } from "@chainsafe/lodestar-z/bls-verifier";
|
|
2
|
+
import { SameMessageSignatureSet, VerifySignatureOpts } from "../interface.js";
|
|
2
3
|
export type WorkerData = {
|
|
3
4
|
workerId: number;
|
|
4
5
|
};
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export declare enum JobQueueItemType {
|
|
7
|
+
default = "default",
|
|
8
|
+
sameMessage = "same_message"
|
|
9
|
+
}
|
|
10
|
+
export type BlsWorkReqDefault = {
|
|
11
|
+
type: JobQueueItemType.default;
|
|
12
|
+
opts: VerifySignatureOpts;
|
|
13
|
+
sets: BlsSignatureSet[];
|
|
9
14
|
};
|
|
10
|
-
export type
|
|
15
|
+
export type BlsWorkReqSameMessage = {
|
|
16
|
+
type: JobQueueItemType.sameMessage;
|
|
11
17
|
opts: VerifySignatureOpts;
|
|
12
|
-
sets:
|
|
18
|
+
sets: SameMessageSignatureSet[];
|
|
19
|
+
message: Uint8Array;
|
|
13
20
|
};
|
|
21
|
+
export type BlsWorkReq = BlsWorkReqDefault | BlsWorkReqSameMessage;
|
|
14
22
|
export declare enum WorkResultCode {
|
|
15
23
|
success = "success",
|
|
16
24
|
error = "error"
|
|
17
25
|
}
|
|
26
|
+
export declare enum VerificationCallOperation {
|
|
27
|
+
batch = "batch",
|
|
28
|
+
single = "single",
|
|
29
|
+
fallback = "fallback",
|
|
30
|
+
sameMessage = "same_message"
|
|
31
|
+
}
|
|
32
|
+
export type VerificationCall = {
|
|
33
|
+
operation: VerificationCallOperation;
|
|
34
|
+
duration: number;
|
|
35
|
+
signatureSets: number;
|
|
36
|
+
};
|
|
18
37
|
export type WorkResultError = {
|
|
19
38
|
code: WorkResultCode.error;
|
|
20
39
|
error: Error;
|
|
@@ -30,10 +49,12 @@ export type BlsWorkResult = {
|
|
|
30
49
|
batchRetries: number;
|
|
31
50
|
/** Total num of sigs that have been successfully verified with batching */
|
|
32
51
|
batchSigsSuccess: number;
|
|
52
|
+
/** Every lodestar-z verification call made while processing this work group */
|
|
53
|
+
verificationCalls: VerificationCall[];
|
|
33
54
|
/** Time worker function starts - UNIX timestamp in seconds and nanoseconds */
|
|
34
55
|
workerStartTime: [number, number];
|
|
35
56
|
/** Time worker function ends - UNIX timestamp in seconds and nanoseconds */
|
|
36
57
|
workerEndTime: [number, number];
|
|
37
|
-
results: WorkResult<boolean>[];
|
|
58
|
+
results: WorkResult<boolean[]>[];
|
|
38
59
|
};
|
|
39
60
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,eAAe,EAAC,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAC,uBAAuB,EAAE,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AAE7E,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,oBAAY,gBAAgB;IAC1B,OAAO,YAAY;IACnB,WAAW,iBAAiB;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC;IAC/B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC;IACnC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,uBAAuB,EAAE,CAAC;IAChC,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,qBAAqB,CAAC;AAEnE,oBAAY,cAAc;IACxB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,oBAAY,yBAAyB;IACnC,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,WAAW,iBAAiB;CAC7B;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,yBAAyB,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAAC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAC,CAAC;AACzE,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAC,GAAG,eAAe,CAAC;AAExF,MAAM,MAAM,aAAa,GAAG;IAC1B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,8EAA8E;IAC9E,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,4EAA4E;IAC5E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;CAClC,CAAC"}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
|
+
export var JobQueueItemType;
|
|
2
|
+
(function (JobQueueItemType) {
|
|
3
|
+
JobQueueItemType["default"] = "default";
|
|
4
|
+
JobQueueItemType["sameMessage"] = "same_message";
|
|
5
|
+
})(JobQueueItemType || (JobQueueItemType = {}));
|
|
1
6
|
export var WorkResultCode;
|
|
2
7
|
(function (WorkResultCode) {
|
|
3
8
|
WorkResultCode["success"] = "success";
|
|
4
9
|
WorkResultCode["error"] = "error";
|
|
5
10
|
})(WorkResultCode || (WorkResultCode = {}));
|
|
11
|
+
export var VerificationCallOperation;
|
|
12
|
+
(function (VerificationCallOperation) {
|
|
13
|
+
VerificationCallOperation["batch"] = "batch";
|
|
14
|
+
VerificationCallOperation["single"] = "single";
|
|
15
|
+
VerificationCallOperation["fallback"] = "fallback";
|
|
16
|
+
VerificationCallOperation["sameMessage"] = "same_message";
|
|
17
|
+
})(VerificationCallOperation || (VerificationCallOperation = {}));
|
|
6
18
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,uCAAmB,CAAA;IACnB,gDAA4B,CAAA;AAC9B,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAiBD,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,qCAAmB,CAAA;IACnB,iCAAe,CAAA;AACjB,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAED,MAAM,CAAN,IAAY,yBAKX;AALD,WAAY,yBAAyB;IACnC,4CAAe,CAAA;IACf,8CAAiB,CAAA;IACjB,kDAAqB,CAAA;IACrB,yDAA4B,CAAA;AAC9B,CAAC,EALW,yBAAyB,KAAzB,yBAAyB,QAKpC"}
|
|
@@ -2,4 +2,8 @@
|
|
|
2
2
|
* Splits an array into an array of arrays maximizing the size of the smallest chunk.
|
|
3
3
|
*/
|
|
4
4
|
export declare function chunkifyMaximizeChunkSize<T>(arr: T[], minPerChunk: number): T[][];
|
|
5
|
+
/**
|
|
6
|
+
* Splits an array into chunks that do not exceed a maximum size.
|
|
7
|
+
*/
|
|
8
|
+
export declare function chunkifyMaxChunkSize<T>(arr: T[], maxPerChunk: number): T[][];
|
|
5
9
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAejF"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAejF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAM5E"}
|
|
@@ -14,4 +14,14 @@ export function chunkifyMaximizeChunkSize(arr, minPerChunk) {
|
|
|
14
14
|
}
|
|
15
15
|
return arrArr;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Splits an array into chunks that do not exceed a maximum size.
|
|
19
|
+
*/
|
|
20
|
+
export function chunkifyMaxChunkSize(arr, maxPerChunk) {
|
|
21
|
+
const chunks = [];
|
|
22
|
+
for (let i = 0; i < arr.length; i += maxPerChunk) {
|
|
23
|
+
chunks.push(arr.slice(i, i + maxPerChunk));
|
|
24
|
+
}
|
|
25
|
+
return chunks;
|
|
26
|
+
}
|
|
17
27
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAI,GAAQ,EAAE,WAAmB;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IACxD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IACpD,MAAM,MAAM,GAAU,EAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAI,GAAQ,EAAE,WAAmB;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IACxD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IACpD,MAAM,MAAM,GAAU,EAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAI,GAAQ,EAAE,WAAmB;IACnE,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import worker from "node:worker_threads";
|
|
2
|
-
import {
|
|
2
|
+
import { verifySignatureSets, verifySignatureSetsSameMessage, } from "@chainsafe/lodestar-z/bls-verifier";
|
|
3
3
|
import { expose } from "@chainsafe/threads/worker";
|
|
4
|
-
import {
|
|
5
|
-
import { WorkResultCode } from "./types.js";
|
|
4
|
+
import { JobQueueItemType, VerificationCallOperation, WorkResultCode, } from "./types.js";
|
|
6
5
|
import { chunkifyMaximizeChunkSize } from "./utils.js";
|
|
7
6
|
/**
|
|
8
7
|
* Split batchable sets in chunks of minimum size 16.
|
|
@@ -25,6 +24,7 @@ expose({
|
|
|
25
24
|
function verifyManySignatureSets(workReqArr) {
|
|
26
25
|
const [startSec, startNs] = process.hrtime();
|
|
27
26
|
const results = [];
|
|
27
|
+
const verificationCalls = [];
|
|
28
28
|
let batchRetries = 0;
|
|
29
29
|
let batchSigsSuccess = 0;
|
|
30
30
|
// If there are multiple batchable sets attempt batch verification with them
|
|
@@ -33,12 +33,26 @@ function verifyManySignatureSets(workReqArr) {
|
|
|
33
33
|
// Split sets between batchable and non-batchable preserving their original index in the req array
|
|
34
34
|
for (let i = 0; i < workReqArr.length; i++) {
|
|
35
35
|
const workReq = workReqArr[i];
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
switch (workReq.type) {
|
|
37
|
+
case JobQueueItemType.default: {
|
|
38
|
+
const { sets } = workReq;
|
|
39
|
+
if (workReq.opts.batchable) {
|
|
40
|
+
batchableSets.push({ idx: i, sets });
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
nonBatchableSets.push({ idx: i, sets, operation: VerificationCallOperation.single });
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case JobQueueItemType.sameMessage:
|
|
48
|
+
try {
|
|
49
|
+
const result = recordVerificationCall(verificationCalls, VerificationCallOperation.sameMessage, workReq.sets.length, () => verifySignatureSetsSameMessage(workReq.sets, workReq.message));
|
|
50
|
+
results[i] = { code: WorkResultCode.success, result };
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
results[i] = { code: WorkResultCode.error, error: e };
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
42
56
|
}
|
|
43
57
|
}
|
|
44
58
|
if (batchableSets.length > 0) {
|
|
@@ -53,33 +67,41 @@ function verifyManySignatureSets(workReqArr) {
|
|
|
53
67
|
}
|
|
54
68
|
try {
|
|
55
69
|
// Attempt to verify multiple sets at once
|
|
56
|
-
const isValid =
|
|
70
|
+
const isValid = recordVerificationCall(verificationCalls, VerificationCallOperation.batch, allSets.length, () => verifySignatureSets(allSets));
|
|
57
71
|
if (isValid) {
|
|
58
72
|
// The entire batch is valid, return success to all
|
|
59
73
|
for (const { idx, sets } of batchableChunk) {
|
|
60
74
|
batchSigsSuccess += sets.length;
|
|
61
|
-
results[idx] = { code: WorkResultCode.success, result: isValid };
|
|
75
|
+
results[idx] = { code: WorkResultCode.success, result: [isValid] };
|
|
62
76
|
}
|
|
63
77
|
}
|
|
64
78
|
else {
|
|
65
79
|
batchRetries++;
|
|
66
80
|
// Re-verify all sigs
|
|
67
|
-
nonBatchableSets.push(...batchableChunk)
|
|
81
|
+
nonBatchableSets.push(...batchableChunk.map(({ idx, sets }) => ({
|
|
82
|
+
idx,
|
|
83
|
+
sets,
|
|
84
|
+
operation: VerificationCallOperation.fallback,
|
|
85
|
+
})));
|
|
68
86
|
}
|
|
69
87
|
}
|
|
70
88
|
catch (_e) {
|
|
71
89
|
// TODO: Ignore this error expecting that the same error will happen when re-verifying the set individually
|
|
72
|
-
// It's not ideal but
|
|
90
|
+
// It's not ideal but the BLS implementation may throw errors on some conditions
|
|
73
91
|
batchRetries++;
|
|
74
92
|
// Re-verify all sigs
|
|
75
|
-
nonBatchableSets.push(...batchableChunk)
|
|
93
|
+
nonBatchableSets.push(...batchableChunk.map(({ idx, sets }) => ({
|
|
94
|
+
idx,
|
|
95
|
+
sets,
|
|
96
|
+
operation: VerificationCallOperation.fallback,
|
|
97
|
+
})));
|
|
76
98
|
}
|
|
77
99
|
}
|
|
78
100
|
}
|
|
79
|
-
for (const { idx, sets } of nonBatchableSets) {
|
|
101
|
+
for (const { idx, sets, operation } of nonBatchableSets) {
|
|
80
102
|
try {
|
|
81
|
-
const isValid =
|
|
82
|
-
results[idx] = { code: WorkResultCode.success, result: isValid };
|
|
103
|
+
const isValid = recordVerificationCall(verificationCalls, operation, sets.length, () => verifySignatureSets(sets));
|
|
104
|
+
results[idx] = { code: WorkResultCode.success, result: [isValid] };
|
|
83
105
|
}
|
|
84
106
|
catch (e) {
|
|
85
107
|
results[idx] = { code: WorkResultCode.error, error: e };
|
|
@@ -90,16 +112,20 @@ function verifyManySignatureSets(workReqArr) {
|
|
|
90
112
|
workerId,
|
|
91
113
|
batchRetries,
|
|
92
114
|
batchSigsSuccess,
|
|
115
|
+
verificationCalls,
|
|
93
116
|
workerStartTime: [startSec, startNs],
|
|
94
117
|
workerEndTime: [workerEndSec, workerEndNs],
|
|
95
118
|
results,
|
|
96
119
|
};
|
|
97
120
|
}
|
|
98
|
-
function
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
121
|
+
function recordVerificationCall(calls, operation, signatureSets, verify) {
|
|
122
|
+
const startTime = process.hrtime();
|
|
123
|
+
try {
|
|
124
|
+
return verify();
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
const [seconds, nanoseconds] = process.hrtime(startTime);
|
|
128
|
+
calls.push({ operation, signatureSets, duration: seconds + nanoseconds / 1e9 });
|
|
129
|
+
}
|
|
104
130
|
}
|
|
105
131
|
//# sourceMappingURL=worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/worker.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/chain/bls/multithread/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ISignatureSet, PubkeyCache } from "@lodestar/state-transition";
|
|
1
|
+
import { ISignatureSet } from "@lodestar/state-transition";
|
|
3
2
|
import { Metrics } from "../../metrics/index.js";
|
|
4
|
-
import { IBlsVerifier } from "./interface.js";
|
|
3
|
+
import { IBlsVerifier, SameMessageSignatureSet } from "./interface.js";
|
|
5
4
|
export declare class BlsSingleThreadVerifier implements IBlsVerifier {
|
|
6
5
|
private readonly metrics;
|
|
7
|
-
|
|
8
|
-
constructor({ metrics, pubkeyCache }: {
|
|
6
|
+
constructor({ metrics }: {
|
|
9
7
|
metrics: Metrics | null;
|
|
10
|
-
pubkeyCache: PubkeyCache;
|
|
11
8
|
});
|
|
12
9
|
verifySignatureSets(sets: ISignatureSet[]): Promise<boolean>;
|
|
13
|
-
verifySignatureSetsSameMessage(sets:
|
|
14
|
-
publicKey: PublicKey;
|
|
15
|
-
signature: Uint8Array;
|
|
16
|
-
}[], message: Uint8Array): Promise<boolean[]>;
|
|
10
|
+
verifySignatureSetsSameMessage(sets: SameMessageSignatureSet[], message: Uint8Array): Promise<boolean[]>;
|
|
17
11
|
close(): Promise<void>;
|
|
18
12
|
canAcceptWork(): boolean;
|
|
19
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleThread.d.ts","sourceRoot":"","sources":["../../../src/chain/bls/singleThread.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"singleThread.d.ts","sourceRoot":"","sources":["../../../src/chain/bls/singleThread.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAC,YAAY,EAAE,uBAAuB,EAAC,MAAM,gBAAgB,CAAC;AAGrE,qBAAa,uBAAwB,YAAW,YAAY;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,YAAY,EAAC,OAAc,EAAC,EAAE;QAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;KAAC,EAEtD;IAEK,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAYjE;IAEK,8BAA8B,CAAC,IAAI,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAQ7G;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED,aAAa,IAAI,OAAO,CAGvB;CACF"}
|
|
@@ -1,23 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { getAggregatedPubkey, getAggregatedPubkeysCount } from "./utils.js";
|
|
1
|
+
import { verifySignatureSetsSameMessage } from "@chainsafe/lodestar-z/bls-verifier";
|
|
2
|
+
import { chunkSameMessageSignatureSets, getAggregatedPubkeysCount, verifySignatureSetsInBatches } from "./utils.js";
|
|
4
3
|
export class BlsSingleThreadVerifier {
|
|
5
4
|
metrics;
|
|
6
|
-
|
|
7
|
-
constructor({ metrics = null, pubkeyCache }) {
|
|
5
|
+
constructor({ metrics = null }) {
|
|
8
6
|
this.metrics = metrics;
|
|
9
|
-
this.pubkeyCache = pubkeyCache;
|
|
10
7
|
}
|
|
11
8
|
async verifySignatureSets(sets) {
|
|
12
9
|
this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
|
|
13
|
-
const setsAggregated = sets.map((set) => ({
|
|
14
|
-
publicKey: getAggregatedPubkey(set, this.pubkeyCache, this.metrics),
|
|
15
|
-
message: set.signingRoot,
|
|
16
|
-
signature: set.signature,
|
|
17
|
-
}));
|
|
18
|
-
// Count time after aggregating
|
|
19
10
|
const timer = this.metrics?.blsThreadPool.mainThreadDurationInThreadPool.startTimer();
|
|
20
|
-
const isValid =
|
|
11
|
+
const isValid = verifySignatureSetsInBatches(sets);
|
|
21
12
|
// Don't use a try/catch, only count run without exceptions
|
|
22
13
|
if (timer) {
|
|
23
14
|
timer();
|
|
@@ -26,39 +17,11 @@ export class BlsSingleThreadVerifier {
|
|
|
26
17
|
}
|
|
27
18
|
async verifySignatureSetsSameMessage(sets, message) {
|
|
28
19
|
const timer = this.metrics?.blsThreadPool.mainThreadDurationInThreadPool.startTimer();
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const signatures = sets.map((set) => {
|
|
33
|
-
try {
|
|
34
|
-
return Signature.fromBytes(set.signature, true);
|
|
35
|
-
}
|
|
36
|
-
catch (_) {
|
|
37
|
-
// at least one set has malformed signature
|
|
38
|
-
isAllValid = false;
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
if (isAllValid) {
|
|
43
|
-
const signature = aggregateSignatures(signatures);
|
|
44
|
-
isAllValid = verify(message, pubkey, signature);
|
|
45
|
-
}
|
|
46
|
-
let result;
|
|
47
|
-
if (isAllValid) {
|
|
48
|
-
result = sets.map(() => true);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
result = sets.map((set, i) => {
|
|
52
|
-
const sig = signatures[i];
|
|
53
|
-
if (sig === null) {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
return verify(message, set.publicKey, sig);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
if (timer) {
|
|
60
|
-
timer();
|
|
20
|
+
const result = [];
|
|
21
|
+
for (const setsChunk of chunkSameMessageSignatureSets(sets)) {
|
|
22
|
+
result.push(...verifySignatureSetsSameMessage(setsChunk, message));
|
|
61
23
|
}
|
|
24
|
+
timer?.();
|
|
62
25
|
return result;
|
|
63
26
|
}
|
|
64
27
|
async close() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleThread.js","sourceRoot":"","sources":["../../../src/chain/bls/singleThread.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"singleThread.js","sourceRoot":"","sources":["../../../src/chain/bls/singleThread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,8BAA8B,EAAC,MAAM,oCAAoC,CAAC;AAIlF,OAAO,EAAC,6BAA6B,EAAE,yBAAyB,EAAE,4BAA4B,EAAC,MAAM,YAAY,CAAC;AAElH,MAAM,OAAO,uBAAuB;IACjB,OAAO,CAAiB;IACzC,YAAY,EAAC,OAAO,GAAG,IAAI,EAA4B;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAqB;QAC7C,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,8BAA8B,CAAC,UAAU,EAAE,CAAC;QACtF,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;QAEnD,2DAA2D;QAC3D,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;QACV,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,8BAA8B,CAAC,IAA+B,EAAE,OAAmB;QACvF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,8BAA8B,CAAC,UAAU,EAAE,CAAC;QACtF,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,MAAM,SAAS,IAAI,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,EAAE,EAAE,CAAC;QACV,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,gBAAgB;IAClB,CAAC;IAED,aAAa;QACX,qFAAqF;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
package/lib/chain/bls/utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
1
|
+
import { ISignatureSet } from "@lodestar/state-transition";
|
|
2
|
+
import { SameMessageSignatureSet } from "./interface.js";
|
|
3
|
+
export declare function verifySignatureSetsInBatches(signatureSets: ISignatureSet[]): boolean;
|
|
4
|
+
export declare function chunkSameMessageSignatureSets(sets: SameMessageSignatureSet[]): SameMessageSignatureSet[][];
|
|
5
5
|
export declare function getAggregatedPubkeysCount(signatureSets: ISignatureSet[]): number;
|
|
6
6
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/chain/bls/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/chain/bls/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,aAAa,EAAsC,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAC,uBAAuB,EAAC,MAAM,gBAAgB,CAAC;AAEvD,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,aAAa,EAAE,GAAG,OAAO,CAapF;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,uBAAuB,EAAE,GAAG,uBAAuB,EAAE,EAAE,CAM1G;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,CAQhF"}
|
package/lib/chain/bls/utils.js
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { SignatureSetType } from "@lodestar/state-transition";
|
|
3
|
-
export function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const timer = metrics?.blsThreadPool.pubkeysAggregationMainThreadDuration.startTimer();
|
|
12
|
-
const pubkeys = signatureSet.indices.map((i) => {
|
|
13
|
-
return pubkeyCache.getOrThrow(i);
|
|
14
|
-
});
|
|
15
|
-
const aggregated = aggregatePublicKeys(pubkeys);
|
|
16
|
-
timer?.();
|
|
17
|
-
return aggregated;
|
|
1
|
+
import { BLS_VERIFIER_MAX_BATCH_SIZE, BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE, verifySignatureSets, } from "@chainsafe/lodestar-z/bls-verifier";
|
|
2
|
+
import { SignatureSetType, toBlsSignatureSet } from "@lodestar/state-transition";
|
|
3
|
+
export function verifySignatureSetsInBatches(signatureSets) {
|
|
4
|
+
if (signatureSets.length === 0) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
for (let start = 0; start < signatureSets.length; start += BLS_VERIFIER_MAX_BATCH_SIZE) {
|
|
8
|
+
const sets = signatureSets.slice(start, start + BLS_VERIFIER_MAX_BATCH_SIZE).map(toBlsSignatureSet);
|
|
9
|
+
if (!verifySignatureSets(sets)) {
|
|
10
|
+
return false;
|
|
18
11
|
}
|
|
19
|
-
default:
|
|
20
|
-
throw Error("Unknown signature set type");
|
|
21
12
|
}
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
export function chunkSameMessageSignatureSets(sets) {
|
|
16
|
+
const chunks = [];
|
|
17
|
+
for (let start = 0; start < sets.length; start += BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE) {
|
|
18
|
+
chunks.push(sets.slice(start, start + BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE));
|
|
19
|
+
}
|
|
20
|
+
return chunks;
|
|
22
21
|
}
|
|
23
22
|
export function getAggregatedPubkeysCount(signatureSets) {
|
|
24
23
|
let pubkeysCount = 0;
|