@lodestar/beacon-node 1.34.0-dev.745ad69720 → 1.34.0-dev.7b42620eba
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 +36 -37
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +5 -5
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.js +15 -16
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/debug/index.js +2 -2
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +64 -47
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +3 -3
- package/lib/api/impl/validator/utils.js +2 -2
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +19 -20
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/utils/zebraBanner.d.ts +2 -0
- package/lib/chain/blocks/utils/zebraBanner.js +45 -0
- package/lib/chain/blocks/utils/zebraBanner.js.map +1 -0
- package/lib/chain/blocks/verifyBlock.js +18 -5
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +7 -34
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +8 -80
- package/lib/chain/chain.js +52 -84
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +2 -1
- package/lib/chain/forkChoice/index.js +2 -2
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/interface.d.ts +3 -10
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +13 -3
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.js +7 -7
- package/lib/chain/prepareNextSlot.js +4 -2
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +30 -18
- package/lib/chain/produceBlock/produceBlockBody.js +27 -32
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +6 -4
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +21 -23
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.d.ts +1 -1
- package/lib/chain/validation/aggregateAndProof.js +8 -8
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts +3 -3
- package/lib/chain/validation/attestation.js +10 -10
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +2 -1
- package/lib/chain/validation/dataColumnSidecar.js +17 -8
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/db/beacon.d.ts +3 -3
- package/lib/db/beacon.js +3 -3
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/interface.d.ts +3 -3
- package/lib/db/repositories/dataColumnSidecar.d.ts +26 -0
- package/lib/db/repositories/dataColumnSidecar.js +39 -0
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +24 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js +39 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -2
- package/lib/db/repositories/index.js +2 -2
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/execution/builder/http.d.ts +20 -4
- package/lib/execution/builder/http.js +30 -11
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/interface.d.ts +5 -4
- package/lib/execution/engine/http.d.ts +2 -2
- package/lib/execution/engine/http.js +10 -5
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +2 -11
- package/lib/execution/engine/mock.d.ts +4 -1
- package/lib/execution/engine/mock.js +54 -16
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +5 -5
- package/lib/execution/engine/types.js +2 -2
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +2 -28
- package/lib/metrics/metrics/beacon.js +9 -75
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +5 -0
- package/lib/metrics/metrics/lodestar.js +14 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/metrics.d.ts +2 -1
- package/lib/metrics/metrics.js +3 -0
- package/lib/metrics/metrics.js.map +1 -1
- package/lib/network/core/networkCore.js +11 -6
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +620 -92
- package/lib/network/interface.d.ts +3 -3
- package/lib/network/network.d.ts +3 -3
- package/lib/network/network.js +1 -1
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.js +2 -2
- package/lib/network/peers/discover.js +1 -1
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.js +9 -6
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +2 -1
- package/lib/network/peers/utils/prioritizePeers.js +5 -5
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +22 -19
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +6 -3
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +45 -17
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +7 -2
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +7 -7
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js +3 -3
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +2 -3
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +3 -3
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +55 -46
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +2 -2
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +26 -27
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/index.js +4 -3
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +11 -5
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +3 -3
- package/lib/network/reqresp/types.js +3 -3
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidaiton.d.ts +14 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidaiton.js +56 -0
- package/lib/network/reqresp/utils/dataColumnResponseValidaiton.js.map +1 -0
- package/lib/sync/range/chain.d.ts +1 -1
- package/lib/sync/range/chain.js +2 -2
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.js +2 -2
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.d.ts +3 -1
- package/lib/sync/range/utils/peerBalancer.js +20 -1
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +46 -4
- package/lib/sync/unknownBlock.js +305 -201
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/blobs.d.ts +3 -13
- package/lib/util/blobs.js +9 -47
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +7 -5
- package/lib/util/dataColumns.js +36 -27
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/sszBytes.d.ts +2 -0
- package/lib/util/sszBytes.js +23 -0
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +7 -0
- package/lib/util/types.js +3 -0
- package/lib/util/types.js.map +1 -1
- package/package.json +17 -18
- package/lib/db/repositories/dataColumnSidecars.d.ts +0 -47
- package/lib/db/repositories/dataColumnSidecars.js +0 -40
- package/lib/db/repositories/dataColumnSidecars.js.map +0 -1
- package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +0 -15
- package/lib/db/repositories/dataColumnSidecarsArchive.js +0 -23
- package/lib/db/repositories/dataColumnSidecarsArchive.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ExecutionStatus } from "@lodestar/fork-choice";
|
|
2
|
-
import { ForkName } from "@lodestar/params";
|
|
2
|
+
import { ForkName, isForkPostFulu } from "@lodestar/params";
|
|
3
3
|
import { DataAvailabilityStatus, computeEpochAtSlot, isStateValidatorsNodesPopulated, } from "@lodestar/state-transition";
|
|
4
4
|
import { toRootHex } from "@lodestar/utils";
|
|
5
5
|
import { BlockError, BlockErrorCode } from "../errors/index.js";
|
|
@@ -9,6 +9,7 @@ import { DENEB_BLOWFISH_BANNER } from "./utils/blowfishBanner.js";
|
|
|
9
9
|
import { ELECTRA_GIRAFFE_BANNER } from "./utils/giraffeBanner.js";
|
|
10
10
|
import { CAPELLA_OWL_BANNER } from "./utils/ownBanner.js";
|
|
11
11
|
import { POS_PANDA_MERGE_TRANSITION_BANNER } from "./utils/pandaMergeTransitionBanner.js";
|
|
12
|
+
import { FULU_ZEBRA_BANNER } from "./utils/zebraBanner.js";
|
|
12
13
|
import { verifyBlocksDataAvailability } from "./verifyBlocksDataAvailability.js";
|
|
13
14
|
import { verifyBlocksExecutionPayload } from "./verifyBlocksExecutionPayloads.js";
|
|
14
15
|
import { verifyBlocksSignatures } from "./verifyBlocksSignatures.js";
|
|
@@ -97,11 +98,11 @@ export async function verifyBlocksInEpoch(parentBlock, blocksInput, opts) {
|
|
|
97
98
|
// TODO: Will this banner be logged during syncing?
|
|
98
99
|
logOnPowBlock(this.logger, this.config, segmentExecStatus.mergeBlockFound);
|
|
99
100
|
}
|
|
100
|
-
const
|
|
101
|
-
const
|
|
101
|
+
const fromForkBoundary = this.config.getForkBoundaryAtEpoch(computeEpochAtSlot(parentBlock.slot));
|
|
102
|
+
const toForkBoundary = this.config.getForkBoundaryAtEpoch(computeEpochAtSlot(lastBlock.message.slot));
|
|
102
103
|
// If transition through toFork, note won't happen if ${toFork}_EPOCH = 0, will log double on re-org
|
|
103
|
-
if (
|
|
104
|
-
switch (
|
|
104
|
+
if (toForkBoundary.fork !== fromForkBoundary.fork) {
|
|
105
|
+
switch (toForkBoundary.fork) {
|
|
105
106
|
case ForkName.capella:
|
|
106
107
|
this.logger.info(CAPELLA_OWL_BANNER);
|
|
107
108
|
this.logger.info("Activating withdrawals", { epoch: this.config.CAPELLA_FORK_EPOCH });
|
|
@@ -114,9 +115,21 @@ export async function verifyBlocksInEpoch(parentBlock, blocksInput, opts) {
|
|
|
114
115
|
this.logger.info(ELECTRA_GIRAFFE_BANNER);
|
|
115
116
|
this.logger.info("Activating maxEB", { epoch: this.config.ELECTRA_FORK_EPOCH });
|
|
116
117
|
break;
|
|
118
|
+
case ForkName.fulu:
|
|
119
|
+
this.logger.info(FULU_ZEBRA_BANNER);
|
|
120
|
+
this.logger.info("Activating peerDAS", { epoch: this.config.FULU_FORK_EPOCH });
|
|
121
|
+
break;
|
|
117
122
|
default:
|
|
118
123
|
}
|
|
119
124
|
}
|
|
125
|
+
if (isForkPostFulu(fromForkBoundary.fork)) {
|
|
126
|
+
const fromBlobParameters = this.config.getBlobParameters(fromForkBoundary.epoch);
|
|
127
|
+
const toBlobParameters = this.config.getBlobParameters(toForkBoundary.epoch);
|
|
128
|
+
if (toBlobParameters.epoch !== fromBlobParameters.epoch) {
|
|
129
|
+
const { epoch, maxBlobsPerBlock } = toBlobParameters;
|
|
130
|
+
this.logger.info("Activating BPO fork", { epoch, maxBlobsPerBlock });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
120
133
|
}
|
|
121
134
|
if (segmentExecStatus.execAborted === null) {
|
|
122
135
|
const { executionStatuses, executionTime } = segmentExecStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyBlock.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlock.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAa,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"verifyBlock.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyBlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { ForkName,
|
|
2
|
-
import {
|
|
3
|
-
import { toRootHex } from "@lodestar/utils";
|
|
4
|
-
import { toHex } from "@lodestar/utils";
|
|
1
|
+
import { ForkName, isForkPostDeneb, isForkPostFulu } from "@lodestar/params";
|
|
2
|
+
import { toHex, toRootHex } from "@lodestar/utils";
|
|
5
3
|
import { BlockInputType } from "./types.js";
|
|
6
4
|
/**
|
|
7
5
|
* Persists block input data to DB. This operation must be eventually completed if a block is imported to the fork-choice.
|
|
@@ -38,38 +36,22 @@ export async function writeBlockInputToDb(blocksInput) {
|
|
|
38
36
|
// NOTE: Old data is pruned on archive
|
|
39
37
|
if (isForkPostFulu(blockData.fork)) {
|
|
40
38
|
const { custodyConfig } = this;
|
|
41
|
-
const {
|
|
39
|
+
const { custodyColumns } = custodyConfig;
|
|
42
40
|
const blobsLen = block.message.body.blobKzgCommitments.length;
|
|
43
41
|
let dataColumnsLen;
|
|
44
|
-
let dataColumnsIndex;
|
|
45
42
|
if (blobsLen === 0) {
|
|
46
43
|
dataColumnsLen = 0;
|
|
47
|
-
dataColumnsIndex = new Uint8Array(NUMBER_OF_COLUMNS);
|
|
48
44
|
}
|
|
49
45
|
else {
|
|
50
46
|
dataColumnsLen = custodyColumns.length;
|
|
51
|
-
dataColumnsIndex = custodyColumnsIndex;
|
|
52
47
|
}
|
|
53
48
|
const blockDataColumns = blockData.dataColumns;
|
|
54
49
|
const dataColumnSidecars = blockDataColumns.filter((dataColumnSidecar) => custodyColumns.includes(dataColumnSidecar.index));
|
|
55
50
|
if (dataColumnSidecars.length !== dataColumnsLen) {
|
|
56
51
|
throw Error(`Invalid dataColumnSidecars=${dataColumnSidecars.length} for custody expected custodyColumnsLen=${dataColumnsLen}`);
|
|
57
52
|
}
|
|
58
|
-
|
|
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));
|
|
53
|
+
fnPromises.push(this.db.dataColumnSidecar.putMany(blockRoot, dataColumnSidecars));
|
|
70
54
|
this.logger.debug("Persisted dataColumnSidecars to hot DB", {
|
|
71
|
-
dataColumnsSize,
|
|
72
|
-
dataColumnsLen,
|
|
73
55
|
dataColumnSidecars: dataColumnSidecars.length,
|
|
74
56
|
slot: block.message.slot,
|
|
75
57
|
root: blockRootHex,
|
|
@@ -114,22 +96,13 @@ export async function removeEagerlyPersistedBlockInputs(blockInputs) {
|
|
|
114
96
|
}
|
|
115
97
|
else {
|
|
116
98
|
const { custodyConfig } = this;
|
|
117
|
-
const {
|
|
99
|
+
const { custodyColumns } = custodyConfig;
|
|
118
100
|
const dataColumnsLen = custodyColumns.length;
|
|
119
101
|
const dataColumnSidecars = blockData.dataColumns.filter((dataColumnSidecar) => custodyColumns.includes(dataColumnSidecar.index));
|
|
120
102
|
if (dataColumnSidecars.length !== dataColumnsLen) {
|
|
121
103
|
throw Error(`Invalid dataColumnSidecars=${dataColumnSidecars.length} for custody expected custodyColumnsLen=${dataColumnsLen}`);
|
|
122
104
|
}
|
|
123
|
-
|
|
124
|
-
const dataColumnsSize = ssz.fulu.Cell.fixedSize * blobsLen;
|
|
125
|
-
dataColumnsToRemove.push({
|
|
126
|
-
blockRoot,
|
|
127
|
-
slot,
|
|
128
|
-
dataColumnsLen,
|
|
129
|
-
dataColumnsSize,
|
|
130
|
-
dataColumnsIndex,
|
|
131
|
-
dataColumnSidecars,
|
|
132
|
-
});
|
|
105
|
+
dataColumnsToRemove.push(blockRoot);
|
|
133
106
|
}
|
|
134
107
|
}
|
|
135
108
|
}
|
|
@@ -138,7 +111,7 @@ export async function removeEagerlyPersistedBlockInputs(blockInputs) {
|
|
|
138
111
|
// TODO: Batch DB operations not with Promise.all but with level db ops
|
|
139
112
|
this.db.block.batchRemove(blockToRemove),
|
|
140
113
|
this.db.blobSidecars.batchRemove(blobsToRemove),
|
|
141
|
-
this.db.
|
|
114
|
+
this.db.dataColumnSidecar.deleteMany(dataColumnsToRemove),
|
|
142
115
|
]);
|
|
143
116
|
}
|
|
144
117
|
//# sourceMappingURL=writeBlockInputToDb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeBlockInputToDb.js","sourceRoot":"","sources":["../../../src/chain/blocks/writeBlockInputToDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,
|
|
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,7 +3,7 @@ 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, Status, UintNum64, ValidatorIndex, Wei
|
|
6
|
+
import { BeaconBlock, BlindedBeaconBlock, Epoch, Root, RootHex, SignedBeaconBlock, Slot, Status, UintNum64, ValidatorIndex, Wei } from "@lodestar/types";
|
|
7
7
|
import { Logger } from "@lodestar/utils";
|
|
8
8
|
import { ProcessShutdownCallback } from "@lodestar/validator";
|
|
9
9
|
import { PrivateKey } from "@libp2p/interface";
|
|
@@ -27,7 +27,7 @@ import { CommonBlockBody, IBeaconChain, ProposerPreparationData, StateGetOpts }
|
|
|
27
27
|
import { LightClientServer } from "./lightClient/index.js";
|
|
28
28
|
import { AggregatedAttestationPool, AttestationPool, OpPool, SyncCommitteeMessagePool, SyncContributionAndProofPool } from "./opPools/index.js";
|
|
29
29
|
import { IChainOptions } from "./options.js";
|
|
30
|
-
import { AssembledBlockType, BlockType } from "./produceBlock/index.js";
|
|
30
|
+
import { AssembledBlockType, BlockType, ProduceResult } from "./produceBlock/index.js";
|
|
31
31
|
import { BlockAttributes } from "./produceBlock/produceBlockBody.js";
|
|
32
32
|
import { QueuedStateRegenerator, RegenCaller } from "./regen/index.js";
|
|
33
33
|
import { ReprocessController } from "./reprocess.js";
|
|
@@ -83,71 +83,12 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
83
83
|
readonly beaconProposerCache: BeaconProposerCache;
|
|
84
84
|
readonly checkpointBalancesCache: CheckpointBalancesCache;
|
|
85
85
|
readonly shufflingCache: ShufflingCache;
|
|
86
|
-
/**
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
parentHash: import("@chainsafe/ssz").ByteVectorType;
|
|
93
|
-
feeRecipient: import("@lodestar/types/lib/utils/executionAddress.js").ExecutionAddressType;
|
|
94
|
-
stateRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
95
|
-
receiptsRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
96
|
-
logsBloom: import("@chainsafe/ssz").ByteVectorType;
|
|
97
|
-
prevRandao: import("@chainsafe/ssz").ByteVectorType;
|
|
98
|
-
blockNumber: import("@chainsafe/ssz").UintNumberType;
|
|
99
|
-
gasLimit: import("@chainsafe/ssz").UintNumberType;
|
|
100
|
-
gasUsed: import("@chainsafe/ssz").UintNumberType;
|
|
101
|
-
timestamp: import("@chainsafe/ssz").UintNumberType;
|
|
102
|
-
extraData: import("@chainsafe/ssz").ByteListType;
|
|
103
|
-
baseFeePerGas: import("@chainsafe/ssz").UintBigintType;
|
|
104
|
-
blockHash: import("@chainsafe/ssz").ByteVectorType;
|
|
105
|
-
}> | import("@chainsafe/ssz").ValueOfFields<{
|
|
106
|
-
withdrawals: import("@chainsafe/ssz").ListCompositeType<import("@chainsafe/ssz").ContainerType<{
|
|
107
|
-
index: import("@chainsafe/ssz").UintNumberType;
|
|
108
|
-
validatorIndex: import("@chainsafe/ssz").UintNumberType;
|
|
109
|
-
address: import("@lodestar/types/lib/utils/executionAddress.js").ExecutionAddressType;
|
|
110
|
-
amount: import("@chainsafe/ssz").UintBigintType;
|
|
111
|
-
}>>;
|
|
112
|
-
transactions: import("@chainsafe/ssz").ListCompositeType<import("@chainsafe/ssz").ByteListType>;
|
|
113
|
-
parentHash: import("@chainsafe/ssz").ByteVectorType;
|
|
114
|
-
feeRecipient: import("@lodestar/types/lib/utils/executionAddress.js").ExecutionAddressType;
|
|
115
|
-
stateRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
116
|
-
receiptsRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
117
|
-
logsBloom: import("@chainsafe/ssz").ByteVectorType;
|
|
118
|
-
prevRandao: import("@chainsafe/ssz").ByteVectorType;
|
|
119
|
-
blockNumber: import("@chainsafe/ssz").UintNumberType;
|
|
120
|
-
gasLimit: import("@chainsafe/ssz").UintNumberType;
|
|
121
|
-
gasUsed: import("@chainsafe/ssz").UintNumberType;
|
|
122
|
-
timestamp: import("@chainsafe/ssz").UintNumberType;
|
|
123
|
-
extraData: import("@chainsafe/ssz").ByteListType;
|
|
124
|
-
baseFeePerGas: import("@chainsafe/ssz").UintBigintType;
|
|
125
|
-
blockHash: import("@chainsafe/ssz").ByteVectorType;
|
|
126
|
-
}> | import("@chainsafe/ssz").ValueOfFields<{
|
|
127
|
-
blobGasUsed: import("@chainsafe/ssz").UintBigintType;
|
|
128
|
-
excessBlobGas: import("@chainsafe/ssz").UintBigintType;
|
|
129
|
-
withdrawals: import("@chainsafe/ssz").ListCompositeType<import("@chainsafe/ssz").ContainerType<{
|
|
130
|
-
index: import("@chainsafe/ssz").UintNumberType;
|
|
131
|
-
validatorIndex: import("@chainsafe/ssz").UintNumberType;
|
|
132
|
-
address: import("@lodestar/types/lib/utils/executionAddress.js").ExecutionAddressType;
|
|
133
|
-
amount: import("@chainsafe/ssz").UintBigintType;
|
|
134
|
-
}>>;
|
|
135
|
-
transactions: import("@chainsafe/ssz").ListCompositeType<import("@chainsafe/ssz").ByteListType>;
|
|
136
|
-
parentHash: import("@chainsafe/ssz").ByteVectorType;
|
|
137
|
-
feeRecipient: import("@lodestar/types/lib/utils/executionAddress.js").ExecutionAddressType;
|
|
138
|
-
stateRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
139
|
-
receiptsRoot: import("@chainsafe/ssz").ByteVectorType;
|
|
140
|
-
logsBloom: import("@chainsafe/ssz").ByteVectorType;
|
|
141
|
-
prevRandao: import("@chainsafe/ssz").ByteVectorType;
|
|
142
|
-
blockNumber: import("@chainsafe/ssz").UintNumberType;
|
|
143
|
-
gasLimit: import("@chainsafe/ssz").UintNumberType;
|
|
144
|
-
gasUsed: import("@chainsafe/ssz").UintNumberType;
|
|
145
|
-
timestamp: import("@chainsafe/ssz").UintNumberType;
|
|
146
|
-
extraData: import("@chainsafe/ssz").ByteListType;
|
|
147
|
-
baseFeePerGas: import("@chainsafe/ssz").UintBigintType;
|
|
148
|
-
blockHash: import("@chainsafe/ssz").ByteVectorType;
|
|
149
|
-
}> | null>;
|
|
150
|
-
readonly producedBlindedBlockRoot: Set<string>;
|
|
86
|
+
/**
|
|
87
|
+
* Cache produced results (ExecutionPayload, DA Data) from the local execution so that we can send
|
|
88
|
+
* and get signed/published blinded versions which beacon node can
|
|
89
|
+
* assemble into full blocks before publishing to the network.
|
|
90
|
+
*/
|
|
91
|
+
readonly blockProductionCache: Map<string, ProduceResult>;
|
|
151
92
|
readonly blacklistedBlocks: Map<RootHex, Slot | null>;
|
|
152
93
|
readonly serializedCache: SerializedCache;
|
|
153
94
|
readonly opts: IChainOptions;
|
|
@@ -247,19 +188,6 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
247
188
|
consensusBlockValue: Wei;
|
|
248
189
|
shouldOverrideBuilder?: boolean;
|
|
249
190
|
}>;
|
|
250
|
-
/**
|
|
251
|
-
* https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#sidecar
|
|
252
|
-
* def get_blobs_sidecar(block: BeaconBlock, blobs: Sequence[Blob]) -> BlobSidecars:
|
|
253
|
-
* return BlobSidecars(
|
|
254
|
-
* beacon_block_root=hash_tree_root(block),
|
|
255
|
-
* beacon_block_slot=block.slot,
|
|
256
|
-
* blobs=blobs,
|
|
257
|
-
* kzg_aggregated_proof=compute_proof_from_blobs(blobs),
|
|
258
|
-
* )
|
|
259
|
-
*/
|
|
260
|
-
getContents(beaconBlock: deneb.BeaconBlock): deneb.Contents & {
|
|
261
|
-
cells?: fulu.Cell[][];
|
|
262
|
-
};
|
|
263
191
|
processBlock(block: BlockInput, opts?: ImportBlockOpts): Promise<void>;
|
|
264
192
|
processChainSegment(blocks: BlockInput[], opts?: ImportBlockOpts): Promise<void>;
|
|
265
193
|
getStatus(): Status;
|
package/lib/chain/chain.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
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 {
|
|
5
|
-
import { computeAnchorCheckpoint, computeEndSlotAtEpoch, computeEpochAtSlot, computeStartSlotAtEpoch, createCachedBeaconState, getEffectiveBalanceIncrementsZeroInactive, isCachedBeaconState, processSlots, } from "@lodestar/state-transition";
|
|
4
|
+
import { EFFECTIVE_BALANCE_INCREMENT, GENESIS_SLOT, SLOTS_PER_EPOCH, isForkPostElectra } from "@lodestar/params";
|
|
5
|
+
import { computeAnchorCheckpoint, computeEndSlotAtEpoch, computeEpochAtSlot, computeStartSlotAtEpoch, createCachedBeaconState, getEffectiveBalanceIncrementsZeroInactive, getEffectiveBalancesFromStateBytes, 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";
|
|
9
8
|
import { GENESIS_EPOCH, ZERO_HASH } from "../constants/index.js";
|
|
9
|
+
import { BuilderStatus } from "../execution/builder/http.js";
|
|
10
10
|
import { computeNodeIdFromPrivateKey } from "../network/subnets/interface.js";
|
|
11
11
|
import { BufferPool } from "../util/bufferPool.js";
|
|
12
12
|
import { Clock, ClockEvent } from "../util/clock.js";
|
|
@@ -21,12 +21,12 @@ import { BlockProcessor } from "./blocks/index.js";
|
|
|
21
21
|
import { BlsMultiThreadWorkerPool, BlsSingleThreadVerifier } from "./bls/index.js";
|
|
22
22
|
import { ChainEvent, ChainEventEmitter } from "./emitter.js";
|
|
23
23
|
import { initializeForkChoice } from "./forkChoice/index.js";
|
|
24
|
-
import { FindHeadFnName
|
|
24
|
+
import { FindHeadFnName } from "./interface.js";
|
|
25
25
|
import { LightClientServer } from "./lightClient/index.js";
|
|
26
26
|
import { AggregatedAttestationPool, AttestationPool, OpPool, SyncCommitteeMessagePool, SyncContributionAndProofPool, } from "./opPools/index.js";
|
|
27
27
|
import { PrepareNextSlotScheduler } from "./prepareNextSlot.js";
|
|
28
28
|
import { computeNewStateRoot } from "./produceBlock/computeNewStateRoot.js";
|
|
29
|
-
import {
|
|
29
|
+
import { BlockType } from "./produceBlock/index.js";
|
|
30
30
|
import { produceBlockBody, produceCommonBlockBody } from "./produceBlock/produceBlockBody.js";
|
|
31
31
|
import { QueuedStateRegenerator, RegenCaller } from "./regen/index.js";
|
|
32
32
|
import { ReprocessController } from "./reprocess.js";
|
|
@@ -47,11 +47,13 @@ import { FIFOBlockStateCache } from "./stateCache/fifoBlockStateCache.js";
|
|
|
47
47
|
import { InMemoryCheckpointStateCache } from "./stateCache/inMemoryCheckpointsCache.js";
|
|
48
48
|
import { PersistentCheckpointStateCache } from "./stateCache/persistentCheckpointsCache.js";
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
50
|
+
* The maximum number of cached produced results to keep in memory.
|
|
51
|
+
*
|
|
52
|
+
* Arbitrary constant. Blobs and payloads should be consumed immediately in the same slot
|
|
51
53
|
* they are produced. A value of 1 would probably be sufficient. However it's sensible to
|
|
52
54
|
* allow some margin if the node overloads.
|
|
53
55
|
*/
|
|
54
|
-
const
|
|
56
|
+
const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
|
|
55
57
|
export class BeaconChain {
|
|
56
58
|
get earliestAvailableSlot() {
|
|
57
59
|
return this._earliestAvailableSlot;
|
|
@@ -71,13 +73,12 @@ export class BeaconChain {
|
|
|
71
73
|
this.seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
|
|
72
74
|
// Seen cache for liveness checks
|
|
73
75
|
this.seenBlockAttesters = new SeenBlockAttesters();
|
|
74
|
-
/**
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
this.
|
|
80
|
-
this.producedBlindedBlockRoot = new Set();
|
|
76
|
+
/**
|
|
77
|
+
* Cache produced results (ExecutionPayload, DA Data) from the local execution so that we can send
|
|
78
|
+
* and get signed/published blinded versions which beacon node can
|
|
79
|
+
* assemble into full blocks before publishing to the network.
|
|
80
|
+
*/
|
|
81
|
+
this.blockProductionCache = new Map();
|
|
81
82
|
this.abortController = new AbortController();
|
|
82
83
|
this.opts = opts;
|
|
83
84
|
this.config = config;
|
|
@@ -110,7 +111,7 @@ export class BeaconChain {
|
|
|
110
111
|
this.seenContributionAndProof = new SeenContributionAndProof(metrics);
|
|
111
112
|
this.seenAttestationDatas = new SeenAttestationDatas(metrics, this.opts?.attDataCacheSlotDistance);
|
|
112
113
|
const nodeId = computeNodeIdFromPrivateKey(privateKey);
|
|
113
|
-
const initialCustodyGroupCount = opts.initialCustodyGroupCount ?? (opts.supernode ? NUMBER_OF_CUSTODY_GROUPS : config.CUSTODY_REQUIREMENT);
|
|
114
|
+
const initialCustodyGroupCount = opts.initialCustodyGroupCount ?? (opts.supernode ? config.NUMBER_OF_CUSTODY_GROUPS : config.CUSTODY_REQUIREMENT);
|
|
114
115
|
this.metrics?.peerDas.targetCustodyGroupCount.set(initialCustodyGroupCount);
|
|
115
116
|
this.custodyConfig = new CustodyConfig({
|
|
116
117
|
nodeId,
|
|
@@ -183,7 +184,7 @@ export class BeaconChain {
|
|
|
183
184
|
blockStateCache.add(cachedState);
|
|
184
185
|
blockStateCache.setHeadState(cachedState);
|
|
185
186
|
checkpointStateCache.add(checkpoint, cachedState);
|
|
186
|
-
const forkChoice = initializeForkChoice(config, emitter, clock.currentSlot, cachedState, opts, this.justifiedBalancesGetter.bind(this), logger);
|
|
187
|
+
const forkChoice = initializeForkChoice(config, emitter, clock.currentSlot, cachedState, opts, this.justifiedBalancesGetter.bind(this), metrics, logger);
|
|
187
188
|
const regen = new QueuedStateRegenerator({
|
|
188
189
|
config,
|
|
189
190
|
forkChoice,
|
|
@@ -437,7 +438,7 @@ export class BeaconChain {
|
|
|
437
438
|
const state = await this.regen.getBlockSlotState(toRootHex(parentBlockRoot), slot, { dontTransferCache: true }, RegenCaller.produceBlock);
|
|
438
439
|
const proposerIndex = state.epochCtx.getBeaconProposer(slot);
|
|
439
440
|
const proposerPubKey = state.epochCtx.index2pubkey[proposerIndex].toBytes();
|
|
440
|
-
const { body,
|
|
441
|
+
const { body, produceResult, executionPayloadValue, shouldOverrideBuilder } = await produceBlockBody.call(this, blockType, state, {
|
|
441
442
|
randaoReveal,
|
|
442
443
|
graffiti,
|
|
443
444
|
slot,
|
|
@@ -449,7 +450,7 @@ export class BeaconChain {
|
|
|
449
450
|
commonBlockBodyPromise,
|
|
450
451
|
});
|
|
451
452
|
// The hashtree root computed here for debug log will get cached and hence won't introduce additional delays
|
|
452
|
-
const bodyRoot =
|
|
453
|
+
const bodyRoot = produceResult.type === BlockType.Full
|
|
453
454
|
? this.config.getForkTypes(slot).BeaconBlockBody.hashTreeRoot(body)
|
|
454
455
|
: this.config
|
|
455
456
|
.getPostBellatrixForkTypes(slot)
|
|
@@ -468,51 +469,15 @@ export class BeaconChain {
|
|
|
468
469
|
};
|
|
469
470
|
const { newStateRoot, proposerReward } = computeNewStateRoot(this.metrics, state, block);
|
|
470
471
|
block.stateRoot = newStateRoot;
|
|
471
|
-
const blockRoot =
|
|
472
|
+
const blockRoot = produceResult.type === BlockType.Full
|
|
472
473
|
? this.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block)
|
|
473
474
|
: this.config.getPostBellatrixForkTypes(slot).BlindedBeaconBlock.hashTreeRoot(block);
|
|
474
475
|
const blockRootHex = toRootHex(blockRoot);
|
|
475
|
-
//
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
this.producedBlockRoot.set(blockRootHex, block.body.executionPayload ?? null);
|
|
479
|
-
this.metrics?.blockProductionCaches.producedBlockRoot.set(this.producedBlockRoot.size);
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
this.logger.debug("Tracking the produced blinded block", { blockRootHex, slot, blockType });
|
|
483
|
-
this.producedBlindedBlockRoot.add(blockRootHex);
|
|
484
|
-
this.metrics?.blockProductionCaches.producedBlindedBlockRoot.set(this.producedBlindedBlockRoot.size);
|
|
485
|
-
}
|
|
486
|
-
// Cache for latter broadcasting
|
|
487
|
-
//
|
|
488
|
-
// blinded blobs will be fetched and added to this cache later before finally
|
|
489
|
-
// publishing the blinded block's full version
|
|
490
|
-
if (blobs.type === BlobsResultType.produced) {
|
|
491
|
-
// body is of full type here
|
|
492
|
-
const { blockHash, contents } = blobs;
|
|
493
|
-
this.producedContentsCache.set(blockHash, contents);
|
|
494
|
-
this.metrics?.blockProductionCaches.producedContentsCache.set(this.producedContentsCache.size);
|
|
495
|
-
}
|
|
476
|
+
// Track the produced block for consensus broadcast validations, later validation, etc.
|
|
477
|
+
this.blockProductionCache.set(blockRootHex, produceResult);
|
|
478
|
+
this.metrics?.blockProductionCacheSize.set(this.blockProductionCache.size);
|
|
496
479
|
return { block, executionPayloadValue, consensusBlockValue: gweiToWei(proposerReward), shouldOverrideBuilder };
|
|
497
480
|
}
|
|
498
|
-
/**
|
|
499
|
-
* https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#sidecar
|
|
500
|
-
* def get_blobs_sidecar(block: BeaconBlock, blobs: Sequence[Blob]) -> BlobSidecars:
|
|
501
|
-
* return BlobSidecars(
|
|
502
|
-
* beacon_block_root=hash_tree_root(block),
|
|
503
|
-
* beacon_block_slot=block.slot,
|
|
504
|
-
* blobs=blobs,
|
|
505
|
-
* kzg_aggregated_proof=compute_proof_from_blobs(blobs),
|
|
506
|
-
* )
|
|
507
|
-
*/
|
|
508
|
-
getContents(beaconBlock) {
|
|
509
|
-
const blockHash = toRootHex(beaconBlock.body.executionPayload.blockHash);
|
|
510
|
-
const contents = this.producedContentsCache.get(blockHash);
|
|
511
|
-
if (!contents) {
|
|
512
|
-
throw Error(`No contents for executionPayload.blockHash ${blockHash}`);
|
|
513
|
-
}
|
|
514
|
-
return contents;
|
|
515
|
-
}
|
|
516
481
|
async processBlock(block, opts) {
|
|
517
482
|
return this.blockProcessor.processBlocksJob([block], opts);
|
|
518
483
|
}
|
|
@@ -766,13 +731,6 @@ export class BeaconChain {
|
|
|
766
731
|
// syncContributionAndProofPool tracks metrics on its own
|
|
767
732
|
metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
|
|
768
733
|
metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
|
|
769
|
-
const forkChoiceMetrics = this.forkChoice.getMetrics();
|
|
770
|
-
metrics.forkChoice.votes.set(forkChoiceMetrics.votes);
|
|
771
|
-
metrics.forkChoice.queuedAttestations.set(forkChoiceMetrics.queuedAttestations);
|
|
772
|
-
metrics.forkChoice.validatedAttestationDatas.set(forkChoiceMetrics.validatedAttestationDatas);
|
|
773
|
-
metrics.forkChoice.balancesLength.set(forkChoiceMetrics.balancesLength);
|
|
774
|
-
metrics.forkChoice.nodes.set(forkChoiceMetrics.nodes);
|
|
775
|
-
metrics.forkChoice.indices.set(forkChoiceMetrics.indices);
|
|
776
734
|
const headState = this.getHeadState();
|
|
777
735
|
const fork = this.config.getForkName(headState.slot);
|
|
778
736
|
if (isForkPostElectra(fork)) {
|
|
@@ -797,14 +755,8 @@ export class BeaconChain {
|
|
|
797
755
|
this.seenAttestationDatas.onSlot(slot);
|
|
798
756
|
this.reprocessController.onSlot(slot);
|
|
799
757
|
// Prune old cached block production artifacts, those are only useful on their slot
|
|
800
|
-
pruneSetToMax(this.
|
|
801
|
-
this.metrics?.
|
|
802
|
-
pruneSetToMax(this.producedBlindedBlockRoot, this.opts.maxCachedProducedRoots ?? DEFAULT_MAX_CACHED_PRODUCED_ROOTS);
|
|
803
|
-
this.metrics?.blockProductionCaches.producedBlindedBlockRoot.set(this.producedBlindedBlockRoot.size);
|
|
804
|
-
if (this.config.getForkSeq(slot) >= ForkSeq.deneb) {
|
|
805
|
-
pruneSetToMax(this.producedContentsCache, this.opts.maxCachedProducedRoots ?? DEFAULT_MAX_CACHED_PRODUCED_ROOTS);
|
|
806
|
-
this.metrics?.blockProductionCaches.producedContentsCache.set(this.producedContentsCache.size);
|
|
807
|
-
}
|
|
758
|
+
pruneSetToMax(this.blockProductionCache, this.opts.maxCachedProducedRoots ?? DEFAULT_MAX_CACHED_PRODUCED_RESULTS);
|
|
759
|
+
this.metrics?.blockProductionCacheSize.set(this.blockProductionCache.size);
|
|
808
760
|
const metrics = this.metrics;
|
|
809
761
|
if (metrics && (slot + 1) % SLOTS_PER_EPOCH === 0) {
|
|
810
762
|
// On the last slot of the epoch
|
|
@@ -878,19 +830,35 @@ export class BeaconChain {
|
|
|
878
830
|
// of all custody groups regardless of validator effective balances
|
|
879
831
|
return;
|
|
880
832
|
}
|
|
881
|
-
// Update custody requirement based on finalized state
|
|
882
|
-
const stateOrBytes = (await this.getStateOrBytesByCheckpoint(finalizedCheckpoint))?.state;
|
|
883
|
-
if (!stateOrBytes) {
|
|
884
|
-
throw Error(`No finalized state for epoch ${finalizedCheckpoint.epoch} and root ${finalizedCheckpoint.rootHex} to update target custody group count`);
|
|
885
|
-
}
|
|
886
833
|
// Validators attached to the node
|
|
887
834
|
const validatorIndices = this.beaconProposerCache.getValidatorIndices();
|
|
835
|
+
// Update custody requirement based on finalized state
|
|
888
836
|
let effectiveBalances;
|
|
889
|
-
|
|
890
|
-
|
|
837
|
+
const effectiveBalanceIncrements = this.checkpointBalancesCache.get(finalizedCheckpoint);
|
|
838
|
+
if (effectiveBalanceIncrements) {
|
|
839
|
+
effectiveBalances = validatorIndices.map((index) => (effectiveBalanceIncrements[index] ?? 0) * EFFECTIVE_BALANCE_INCREMENT);
|
|
891
840
|
}
|
|
892
841
|
else {
|
|
893
|
-
|
|
842
|
+
// If there's no cached effective balances, get the state from disk and parse them out
|
|
843
|
+
this.logger.debug("No cached finalized effective balances to update target custody group count", {
|
|
844
|
+
finalizedEpoch: finalizedCheckpoint.epoch,
|
|
845
|
+
finalizedRoot: finalizedCheckpoint.rootHex,
|
|
846
|
+
});
|
|
847
|
+
const stateOrBytes = (await this.getStateOrBytesByCheckpoint(finalizedCheckpoint))?.state;
|
|
848
|
+
if (!stateOrBytes) {
|
|
849
|
+
// If even the state is not available, we cannot update the custody group count
|
|
850
|
+
this.logger.debug("No finalized state or bytes available to update target custody group count", {
|
|
851
|
+
finalizedEpoch: finalizedCheckpoint.epoch,
|
|
852
|
+
finalizedRoot: finalizedCheckpoint.rootHex,
|
|
853
|
+
});
|
|
854
|
+
return;
|
|
855
|
+
}
|
|
856
|
+
if (stateOrBytes instanceof Uint8Array) {
|
|
857
|
+
effectiveBalances = getEffectiveBalancesFromStateBytes(this.config, stateOrBytes, validatorIndices);
|
|
858
|
+
}
|
|
859
|
+
else {
|
|
860
|
+
effectiveBalances = validatorIndices.map((index) => stateOrBytes.validators.get(index).effectiveBalance ?? 0);
|
|
861
|
+
}
|
|
894
862
|
}
|
|
895
863
|
const targetCustodyGroupCount = getValidatorsCustodyRequirement(this.config, effectiveBalances);
|
|
896
864
|
// Only update if target is increased
|
|
@@ -912,7 +880,7 @@ export class BeaconChain {
|
|
|
912
880
|
const slotsPresent = this.forkChoice.getSlotsPresent(clockSlot - faultInspectionWindow);
|
|
913
881
|
const previousStatus = executionBuilder.status;
|
|
914
882
|
const shouldEnable = slotsPresent >= Math.min(faultInspectionWindow - allowedFaults, clockSlot);
|
|
915
|
-
executionBuilder.updateStatus(shouldEnable);
|
|
883
|
+
executionBuilder.updateStatus(shouldEnable ? BuilderStatus.enabled : BuilderStatus.circuitBreaker);
|
|
916
884
|
// The status changed we should log
|
|
917
885
|
const status = executionBuilder.status;
|
|
918
886
|
const builderLog = {
|
|
@@ -922,10 +890,10 @@ export class BeaconChain {
|
|
|
922
890
|
allowedFaults,
|
|
923
891
|
};
|
|
924
892
|
if (status !== previousStatus) {
|
|
925
|
-
this.logger.info("
|
|
893
|
+
this.logger.info("External builder status updated", builderLog);
|
|
926
894
|
}
|
|
927
895
|
else {
|
|
928
|
-
this.logger.verbose("
|
|
896
|
+
this.logger.verbose("External builder status", builderLog);
|
|
929
897
|
}
|
|
930
898
|
}
|
|
931
899
|
}
|