@lodestar/beacon-node 1.34.0-dev.d5a4e7a09c → 1.34.0-dev.eb034b5727
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 +136 -30
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts +1 -1
- package/lib/api/impl/debug/index.js +24 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +11 -5
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +1 -1
- package/lib/chain/archiveStore/archiveStore.js +2 -2
- package/lib/chain/archiveStore/interface.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +91 -23
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/beaconProposerCache.d.ts +1 -0
- package/lib/chain/beaconProposerCache.js +3 -0
- package/lib/chain/beaconProposerCache.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +3 -2
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +66 -23
- package/lib/chain/blocks/types.js +39 -5
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +21 -10
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +89 -15
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +17 -28
- package/lib/chain/chain.js +71 -6
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +18 -2
- package/lib/chain/emitter.js +13 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts +69 -0
- package/lib/chain/errors/dataColumnSidecarError.js +21 -0
- package/lib/chain/errors/dataColumnSidecarError.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.js +1 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/interface.d.ts +10 -4
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/options.d.ts +4 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.js +2 -1
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -2
- package/lib/chain/produceBlock/produceBlockBody.js +9 -4
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +3 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +28 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +64 -18
- package/lib/chain/seenCache/seenGossipBlockInput.js +321 -53
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +28 -0
- package/lib/chain/validation/dataColumnSidecar.js +248 -0
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -0
- package/lib/db/beacon.d.ts +3 -1
- package/lib/db/beacon.js +3 -1
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +3 -1
- package/lib/db/buckets.js +2 -0
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +3 -1
- package/lib/db/repositories/dataColumnSidecars.d.ts +47 -0
- package/lib/db/repositories/dataColumnSidecars.js +40 -0
- package/lib/db/repositories/dataColumnSidecars.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +15 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.js +23 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -0
- package/lib/db/repositories/index.js +2 -0
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/execution/builder/http.d.ts +18 -2
- package/lib/execution/builder/http.js +27 -8
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/interface.d.ts +3 -2
- package/lib/execution/engine/http.d.ts +6 -3
- package/lib/execution/engine/http.js +56 -42
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +4 -2
- package/lib/execution/engine/interface.js +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.js +5 -0
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +10 -0
- package/lib/execution/engine/types.js +6 -0
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +14 -0
- package/lib/metrics/metrics/beacon.js +57 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +24 -1
- package/lib/metrics/metrics/lodestar.js +45 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/metrics.d.ts +10 -3
- package/lib/network/core/metrics.js +22 -4
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +15 -4
- package/lib/network/core/networkCore.js +73 -23
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +5 -3
- package/lib/network/core/networkCoreWorkerHandler.js +6 -1
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +7 -4
- package/lib/network/events.d.ts +4 -2
- package/lib/network/events.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +2 -2
- package/lib/network/gossip/gossipsub.js +8 -6
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -1
- package/lib/network/gossip/interface.js +1 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/scoringParameters.d.ts +6 -2
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +1077 -1056
- package/lib/network/gossip/topic.js +29 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +9 -1
- package/lib/network/metadata.d.ts +9 -5
- package/lib/network/metadata.js +26 -5
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +12 -2
- package/lib/network/network.js +73 -11
- package/lib/network/network.js.map +1 -1
- package/lib/network/networkConfig.d.ts +12 -0
- package/lib/network/networkConfig.js +2 -0
- package/lib/network/networkConfig.js.map +1 -0
- package/lib/network/options.d.ts +1 -0
- package/lib/network/options.js +5 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/discover.d.ts +8 -3
- package/lib/network/peers/discover.js +99 -14
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +10 -4
- package/lib/network/peers/peerManager.js +105 -19
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +17 -3
- package/lib/network/peers/peersData.js.map +1 -1
- package/lib/network/peers/score/interface.d.ts +1 -1
- package/lib/network/peers/score/score.d.ts +2 -2
- package/lib/network/peers/score/score.js +4 -1
- package/lib/network/peers/score/score.js.map +1 -1
- package/lib/network/peers/score/store.d.ts +3 -1
- package/lib/network/peers/score/store.js +6 -2
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +7 -3
- package/lib/network/peers/utils/assertPeerRelevance.js +10 -1
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +18 -7
- package/lib/network/peers/utils/prioritizePeers.js +43 -7
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +8 -1
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +156 -10
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +5 -0
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/index.js +1 -0
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +2 -2
- package/lib/network/reqresp/ReqRespBeaconNode.js +36 -14
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +24 -4
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +259 -20
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +32 -6
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +283 -28
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +92 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +50 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.js +10 -0
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +4 -0
- package/lib/network/reqresp/protocols.js +20 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +11 -1
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.js +3 -0
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +11 -4
- package/lib/network/reqresp/types.js +12 -3
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/statusCache.d.ts +5 -5
- package/lib/network/statusCache.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +3 -0
- package/lib/network/subnets/interface.js +14 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/network/subnets/syncnetsService.js +4 -5
- package/lib/network/subnets/syncnetsService.js.map +1 -1
- package/lib/node/nodejs.js +1 -0
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/constants.d.ts +18 -3
- package/lib/sync/constants.js +21 -3
- package/lib/sync/constants.js.map +1 -1
- package/lib/sync/interface.d.ts +2 -2
- package/lib/sync/interface.js +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/range/batch.d.ts +17 -2
- package/lib/sync/range/batch.js +39 -7
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +15 -1
- package/lib/sync/range/chain.js +124 -33
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts +3 -2
- package/lib/sync/range/range.js +9 -3
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/chainTarget.d.ts +5 -1
- package/lib/sync/range/utils/chainTarget.js +26 -1
- package/lib/sync/range/utils/chainTarget.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.d.ts +19 -5
- package/lib/sync/range/utils/peerBalancer.js +104 -10
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/sync.js +1 -1
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +8 -1
- package/lib/sync/unknownBlock.js +223 -67
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/remoteSyncType.d.ts +4 -4
- package/lib/sync/utils/remoteSyncType.js.map +1 -1
- package/lib/util/blobs.d.ts +23 -1
- package/lib/util/blobs.js +156 -1
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +135 -0
- package/lib/util/dataColumns.js +353 -0
- package/lib/util/dataColumns.js.map +1 -0
- package/lib/util/metadata.d.ts +5 -0
- package/lib/util/metadata.js +10 -0
- package/lib/util/metadata.js.map +1 -1
- package/lib/util/sszBytes.d.ts +1 -0
- package/lib/util/sszBytes.js +17 -0
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +16 -16
- package/lib/network/reqresp/handlers/status.d.ts +0 -4
- package/lib/network/reqresp/handlers/status.js +0 -11
- package/lib/network/reqresp/handlers/status.js.map +0 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { isForkPostDeneb, isForkPostFulu } from "@lodestar/params";
|
|
1
2
|
import { DataAvailabilityStatus, computeTimeAtSlot } from "@lodestar/state-transition";
|
|
2
3
|
import { ErrorAborted } from "@lodestar/utils";
|
|
3
4
|
import { BlockError, BlockErrorCode } from "../errors/index.js";
|
|
4
5
|
import { validateBlobSidecars } from "../validation/blobSidecar.js";
|
|
5
|
-
import {
|
|
6
|
+
import { validateDataColumnsSidecars } from "../validation/dataColumnSidecar.js";
|
|
7
|
+
import { BlobSidecarValidation, BlockInputType, getBlockInput, } from "./types.js";
|
|
6
8
|
// we can now wait for full 12 seconds because unavailable block sync will try pulling
|
|
7
9
|
// the blobs from the network anyway after 500ms of seeing the block
|
|
8
10
|
const BLOB_AVAILABILITY_TIMEOUT = 12_000;
|
|
@@ -64,17 +66,26 @@ async function maybeValidateBlobs(chain, blockInput, signal, opts) {
|
|
|
64
66
|
// run full validation
|
|
65
67
|
const { block } = blockInput;
|
|
66
68
|
const blockSlot = block.message.slot;
|
|
67
|
-
const blobsData = blockInput.type === BlockInputType.availableData
|
|
68
|
-
? blockInput.blockData
|
|
69
|
-
: await raceWithCutoff(chain, blockInput, blockInput.cachedData.availabilityPromise, signal);
|
|
70
|
-
const { blobs } = blobsData;
|
|
71
69
|
const { blobKzgCommitments } = block.message.body;
|
|
72
70
|
const beaconBlockRoot = chain.config.getForkTypes(blockSlot).BeaconBlock.hashTreeRoot(block.message);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
const blockData = blockInput.type === BlockInputType.availableData
|
|
72
|
+
? blockInput.blockData
|
|
73
|
+
: await raceWithCutoff(chain, blockInput, blockInput.cachedData.availabilityPromise, signal);
|
|
74
|
+
if (isForkPostFulu(blockData.fork)) {
|
|
75
|
+
const { dataColumns } = blockData;
|
|
76
|
+
const skipProofsCheck = opts.validBlobSidecars === BlobSidecarValidation.Individual;
|
|
77
|
+
await validateDataColumnsSidecars(blockSlot, beaconBlockRoot, blobKzgCommitments, dataColumns, chain.metrics, {
|
|
78
|
+
skipProofsCheck,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else if (isForkPostDeneb(blockData.fork)) {
|
|
82
|
+
const { blobs } = blockData;
|
|
83
|
+
// if the blob sidecars have been individually verified then we can skip kzg proof check
|
|
84
|
+
// but other checks to match blobs with block data still need to be performed
|
|
85
|
+
const skipProofsCheck = opts.validBlobSidecars === BlobSidecarValidation.Individual;
|
|
86
|
+
await validateBlobSidecars(blockSlot, beaconBlockRoot, blobKzgCommitments, blobs, { skipProofsCheck });
|
|
87
|
+
}
|
|
88
|
+
const availableBlockInput = getBlockInput.availableData(chain.config, blockInput.block, blockInput.source, blockData);
|
|
78
89
|
return { dataAvailabilityStatus: DataAvailabilityStatus.Available, availableBlockInput: availableBlockInput };
|
|
79
90
|
}
|
|
80
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyBlocksDataAvailability.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlocksDataAvailability.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAE,iBAAiB,EAAC,MAAM,4BAA4B,CAAC;AAErF,OAAO,EAAC,YAAY,EAAS,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"verifyBlocksDataAvailability.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlocksDataAvailability.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { ForkName, NUMBER_OF_COLUMNS, isForkPostDeneb, isForkPostFulu } from "@lodestar/params";
|
|
2
|
+
import { ssz } from "@lodestar/types";
|
|
1
3
|
import { toRootHex } from "@lodestar/utils";
|
|
4
|
+
import { toHex } from "@lodestar/utils";
|
|
2
5
|
import { BlockInputType } from "./types.js";
|
|
3
6
|
/**
|
|
4
7
|
* Persists block input data to DB. This operation must be eventually completed if a block is imported to the fork-choice.
|
|
@@ -26,22 +29,68 @@ export async function writeBlockInputToDb(blocksInput) {
|
|
|
26
29
|
this.logger.debug("Persist block to hot DB", {
|
|
27
30
|
slot: block.message.slot,
|
|
28
31
|
root: blockRootHex,
|
|
32
|
+
inputType: blockInput.type,
|
|
29
33
|
});
|
|
30
34
|
if (blockInput.type === BlockInputType.availableData || blockInput.type === BlockInputType.dataPromise) {
|
|
31
|
-
const
|
|
32
|
-
? blockInput.blockData
|
|
33
|
-
:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
blobsLen
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
const blockData = blockInput.type === BlockInputType.availableData
|
|
36
|
+
? blockInput.blockData
|
|
37
|
+
: await blockInput.cachedData.availabilityPromise;
|
|
38
|
+
// NOTE: Old data is pruned on archive
|
|
39
|
+
if (isForkPostFulu(blockData.fork)) {
|
|
40
|
+
const { custodyConfig } = this;
|
|
41
|
+
const { custodyColumnsIndex, custodyColumns } = custodyConfig;
|
|
42
|
+
const blobsLen = block.message.body.blobKzgCommitments.length;
|
|
43
|
+
let dataColumnsLen;
|
|
44
|
+
let dataColumnsIndex;
|
|
45
|
+
if (blobsLen === 0) {
|
|
46
|
+
dataColumnsLen = 0;
|
|
47
|
+
dataColumnsIndex = new Uint8Array(NUMBER_OF_COLUMNS);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
dataColumnsLen = custodyColumns.length;
|
|
51
|
+
dataColumnsIndex = custodyColumnsIndex;
|
|
52
|
+
}
|
|
53
|
+
const blockDataColumns = blockData.dataColumns;
|
|
54
|
+
const dataColumnSidecars = blockDataColumns.filter((dataColumnSidecar) => custodyColumns.includes(dataColumnSidecar.index));
|
|
55
|
+
if (dataColumnSidecars.length !== dataColumnsLen) {
|
|
56
|
+
throw Error(`Invalid dataColumnSidecars=${dataColumnSidecars.length} for custody expected custodyColumnsLen=${dataColumnsLen}`);
|
|
57
|
+
}
|
|
58
|
+
const dataColumnsSize = ssz.fulu.DataColumnSidecar.minSize +
|
|
59
|
+
blobsLen * (ssz.fulu.Cell.fixedSize + ssz.deneb.KZGCommitment.fixedSize + ssz.deneb.KZGProof.fixedSize);
|
|
60
|
+
const slot = block.message.slot;
|
|
61
|
+
const writeData = {
|
|
62
|
+
blockRoot,
|
|
63
|
+
slot,
|
|
64
|
+
dataColumnsLen,
|
|
65
|
+
dataColumnsSize,
|
|
66
|
+
dataColumnsIndex,
|
|
67
|
+
dataColumnSidecars,
|
|
68
|
+
};
|
|
69
|
+
fnPromises.push(this.db.dataColumnSidecars.add(writeData));
|
|
70
|
+
this.logger.debug("Persisted dataColumnSidecars to hot DB", {
|
|
71
|
+
dataColumnsSize,
|
|
72
|
+
dataColumnsLen,
|
|
73
|
+
dataColumnSidecars: dataColumnSidecars.length,
|
|
74
|
+
slot: block.message.slot,
|
|
75
|
+
root: blockRootHex,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else if (isForkPostDeneb(blockData.fork)) {
|
|
79
|
+
const blobSidecars = blockData.blobs;
|
|
80
|
+
fnPromises.push(this.db.blobSidecars.add({ blockRoot, slot: block.message.slot, blobSidecars }));
|
|
81
|
+
this.logger.debug("Persisted blobSidecars to hot DB", {
|
|
82
|
+
blobsLen: blobSidecars.length,
|
|
83
|
+
slot: block.message.slot,
|
|
84
|
+
root: blockRootHex,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
42
87
|
}
|
|
43
88
|
}
|
|
44
89
|
await Promise.all(fnPromises);
|
|
90
|
+
this.logger.debug("Persisted blocksInput to db", {
|
|
91
|
+
blocksInput: blocksInput.length,
|
|
92
|
+
slots: blocksInput.map((blockInput) => blockInput.block.message.slot).join(" "),
|
|
93
|
+
});
|
|
45
94
|
}
|
|
46
95
|
/**
|
|
47
96
|
* Prunes eagerly persisted block inputs only if not known to the fork-choice
|
|
@@ -49,15 +98,39 @@ export async function writeBlockInputToDb(blocksInput) {
|
|
|
49
98
|
export async function removeEagerlyPersistedBlockInputs(blockInputs) {
|
|
50
99
|
const blockToRemove = [];
|
|
51
100
|
const blobsToRemove = [];
|
|
101
|
+
const dataColumnsToRemove = [];
|
|
52
102
|
for (const blockInput of blockInputs) {
|
|
53
103
|
const { block, type } = blockInput;
|
|
54
|
-
const
|
|
55
|
-
const
|
|
104
|
+
const slot = block.message.slot;
|
|
105
|
+
const blockRoot = this.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block.message);
|
|
106
|
+
const blockRootHex = toHex(blockRoot);
|
|
56
107
|
if (!this.forkChoice.hasBlockHex(blockRootHex)) {
|
|
57
108
|
blockToRemove.push(block);
|
|
58
109
|
if (type === BlockInputType.availableData) {
|
|
59
|
-
const
|
|
60
|
-
|
|
110
|
+
const { blockData } = blockInput;
|
|
111
|
+
if (blockData.fork === ForkName.deneb || blockData.fork === ForkName.electra) {
|
|
112
|
+
const blobSidecars = blockData.blobs;
|
|
113
|
+
blobsToRemove.push({ blockRoot, slot, blobSidecars });
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
const { custodyConfig } = this;
|
|
117
|
+
const { custodyColumnsIndex: dataColumnsIndex, custodyColumns } = custodyConfig;
|
|
118
|
+
const dataColumnsLen = custodyColumns.length;
|
|
119
|
+
const dataColumnSidecars = blockData.dataColumns.filter((dataColumnSidecar) => custodyColumns.includes(dataColumnSidecar.index));
|
|
120
|
+
if (dataColumnSidecars.length !== dataColumnsLen) {
|
|
121
|
+
throw Error(`Invalid dataColumnSidecars=${dataColumnSidecars.length} for custody expected custodyColumnsLen=${dataColumnsLen}`);
|
|
122
|
+
}
|
|
123
|
+
const blobsLen = block.message.body.blobKzgCommitments.length;
|
|
124
|
+
const dataColumnsSize = ssz.fulu.Cell.fixedSize * blobsLen;
|
|
125
|
+
dataColumnsToRemove.push({
|
|
126
|
+
blockRoot,
|
|
127
|
+
slot,
|
|
128
|
+
dataColumnsLen,
|
|
129
|
+
dataColumnsSize,
|
|
130
|
+
dataColumnsIndex,
|
|
131
|
+
dataColumnSidecars,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
61
134
|
}
|
|
62
135
|
}
|
|
63
136
|
}
|
|
@@ -65,6 +138,7 @@ export async function removeEagerlyPersistedBlockInputs(blockInputs) {
|
|
|
65
138
|
// TODO: Batch DB operations not with Promise.all but with level db ops
|
|
66
139
|
this.db.block.batchRemove(blockToRemove),
|
|
67
140
|
this.db.blobSidecars.batchRemove(blobsToRemove),
|
|
141
|
+
this.db.dataColumnSidecars.batchRemove(dataColumnsToRemove),
|
|
68
142
|
]);
|
|
69
143
|
}
|
|
70
144
|
//# sourceMappingURL=writeBlockInputToDb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeBlockInputToDb.js","sourceRoot":"","sources":["../../../src/chain/blocks/writeBlockInputToDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"writeBlockInputToDb.js","sourceRoot":"","sources":["../../../src/chain/blocks/writeBlockInputToDb.ts"],"names":[],"mappings":"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"}
|
package/lib/chain/chain.d.ts
CHANGED
|
@@ -3,15 +3,17 @@ import { CompositeTypeAny, TreeView, Type } from "@chainsafe/ssz";
|
|
|
3
3
|
import { BeaconConfig } from "@lodestar/config";
|
|
4
4
|
import { CheckpointWithHex, IForkChoice, ProtoBlock } from "@lodestar/fork-choice";
|
|
5
5
|
import { BeaconStateAllForks, CachedBeaconStateAllForks, EpochShuffling, Index2PubkeyCache } from "@lodestar/state-transition";
|
|
6
|
-
import { BeaconBlock, BlindedBeaconBlock, Epoch, Root, RootHex, SignedBeaconBlock, Slot, UintNum64, ValidatorIndex, Wei, deneb,
|
|
6
|
+
import { BeaconBlock, BlindedBeaconBlock, Epoch, Root, RootHex, SignedBeaconBlock, Slot, Status, UintNum64, ValidatorIndex, Wei, deneb, fulu } from "@lodestar/types";
|
|
7
7
|
import { Logger } from "@lodestar/utils";
|
|
8
8
|
import { ProcessShutdownCallback } from "@lodestar/validator";
|
|
9
|
+
import { PrivateKey } from "@libp2p/interface";
|
|
9
10
|
import { IBeaconDb } from "../db/index.js";
|
|
10
11
|
import { IEth1ForBlockProduction } from "../eth1/index.js";
|
|
11
12
|
import { IExecutionBuilder, IExecutionEngine } from "../execution/index.js";
|
|
12
13
|
import { Metrics } from "../metrics/index.js";
|
|
13
14
|
import { BufferPool } from "../util/bufferPool.js";
|
|
14
15
|
import { IClock } from "../util/clock.js";
|
|
16
|
+
import { CustodyConfig } from "../util/dataColumns.js";
|
|
15
17
|
import { SerializedCache } from "../util/serializedCache.js";
|
|
16
18
|
import { ArchiveStore } from "./archiveStore/archiveStore.js";
|
|
17
19
|
import { CheckpointBalancesCache } from "./balancesCache.js";
|
|
@@ -47,6 +49,7 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
47
49
|
readonly executionEngine: IExecutionEngine;
|
|
48
50
|
readonly executionBuilder?: IExecutionBuilder;
|
|
49
51
|
readonly config: BeaconConfig;
|
|
52
|
+
readonly custodyConfig: CustodyConfig;
|
|
50
53
|
readonly logger: Logger;
|
|
51
54
|
readonly metrics: Metrics | null;
|
|
52
55
|
readonly validatorMonitor: ValidatorMonitor | null;
|
|
@@ -81,7 +84,9 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
81
84
|
readonly checkpointBalancesCache: CheckpointBalancesCache;
|
|
82
85
|
readonly shufflingCache: ShufflingCache;
|
|
83
86
|
/** Map keyed by executionPayload.blockHash of the block for those blobs */
|
|
84
|
-
readonly producedContentsCache: Map<string, deneb.Contents
|
|
87
|
+
readonly producedContentsCache: Map<string, deneb.Contents & {
|
|
88
|
+
cells?: fulu.Cell[][];
|
|
89
|
+
}>;
|
|
85
90
|
readonly producedBlockRoot: Map<string, import("@chainsafe/ssz").ValueOfFields<{
|
|
86
91
|
transactions: import("@chainsafe/ssz").ListCompositeType<import("@chainsafe/ssz").ByteListType>;
|
|
87
92
|
parentHash: import("@chainsafe/ssz").ByteVectorType;
|
|
@@ -141,29 +146,6 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
141
146
|
extraData: import("@chainsafe/ssz").ByteListType;
|
|
142
147
|
baseFeePerGas: import("@chainsafe/ssz").UintBigintType;
|
|
143
148
|
blockHash: import("@chainsafe/ssz").ByteVectorType;
|
|
144
|
-
}> | import("@chainsafe/ssz").ValueOfFields<{
|
|
145
|
-
blobGasUsed: import("@chainsafe/ssz").UintBigintType;
|
|
146
|
-
excessBlobGas: import("@chainsafe/ssz").UintBigintType;
|
|
147
|
-
withdrawals: import("@chainsafe/ssz").ListCompositeType<import("@chainsafe/ssz").ContainerType<{
|
|
148
|
-
index: import("@chainsafe/ssz").UintNumberType;
|
|
149
|
-
validatorIndex: import("@chainsafe/ssz").UintNumberType;
|
|
150
|
-
address: import("@lodestar/types/lib/utils/executionAddress.js").ExecutionAddressType;
|
|
151
|
-
amount: import("@chainsafe/ssz").UintBigintType;
|
|
152
|
-
}>>;
|
|
153
|
-
transactions: import("@chainsafe/ssz").ListCompositeType<import("@chainsafe/ssz").ByteListType>;
|
|
154
|
-
parentHash: import("@chainsafe/ssz").ByteVectorType;
|
|
155
|
-
feeRecipient: import("@lodestar/types/lib/utils/executionAddress.js").ExecutionAddressType;
|
|
156
|
-
stateRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
157
|
-
receiptsRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
158
|
-
logsBloom: import("@chainsafe/ssz").ByteVectorType;
|
|
159
|
-
prevRandao: import("@chainsafe/ssz").ByteVectorType;
|
|
160
|
-
blockNumber: import("@chainsafe/ssz").UintNumberType;
|
|
161
|
-
gasLimit: import("@chainsafe/ssz").UintNumberType;
|
|
162
|
-
gasUsed: import("@chainsafe/ssz").UintNumberType;
|
|
163
|
-
timestamp: import("@chainsafe/ssz").UintNumberType;
|
|
164
|
-
extraData: import("@chainsafe/ssz").ByteListType;
|
|
165
|
-
baseFeePerGas: import("@chainsafe/ssz").UintBigintType;
|
|
166
|
-
blockHash: import("@chainsafe/ssz").ByteVectorType;
|
|
167
149
|
}> | null>;
|
|
168
150
|
readonly producedBlindedBlockRoot: Set<string>;
|
|
169
151
|
readonly blacklistedBlocks: Map<RootHex, Slot | null>;
|
|
@@ -173,7 +155,11 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
173
155
|
protected readonly db: IBeaconDb;
|
|
174
156
|
private abortController;
|
|
175
157
|
private processShutdownCallback;
|
|
176
|
-
|
|
158
|
+
private _earliestAvailableSlot;
|
|
159
|
+
get earliestAvailableSlot(): Slot;
|
|
160
|
+
set earliestAvailableSlot(slot: Slot);
|
|
161
|
+
constructor(opts: IChainOptions, { privateKey, config, db, dbName, dataDir, logger, processShutdownCallback, clock, metrics, validatorMonitor, anchorState, eth1, executionEngine, executionBuilder, }: {
|
|
162
|
+
privateKey: PrivateKey;
|
|
177
163
|
config: BeaconConfig;
|
|
178
164
|
db: IBeaconDb;
|
|
179
165
|
dbName: string;
|
|
@@ -271,10 +257,12 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
271
257
|
* kzg_aggregated_proof=compute_proof_from_blobs(blobs),
|
|
272
258
|
* )
|
|
273
259
|
*/
|
|
274
|
-
getContents(beaconBlock: deneb.BeaconBlock): deneb.Contents
|
|
260
|
+
getContents(beaconBlock: deneb.BeaconBlock): deneb.Contents & {
|
|
261
|
+
cells?: fulu.Cell[][];
|
|
262
|
+
};
|
|
275
263
|
processBlock(block: BlockInput, opts?: ImportBlockOpts): Promise<void>;
|
|
276
264
|
processChainSegment(blocks: BlockInput[], opts?: ImportBlockOpts): Promise<void>;
|
|
277
|
-
getStatus():
|
|
265
|
+
getStatus(): Status;
|
|
278
266
|
recomputeForkChoiceHead(caller: ForkchoiceCaller): ProtoBlock;
|
|
279
267
|
predictProposerHead(slot: Slot): ProtoBlock;
|
|
280
268
|
getProposerHead(slot: Slot): ProtoBlock;
|
|
@@ -322,6 +310,7 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
322
310
|
private onForkChoiceJustified;
|
|
323
311
|
private onForkChoiceFinalized;
|
|
324
312
|
updateBeaconProposerData(epoch: Epoch, proposers: ProposerPreparationData[]): Promise<void>;
|
|
313
|
+
private updateValidatorsCustodyRequirement;
|
|
325
314
|
updateBuilderStatus(clockSlot: Slot): void;
|
|
326
315
|
getBlockRewards(block: BeaconBlock | BlindedBeaconBlock): Promise<BlockRewards>;
|
|
327
316
|
getAttestationsRewards(epoch: Epoch, validatorIds?: (ValidatorIndex | string)[]): Promise<{
|
package/lib/chain/chain.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { PubkeyIndexMap } from "@chainsafe/pubkey-index-map";
|
|
3
3
|
import { ExecutionStatus, UpdateHeadOpt } from "@lodestar/fork-choice";
|
|
4
|
-
import { ForkSeq, GENESIS_SLOT, SLOTS_PER_EPOCH, isForkPostElectra } from "@lodestar/params";
|
|
4
|
+
import { ForkSeq, GENESIS_SLOT, NUMBER_OF_CUSTODY_GROUPS, SLOTS_PER_EPOCH, isForkPostElectra } from "@lodestar/params";
|
|
5
5
|
import { computeAnchorCheckpoint, computeEndSlotAtEpoch, computeEpochAtSlot, computeStartSlotAtEpoch, createCachedBeaconState, getEffectiveBalanceIncrementsZeroInactive, isCachedBeaconState, processSlots, } from "@lodestar/state-transition";
|
|
6
6
|
import { isBlindedBeaconBlock, } from "@lodestar/types";
|
|
7
7
|
import { fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRootHex } from "@lodestar/utils";
|
|
8
|
+
import { getEffectiveBalancesFromStateBytes } from "@lodestar/state-transition";
|
|
8
9
|
import { GENESIS_EPOCH, ZERO_HASH } from "../constants/index.js";
|
|
10
|
+
import { BuilderStatus } from "../execution/builder/http.js";
|
|
11
|
+
import { computeNodeIdFromPrivateKey } from "../network/subnets/interface.js";
|
|
9
12
|
import { BufferPool } from "../util/bufferPool.js";
|
|
10
13
|
import { Clock, ClockEvent } from "../util/clock.js";
|
|
14
|
+
import { CustodyConfig, getValidatorsCustodyRequirement } from "../util/dataColumns.js";
|
|
11
15
|
import { ensureDir, writeIfNotExist } from "../util/file.js";
|
|
12
16
|
import { isOptimisticBlock } from "../util/forkChoice.js";
|
|
13
17
|
import { SerializedCache } from "../util/serializedCache.js";
|
|
@@ -50,14 +54,22 @@ import { PersistentCheckpointStateCache } from "./stateCache/persistentCheckpoin
|
|
|
50
54
|
*/
|
|
51
55
|
const DEFAULT_MAX_CACHED_PRODUCED_ROOTS = 4;
|
|
52
56
|
export class BeaconChain {
|
|
53
|
-
|
|
57
|
+
get earliestAvailableSlot() {
|
|
58
|
+
return this._earliestAvailableSlot;
|
|
59
|
+
}
|
|
60
|
+
set earliestAvailableSlot(slot) {
|
|
61
|
+
if (this._earliestAvailableSlot !== slot) {
|
|
62
|
+
this._earliestAvailableSlot = slot;
|
|
63
|
+
this.emitter.emit(ChainEvent.updateStatus);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
constructor(opts, { privateKey, config, db, dbName, dataDir, logger, processShutdownCallback, clock, metrics, validatorMonitor, anchorState, eth1, executionEngine, executionBuilder, }) {
|
|
54
67
|
this.opPool = new OpPool();
|
|
55
68
|
// Gossip seen cache
|
|
56
69
|
this.seenAttesters = new SeenAttesters();
|
|
57
70
|
this.seenAggregators = new SeenAggregators();
|
|
58
71
|
this.seenBlockProposers = new SeenBlockProposers();
|
|
59
72
|
this.seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
|
|
60
|
-
this.seenGossipBlockInput = new SeenGossipBlockInput();
|
|
61
73
|
// Seen cache for liveness checks
|
|
62
74
|
this.seenBlockAttesters = new SeenBlockAttesters();
|
|
63
75
|
/** Map keyed by executionPayload.blockHash of the block for those blobs */
|
|
@@ -98,6 +110,15 @@ export class BeaconChain {
|
|
|
98
110
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
99
111
|
this.seenContributionAndProof = new SeenContributionAndProof(metrics);
|
|
100
112
|
this.seenAttestationDatas = new SeenAttestationDatas(metrics, this.opts?.attDataCacheSlotDistance);
|
|
113
|
+
const nodeId = computeNodeIdFromPrivateKey(privateKey);
|
|
114
|
+
const initialCustodyGroupCount = opts.initialCustodyGroupCount ?? (opts.supernode ? NUMBER_OF_CUSTODY_GROUPS : config.CUSTODY_REQUIREMENT);
|
|
115
|
+
this.metrics?.peerDas.targetCustodyGroupCount.set(initialCustodyGroupCount);
|
|
116
|
+
this.custodyConfig = new CustodyConfig({
|
|
117
|
+
nodeId,
|
|
118
|
+
config,
|
|
119
|
+
initialCustodyGroupCount,
|
|
120
|
+
});
|
|
121
|
+
this.seenGossipBlockInput = new SeenGossipBlockInput(this.custodyConfig, this.executionEngine, emitter, clock, logger);
|
|
101
122
|
this.beaconProposerCache = new BeaconProposerCache(opts);
|
|
102
123
|
this.checkpointBalancesCache = new CheckpointBalancesCache();
|
|
103
124
|
this.seenBlockInputCache = new SeenBlockInputCache({
|
|
@@ -120,6 +141,7 @@ export class BeaconChain {
|
|
|
120
141
|
pubkey2index: new PubkeyIndexMap(),
|
|
121
142
|
index2pubkey: [],
|
|
122
143
|
});
|
|
144
|
+
this._earliestAvailableSlot = cachedState.slot;
|
|
123
145
|
this.shufflingCache = cachedState.epochCtx.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
|
|
124
146
|
{
|
|
125
147
|
shuffling: cachedState.epochCtx.previousShuffling,
|
|
@@ -514,6 +536,7 @@ export class BeaconChain {
|
|
|
514
536
|
// TODO: PERFORMANCE: Memoize to prevent re-computing every time
|
|
515
537
|
headRoot: fromHex(head.blockRoot),
|
|
516
538
|
headSlot: head.slot,
|
|
539
|
+
earliestAvailableSlot: this._earliestAvailableSlot,
|
|
517
540
|
};
|
|
518
541
|
}
|
|
519
542
|
recomputeForkChoiceHead(caller) {
|
|
@@ -822,6 +845,8 @@ export class BeaconChain {
|
|
|
822
845
|
async onForkChoiceFinalized(cp) {
|
|
823
846
|
this.logger.verbose("Fork choice finalized", { epoch: cp.epoch, root: cp.rootHex });
|
|
824
847
|
this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
|
|
848
|
+
// Update validator custody to account for effective balance changes
|
|
849
|
+
await this.updateValidatorsCustodyRequirement(cp);
|
|
825
850
|
// TODO: Improve using regen here
|
|
826
851
|
const { blockRoot, stateRoot, slot } = this.forkChoice.getHead();
|
|
827
852
|
const headState = this.regen.getStateSync(stateRoot);
|
|
@@ -837,9 +862,49 @@ export class BeaconChain {
|
|
|
837
862
|
}
|
|
838
863
|
}
|
|
839
864
|
async updateBeaconProposerData(epoch, proposers) {
|
|
865
|
+
const previousValidatorCount = this.beaconProposerCache.getValidatorIndices().length;
|
|
840
866
|
for (const proposer of proposers) {
|
|
841
867
|
this.beaconProposerCache.add(epoch, proposer);
|
|
842
868
|
}
|
|
869
|
+
const newValidatorCount = this.beaconProposerCache.getValidatorIndices().length;
|
|
870
|
+
// Only update validator custody if we discovered new validators
|
|
871
|
+
if (newValidatorCount > previousValidatorCount) {
|
|
872
|
+
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
873
|
+
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
async updateValidatorsCustodyRequirement(finalizedCheckpoint) {
|
|
877
|
+
if (this.opts.supernode) {
|
|
878
|
+
// Disable dynamic custody updates for supernodes since they must maintain custody
|
|
879
|
+
// of all custody groups regardless of validator effective balances
|
|
880
|
+
return;
|
|
881
|
+
}
|
|
882
|
+
// Update custody requirement based on finalized state
|
|
883
|
+
const stateOrBytes = (await this.getStateOrBytesByCheckpoint(finalizedCheckpoint))?.state;
|
|
884
|
+
if (!stateOrBytes) {
|
|
885
|
+
throw Error(`No finalized state for epoch ${finalizedCheckpoint.epoch} and root ${finalizedCheckpoint.rootHex} to update target custody group count`);
|
|
886
|
+
}
|
|
887
|
+
// Validators attached to the node
|
|
888
|
+
const validatorIndices = this.beaconProposerCache.getValidatorIndices();
|
|
889
|
+
let effectiveBalances;
|
|
890
|
+
if (stateOrBytes instanceof Uint8Array) {
|
|
891
|
+
effectiveBalances = getEffectiveBalancesFromStateBytes(this.config, stateOrBytes, validatorIndices);
|
|
892
|
+
}
|
|
893
|
+
else {
|
|
894
|
+
effectiveBalances = validatorIndices.map((index) => stateOrBytes.validators.get(index).effectiveBalance);
|
|
895
|
+
}
|
|
896
|
+
const targetCustodyGroupCount = getValidatorsCustodyRequirement(this.config, effectiveBalances);
|
|
897
|
+
// Only update if target is increased
|
|
898
|
+
if (targetCustodyGroupCount > this.custodyConfig.targetCustodyGroupCount) {
|
|
899
|
+
this.custodyConfig.updateTargetCustodyGroupCount(targetCustodyGroupCount);
|
|
900
|
+
this.metrics?.peerDas.targetCustodyGroupCount.set(targetCustodyGroupCount);
|
|
901
|
+
this.logger.verbose("Updated target custody group count", {
|
|
902
|
+
finalizedEpoch: finalizedCheckpoint.epoch,
|
|
903
|
+
validatorCount: validatorIndices.length,
|
|
904
|
+
targetCustodyGroupCount,
|
|
905
|
+
});
|
|
906
|
+
this.emitter.emit(ChainEvent.updateTargetCustodyGroupCount, targetCustodyGroupCount);
|
|
907
|
+
}
|
|
843
908
|
}
|
|
844
909
|
updateBuilderStatus(clockSlot) {
|
|
845
910
|
const executionBuilder = this.executionBuilder;
|
|
@@ -848,7 +913,7 @@ export class BeaconChain {
|
|
|
848
913
|
const slotsPresent = this.forkChoice.getSlotsPresent(clockSlot - faultInspectionWindow);
|
|
849
914
|
const previousStatus = executionBuilder.status;
|
|
850
915
|
const shouldEnable = slotsPresent >= Math.min(faultInspectionWindow - allowedFaults, clockSlot);
|
|
851
|
-
executionBuilder.updateStatus(shouldEnable);
|
|
916
|
+
executionBuilder.updateStatus(shouldEnable ? BuilderStatus.enabled : BuilderStatus.circuitBreaker);
|
|
852
917
|
// The status changed we should log
|
|
853
918
|
const status = executionBuilder.status;
|
|
854
919
|
const builderLog = {
|
|
@@ -858,10 +923,10 @@ export class BeaconChain {
|
|
|
858
923
|
allowedFaults,
|
|
859
924
|
};
|
|
860
925
|
if (status !== previousStatus) {
|
|
861
|
-
this.logger.info("
|
|
926
|
+
this.logger.info("External builder status updated", builderLog);
|
|
862
927
|
}
|
|
863
928
|
else {
|
|
864
|
-
this.logger.verbose("
|
|
929
|
+
this.logger.verbose("External builder status", builderLog);
|
|
865
930
|
}
|
|
866
931
|
}
|
|
867
932
|
}
|