@lodestar/beacon-node 1.47.0-dev.d9c16ea16f → 1.47.0-dev.da8dfeabda
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.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +4 -7
- 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 +12 -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/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +12 -22
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +5 -0
- package/lib/api/impl/validator/utils.d.ts.map +1 -1
- package/lib/api/impl/validator/utils.js +18 -12
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/metrics.js +21 -0
- package/lib/chain/archiveStore/historicalState/metrics.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 +3 -2
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +11 -9
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +15 -7
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +22 -12
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.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/builderCircuitBreaker.d.ts +6 -5
- package/lib/chain/builderCircuitBreaker.d.ts.map +1 -1
- package/lib/chain/builderCircuitBreaker.js +28 -15
- package/lib/chain/builderCircuitBreaker.js.map +1 -1
- package/lib/chain/chain.d.ts +3 -2
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +8 -5
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +2 -0
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +6 -1
- package/lib/chain/errors/blockError.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/options.d.ts +1 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +1 -1
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +2 -0
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +6 -1
- package/lib/chain/produceBlock/produceBlockBody.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/seenCache/seenBlockProposers.d.ts +5 -1
- package/lib/chain/seenCache/seenBlockProposers.d.ts.map +1 -1
- package/lib/chain/seenCache/seenBlockProposers.js +10 -3
- package/lib/chain/seenCache/seenBlockProposers.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/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +21 -7
- package/lib/chain/validation/block.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/execution/builder/http.d.ts +10 -7
- package/lib/execution/builder/http.d.ts.map +1 -1
- package/lib/execution/builder/http.js +11 -8
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +3 -3
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +9 -9
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +48 -18
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +96 -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/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +32 -5
- package/lib/network/processor/gossipHandlers.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/range/batch.d.ts +23 -5
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +61 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +2 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +23 -10
- package/lib/sync/range/chain.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 +110 -14
- package/lib/sync/unknownBlock.js.map +1 -1
- package/package.json +18 -18
- package/src/api/impl/beacon/blocks/index.ts +5 -7
- package/src/api/impl/beacon/pool/index.ts +12 -1
- package/src/api/impl/beacon/state/utils.ts +2 -1
- package/src/api/impl/events/index.ts +10 -4
- package/src/api/impl/validator/index.ts +22 -27
- package/src/api/impl/validator/utils.ts +30 -15
- package/src/chain/archiveStore/historicalState/metrics.ts +22 -0
- package/src/chain/blocks/importBlock.ts +1 -6
- package/src/chain/blocks/importExecutionPayload.ts +12 -11
- package/src/chain/blocks/index.ts +19 -7
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +25 -16
- 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/builderCircuitBreaker.ts +31 -17
- package/src/chain/chain.ts +9 -5
- package/src/chain/errors/blockError.ts +9 -3
- 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/options.ts +1 -1
- package/src/chain/prepareNextSlot.ts +1 -1
- package/src/chain/produceBlock/produceBlockBody.ts +13 -0
- package/src/chain/seenCache/seenAttesters.ts +31 -5
- package/src/chain/seenCache/seenBlockProposers.ts +13 -3
- package/src/chain/validation/attestation.ts +1 -7
- package/src/chain/validation/attesterSlashing.ts +1 -8
- package/src/chain/validation/block.ts +21 -7
- 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/execution/builder/http.ts +11 -11
- package/src/metrics/metrics/beacon.ts +9 -9
- package/src/metrics/metrics/lodestar.ts +101 -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/processor/gossipHandlers.ts +35 -3
- 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/range/batch.ts +83 -28
- package/src/sync/range/chain.ts +26 -11
- package/src/sync/types.ts +3 -1
- package/src/sync/unknownBlock.ts +126 -17
- 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,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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/chain/bls/utils.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/chain/bls/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,wCAAwC,EACxC,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAgB,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,4BAA4B,CAAC;AAG9F,MAAM,UAAU,4BAA4B,CAAC,aAA8B;IACzE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,IAAI,2BAA2B,EAAE,CAAC;QACvF,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,2BAA2B,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,IAA+B;IAC3E,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,wCAAwC,EAAE,CAAC;QAC3F,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,wCAAwC,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,aAA8B;IACtE,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;YAC5C,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IForkChoice } from "@lodestar/fork-choice";
|
|
1
|
+
import { IForkChoice, ProtoBlock } from "@lodestar/fork-choice";
|
|
2
2
|
import { Slot } from "@lodestar/types";
|
|
3
3
|
import { Logger } from "@lodestar/utils";
|
|
4
4
|
import { Metrics } from "../metrics/index.js";
|
|
@@ -14,8 +14,9 @@ export type BuilderCircuitBreakerModules = {
|
|
|
14
14
|
/**
|
|
15
15
|
* Post-gloas circuit breaker for builder bids. The beacon block is produced by the proposer
|
|
16
16
|
* regardless of bid source, so missed blocks are not a useful builder health signal. Instead
|
|
17
|
-
* count blocks
|
|
18
|
-
*
|
|
17
|
+
* count canonical blocks selected as EMPTY. Activate when the proportion of EMPTY blocks exceeds
|
|
18
|
+
* the fault budget, and resume selecting builder bids only when the observed blocks are within
|
|
19
|
+
* budget and meet the minimum recovery sample size.
|
|
19
20
|
*/
|
|
20
21
|
export declare class BuilderCircuitBreaker {
|
|
21
22
|
private readonly modules;
|
|
@@ -25,7 +26,7 @@ export declare class BuilderCircuitBreaker {
|
|
|
25
26
|
private lastUpdatedSlot;
|
|
26
27
|
constructor(opts: BuilderCircuitBreakerOpts, modules: BuilderCircuitBreakerModules);
|
|
27
28
|
/** Whether builder bids must be ignored for a block produced at clockSlot */
|
|
28
|
-
isActive(clockSlot: Slot): boolean;
|
|
29
|
-
update(clockSlot: Slot): void;
|
|
29
|
+
isActive(clockSlot: Slot, head: ProtoBlock): boolean;
|
|
30
|
+
update(clockSlot: Slot, head: ProtoBlock): void;
|
|
30
31
|
}
|
|
31
32
|
//# sourceMappingURL=builderCircuitBreaker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builderCircuitBreaker.d.ts","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"builderCircuitBreaker.d.ts","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAE5C,MAAM,MAAM,yBAAyB,GAAG;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,WAAW,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB,CAAC;AAKF;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAS9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAM;IAE7B,YACE,IAAI,EAAE,yBAAyB,EACd,OAAO,EAAE,4BAA4B,EAMvD;IAED,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAGnD;IAED,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CA8C9C;CACF"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { getFaultInspectionParams } from "../execution/builder/http.js";
|
|
2
|
+
/** Four observations is the minimum useful recovery sample for the default ~25% fault budget */
|
|
3
|
+
const MIN_BLOCKS_TO_DEACTIVATE = 4;
|
|
2
4
|
/**
|
|
3
5
|
* Post-gloas circuit breaker for builder bids. The beacon block is produced by the proposer
|
|
4
6
|
* regardless of bid source, so missed blocks are not a useful builder health signal. Instead
|
|
5
|
-
* count blocks
|
|
6
|
-
*
|
|
7
|
+
* count canonical blocks selected as EMPTY. Activate when the proportion of EMPTY blocks exceeds
|
|
8
|
+
* the fault budget, and resume selecting builder bids only when the observed blocks are within
|
|
9
|
+
* budget and meet the minimum recovery sample size.
|
|
7
10
|
*/
|
|
8
11
|
export class BuilderCircuitBreaker {
|
|
9
12
|
modules;
|
|
@@ -16,30 +19,40 @@ export class BuilderCircuitBreaker {
|
|
|
16
19
|
const { faultInspectionWindow, allowedFaults } = getFaultInspectionParams(opts);
|
|
17
20
|
this.faultInspectionWindow = faultInspectionWindow;
|
|
18
21
|
this.allowedFaults = allowedFaults;
|
|
22
|
+
this.modules.logger.info("Builder circuit breaker initialized", { faultInspectionWindow, allowedFaults });
|
|
19
23
|
}
|
|
20
24
|
/** Whether builder bids must be ignored for a block produced at clockSlot */
|
|
21
|
-
isActive(clockSlot) {
|
|
22
|
-
this.update(clockSlot);
|
|
25
|
+
isActive(clockSlot, head) {
|
|
26
|
+
this.update(clockSlot, head);
|
|
23
27
|
return this.active;
|
|
24
28
|
}
|
|
25
|
-
update(clockSlot) {
|
|
29
|
+
update(clockSlot, head) {
|
|
26
30
|
if (clockSlot <= this.lastUpdatedSlot) {
|
|
27
31
|
return;
|
|
28
32
|
}
|
|
29
33
|
this.lastUpdatedSlot = clockSlot;
|
|
30
|
-
// Exclude clockSlot itself, its payload
|
|
31
|
-
const {
|
|
32
|
-
const
|
|
34
|
+
// Exclude clockSlot itself, its payload status may still be unresolved
|
|
35
|
+
const { full, empty } = this.modules.forkChoice.getCanonicalPayloadCounts(Math.max(clockSlot - this.faultInspectionWindow, 0), clockSlot - 1, head);
|
|
36
|
+
const canonicalBlocks = full + empty;
|
|
33
37
|
const wasActive = this.active;
|
|
34
|
-
// Scale the fault budget by blocks
|
|
35
|
-
|
|
38
|
+
// Scale the fault budget by canonical blocks so sparse windows still trigger on high EMPTY rates
|
|
39
|
+
const exceedsFaultBudget = empty * this.faultInspectionWindow > this.allowedFaults * canonicalBlocks;
|
|
40
|
+
if (exceedsFaultBudget) {
|
|
41
|
+
this.active = true;
|
|
42
|
+
}
|
|
43
|
+
else if (canonicalBlocks >= MIN_BLOCKS_TO_DEACTIVATE) {
|
|
44
|
+
// Require a minimum sample within the fault budget before accepting builder bids again
|
|
45
|
+
this.active = false;
|
|
46
|
+
}
|
|
36
47
|
this.modules.metrics?.builderCircuitBreaker.active.set(this.active ? 1 : 0);
|
|
37
|
-
this.modules.metrics?.builderCircuitBreaker.
|
|
38
|
-
this.modules.metrics?.builderCircuitBreaker.
|
|
39
|
-
this.modules.metrics?.builderCircuitBreaker.
|
|
48
|
+
this.modules.metrics?.builderCircuitBreaker.canonicalBlocks.set(canonicalBlocks);
|
|
49
|
+
this.modules.metrics?.builderCircuitBreaker.fullBlocks.set(full);
|
|
50
|
+
this.modules.metrics?.builderCircuitBreaker.emptyBlocks.set(empty);
|
|
40
51
|
const logCtx = {
|
|
41
|
-
|
|
42
|
-
|
|
52
|
+
clockSlot,
|
|
53
|
+
canonicalBlocks,
|
|
54
|
+
full,
|
|
55
|
+
empty,
|
|
43
56
|
faultInspectionWindow: this.faultInspectionWindow,
|
|
44
57
|
allowedFaults: this.allowedFaults,
|
|
45
58
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builderCircuitBreaker.js","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AActE
|
|
1
|
+
{"version":3,"file":"builderCircuitBreaker.js","sourceRoot":"","sources":["../../src/chain/builderCircuitBreaker.ts"],"names":[],"mappings":"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"}
|