@lodestar/beacon-node 1.41.0-dev.4a2801bf60 → 1.41.0-dev.4e115ed25d
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 +121 -3
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.js +8 -8
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +3 -4
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +5 -24
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +6 -2
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/node/utils.d.ts +1 -1
- package/lib/api/impl/node/utils.d.ts.map +1 -1
- package/lib/api/impl/node/utils.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +104 -6
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +9 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +5 -6
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +9 -10
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +3 -3
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/utils/archivePayloads.d.ts +7 -0
- package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +1 -0
- package/lib/chain/archiveStore/utils/archivePayloads.js +10 -0
- package/lib/chain/archiveStore/utils/archivePayloads.js.map +1 -0
- package/lib/chain/blocks/blockInput/blockInput.d.ts +20 -2
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +47 -0
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +2 -1
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/types.js +1 -0
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +3 -0
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +4 -0
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +3 -3
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +5 -5
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
- package/lib/chain/bls/multithread/jobItem.js +2 -2
- package/lib/chain/bls/multithread/jobItem.js.map +1 -1
- package/lib/chain/bls/singleThread.d.ts +4 -4
- package/lib/chain/bls/singleThread.d.ts.map +1 -1
- package/lib/chain/bls/singleThread.js +4 -4
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.d.ts +2 -2
- package/lib/chain/bls/utils.d.ts.map +1 -1
- package/lib/chain/bls/utils.js +7 -4
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +6 -9
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +32 -16
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +2 -2
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/interface.d.ts +4 -6
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.js +3 -3
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts +10 -2
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +24 -2
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +22 -7
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +110 -10
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +15 -7
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts.map +1 -1
- package/lib/chain/validation/attestation.js +4 -1
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +1 -1
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +2 -2
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +8 -1
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
- package/lib/db/beacon.d.ts +3 -1
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +5 -1
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +3 -1
- package/lib/db/buckets.d.ts.map +1 -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/interface.d.ts.map +1 -1
- package/lib/db/repositories/blockArchive.d.ts.map +1 -1
- package/lib/db/repositories/blockArchive.js +1 -2
- package/lib/db/repositories/blockArchive.js.map +1 -1
- package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
- package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecar.d.ts +5 -3
- package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecar.js +14 -1
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +5 -3
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +14 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/db/repositories/executionPayloadEnvelope.d.ts +19 -0
- package/lib/db/repositories/executionPayloadEnvelope.d.ts.map +1 -0
- package/lib/db/repositories/executionPayloadEnvelope.js +22 -0
- package/lib/db/repositories/executionPayloadEnvelope.js.map +1 -0
- package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts +18 -0
- package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts.map +1 -0
- package/lib/db/repositories/executionPayloadEnvelopeArchive.js +28 -0
- package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -0
- package/lib/db/repositories/index.d.ts.map +1 -1
- package/lib/db/repositories/index.js +2 -0
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/execution/engine/http.d.ts +1 -0
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +3 -0
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +1 -0
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +5 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +8 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +14 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/monitoring/service.d.ts +2 -2
- package/lib/monitoring/service.d.ts.map +1 -1
- package/lib/monitoring/service.js +3 -2
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +3 -3
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -3
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/types.d.ts +2 -2
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/events.d.ts +2 -1
- package/lib/network/events.d.ts.map +1 -1
- package/lib/network/events.js.map +1 -1
- package/lib/network/gossip/encoding.d.ts +3 -3
- package/lib/network/gossip/encoding.d.ts.map +1 -1
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +13 -4
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +47 -20
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +6 -6
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/scoringParameters.d.ts +1 -1
- package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
- package/lib/network/gossip/scoringParameters.js +1 -1
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +113 -63
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +2 -2
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +6 -5
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +29 -9
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +5 -4
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +10 -1
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +3 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/datastore.d.ts +7 -5
- package/lib/network/peers/datastore.d.ts.map +1 -1
- package/lib/network/peers/datastore.js +10 -10
- package/lib/network/peers/datastore.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +3 -0
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js +103 -53
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +3 -3
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +8 -2
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +1 -1
- package/lib/network/processor/types.d.ts +1 -1
- package/lib/network/processor/types.d.ts.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +0 -1
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/util.js +2 -2
- package/lib/network/util.js.map +1 -1
- package/lib/node/nodejs.d.ts +3 -5
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +6 -4
- package/lib/node/nodejs.js.map +1 -1
- package/lib/util/blobs.d.ts +2 -2
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +11 -3
- package/lib/util/dataColumns.d.ts.map +1 -1
- package/lib/util/dataColumns.js +27 -0
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/multifork.d.ts +8 -0
- package/lib/util/multifork.d.ts.map +1 -1
- package/lib/util/multifork.js +37 -0
- package/lib/util/multifork.js.map +1 -1
- package/package.json +38 -41
- package/src/api/impl/beacon/blocks/index.ts +145 -2
- package/src/api/impl/beacon/state/index.ts +8 -8
- package/src/api/impl/beacon/state/utils.ts +15 -29
- package/src/api/impl/debug/index.ts +9 -5
- package/src/api/impl/node/utils.ts +3 -3
- package/src/api/impl/validator/index.ts +127 -5
- package/src/chain/archiveStore/archiveStore.ts +10 -0
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -11
- package/src/chain/archiveStore/historicalState/worker.ts +3 -3
- package/src/chain/archiveStore/utils/archivePayloads.ts +15 -0
- package/src/chain/blocks/blockInput/blockInput.ts +68 -3
- package/src/chain/blocks/blockInput/types.ts +1 -0
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +3 -0
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -2
- package/src/chain/bls/multithread/index.ts +7 -7
- package/src/chain/bls/multithread/jobItem.ts +3 -3
- package/src/chain/bls/singleThread.ts +5 -5
- package/src/chain/bls/utils.ts +8 -5
- package/src/chain/chain.ts +51 -26
- package/src/chain/emitter.ts +2 -2
- package/src/chain/interface.ts +4 -11
- package/src/chain/options.ts +1 -0
- package/src/chain/prepareNextSlot.ts +5 -5
- package/src/chain/produceBlock/computeNewStateRoot.ts +35 -3
- package/src/chain/produceBlock/produceBlockBody.ts +163 -13
- package/src/chain/seenCache/seenGossipBlockInput.ts +16 -7
- package/src/chain/validation/attestation.ts +4 -1
- package/src/chain/validation/attesterSlashing.ts +1 -1
- package/src/chain/validation/dataColumnSidecar.ts +2 -5
- package/src/chain/validation/payloadAttestationMessage.ts +9 -1
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +1 -1
- package/src/db/beacon.ts +8 -0
- package/src/db/buckets.ts +3 -0
- package/src/db/interface.ts +5 -0
- package/src/db/repositories/blockArchive.ts +1 -2
- package/src/db/repositories/dataColumnSidecar.ts +18 -3
- package/src/db/repositories/dataColumnSidecarArchive.ts +18 -3
- package/src/db/repositories/executionPayloadEnvelope.ts +26 -0
- package/src/db/repositories/executionPayloadEnvelopeArchive.ts +32 -0
- package/src/db/repositories/index.ts +2 -0
- package/src/execution/engine/http.ts +3 -0
- package/src/metrics/metrics/beacon.ts +5 -0
- package/src/metrics/metrics/lodestar.ts +14 -0
- package/src/monitoring/service.ts +3 -2
- package/src/network/core/networkCore.ts +3 -3
- package/src/network/core/networkCoreWorkerHandler.ts +3 -3
- package/src/network/core/types.ts +2 -2
- package/src/network/events.ts +2 -1
- package/src/network/gossip/encoding.ts +3 -3
- package/src/network/gossip/gossipsub.ts +86 -25
- package/src/network/gossip/interface.ts +6 -6
- package/src/network/gossip/scoringParameters.ts +4 -4
- package/src/network/gossip/topic.ts +2 -1
- package/src/network/interface.ts +7 -4
- package/src/network/libp2p/index.ts +33 -10
- package/src/network/network.ts +24 -6
- package/src/network/options.ts +3 -0
- package/src/network/peers/datastore.ts +13 -10
- package/src/network/peers/peerManager.ts +118 -54
- package/src/network/peers/utils/prioritizePeers.ts +3 -3
- package/src/network/processor/gossipHandlers.ts +14 -4
- package/src/network/processor/gossipValidatorFn.ts +1 -1
- package/src/network/processor/types.ts +1 -1
- package/src/network/reqresp/score.ts +0 -1
- package/src/network/util.ts +2 -2
- package/src/node/nodejs.ts +8 -9
- package/src/util/blobs.ts +3 -3
- package/src/util/dataColumns.ts +37 -1
- package/src/util/multifork.ts +45 -0
- package/src/util/workerEvents.ts +1 -1
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
2
1
|
import {routes} from "@lodestar/api";
|
|
3
2
|
import {CheckpointWithHex, IForkChoice} from "@lodestar/fork-choice";
|
|
4
3
|
import {GENESIS_SLOT} from "@lodestar/params";
|
|
5
|
-
import {BeaconStateAllForks, CachedBeaconStateAllForks} from "@lodestar/state-transition";
|
|
6
|
-
import {
|
|
4
|
+
import {BeaconStateAllForks, CachedBeaconStateAllForks, PubkeyCache} from "@lodestar/state-transition";
|
|
5
|
+
import {
|
|
6
|
+
BLSPubkey,
|
|
7
|
+
Epoch,
|
|
8
|
+
RootHex,
|
|
9
|
+
Slot,
|
|
10
|
+
ValidatorIndex,
|
|
11
|
+
getValidatorStatus,
|
|
12
|
+
mapToGeneralStatus,
|
|
13
|
+
phase0,
|
|
14
|
+
} from "@lodestar/types";
|
|
7
15
|
import {fromHex} from "@lodestar/utils";
|
|
8
16
|
import {IBeaconChain} from "../../../../chain/index.js";
|
|
9
17
|
import {ApiError, ValidationError} from "../../errors.js";
|
|
@@ -65,28 +73,6 @@ export async function getStateResponseWithRegen(
|
|
|
65
73
|
return res;
|
|
66
74
|
}
|
|
67
75
|
|
|
68
|
-
type GeneralValidatorStatus = "active" | "pending" | "exited" | "withdrawal";
|
|
69
|
-
|
|
70
|
-
function mapToGeneralStatus(subStatus: routes.beacon.ValidatorStatus): GeneralValidatorStatus {
|
|
71
|
-
switch (subStatus) {
|
|
72
|
-
case "active_ongoing":
|
|
73
|
-
case "active_exiting":
|
|
74
|
-
case "active_slashed":
|
|
75
|
-
return "active";
|
|
76
|
-
case "pending_initialized":
|
|
77
|
-
case "pending_queued":
|
|
78
|
-
return "pending";
|
|
79
|
-
case "exited_slashed":
|
|
80
|
-
case "exited_unslashed":
|
|
81
|
-
return "exited";
|
|
82
|
-
case "withdrawal_possible":
|
|
83
|
-
case "withdrawal_done":
|
|
84
|
-
return "withdrawal";
|
|
85
|
-
default:
|
|
86
|
-
throw new Error(`Unknown substatus: ${subStatus}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
76
|
export function toValidatorResponse(
|
|
91
77
|
index: ValidatorIndex,
|
|
92
78
|
validator: phase0.Validator,
|
|
@@ -104,7 +90,7 @@ export function toValidatorResponse(
|
|
|
104
90
|
export function filterStateValidatorsByStatus(
|
|
105
91
|
statuses: string[],
|
|
106
92
|
state: BeaconStateAllForks,
|
|
107
|
-
|
|
93
|
+
pubkeyCache: PubkeyCache,
|
|
108
94
|
currentEpoch: Epoch
|
|
109
95
|
): routes.beacon.ValidatorResponse[] {
|
|
110
96
|
const responses: routes.beacon.ValidatorResponse[] = [];
|
|
@@ -115,7 +101,7 @@ export function filterStateValidatorsByStatus(
|
|
|
115
101
|
const validatorStatus = getValidatorStatus(validator, currentEpoch);
|
|
116
102
|
const generalStatus = mapToGeneralStatus(validatorStatus);
|
|
117
103
|
|
|
118
|
-
const resp = getStateValidatorIndex(validator.pubkey, state,
|
|
104
|
+
const resp = getStateValidatorIndex(validator.pubkey, state, pubkeyCache);
|
|
119
105
|
if (resp.valid && (statusSet.has(validatorStatus) || statusSet.has(generalStatus))) {
|
|
120
106
|
responses.push(
|
|
121
107
|
toValidatorResponse(resp.validatorIndex, validator, state.balances.get(resp.validatorIndex), currentEpoch)
|
|
@@ -132,7 +118,7 @@ type StateValidatorIndexResponse =
|
|
|
132
118
|
export function getStateValidatorIndex(
|
|
133
119
|
id: routes.beacon.ValidatorId | BLSPubkey,
|
|
134
120
|
state: BeaconStateAllForks,
|
|
135
|
-
|
|
121
|
+
pubkeyCache: PubkeyCache
|
|
136
122
|
): StateValidatorIndexResponse {
|
|
137
123
|
if (typeof id === "string") {
|
|
138
124
|
// mutate `id` and fallthrough to below
|
|
@@ -160,7 +146,7 @@ export function getStateValidatorIndex(
|
|
|
160
146
|
}
|
|
161
147
|
|
|
162
148
|
// typeof id === Uint8Array
|
|
163
|
-
const validatorIndex =
|
|
149
|
+
const validatorIndex = pubkeyCache.getIndex(id);
|
|
164
150
|
if (validatorIndex === null) {
|
|
165
151
|
return {valid: false, code: 404, reason: "Validator pubkey not found in state"};
|
|
166
152
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
2
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
3
3
|
import {ExecutionStatus} from "@lodestar/fork-choice";
|
|
4
|
-
import {ZERO_HASH_HEX, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
|
|
5
|
-
import {BeaconState,
|
|
4
|
+
import {ForkPostDeneb, ZERO_HASH_HEX, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
|
|
5
|
+
import {BeaconState, DataColumnSidecars, type SignedBeaconBlock, sszTypesFor} from "@lodestar/types";
|
|
6
6
|
import {toRootHex} from "@lodestar/utils";
|
|
7
|
+
import {getBlobKzgCommitments} from "../../../util/dataColumns.js";
|
|
7
8
|
import {isOptimisticBlock} from "../../../util/forkChoice.js";
|
|
8
9
|
import {getStateSlotFromBytes} from "../../../util/multifork.js";
|
|
9
10
|
import {getBlockResponse} from "../beacon/blocks/utils.js";
|
|
@@ -42,6 +43,7 @@ export function getDebugApi({
|
|
|
42
43
|
validity: (() => {
|
|
43
44
|
switch (node.executionStatus) {
|
|
44
45
|
case ExecutionStatus.Valid:
|
|
46
|
+
case ExecutionStatus.PayloadSeparated:
|
|
45
47
|
return "valid";
|
|
46
48
|
case ExecutionStatus.Invalid:
|
|
47
49
|
return "invalid";
|
|
@@ -96,10 +98,10 @@ export function getDebugApi({
|
|
|
96
98
|
const fork = config.getForkName(block.message.slot);
|
|
97
99
|
const blockRoot = sszTypesFor(fork).BeaconBlock.hashTreeRoot(block.message);
|
|
98
100
|
|
|
99
|
-
let dataColumnSidecars:
|
|
101
|
+
let dataColumnSidecars: DataColumnSidecars;
|
|
100
102
|
|
|
101
103
|
const blobCount = isForkPostDeneb(fork)
|
|
102
|
-
? (block
|
|
104
|
+
? getBlobKzgCommitments(fork, block as SignedBeaconBlock<ForkPostDeneb>).length
|
|
103
105
|
: 0;
|
|
104
106
|
|
|
105
107
|
if (isForkPostFulu(fork) && blobCount > 0) {
|
|
@@ -115,7 +117,9 @@ export function getDebugApi({
|
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
return {
|
|
118
|
-
data:
|
|
120
|
+
data: (indices
|
|
121
|
+
? dataColumnSidecars.filter(({index}) => indices.includes(index))
|
|
122
|
+
: dataColumnSidecars) as DataColumnSidecars,
|
|
119
123
|
meta: {
|
|
120
124
|
executionOptimistic,
|
|
121
125
|
finalized,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {Connection,
|
|
1
|
+
import type {Connection, ConnectionStatus} from "@libp2p/interface";
|
|
2
2
|
import {routes} from "@lodestar/api";
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -24,7 +24,7 @@ export function formatNodePeer(peerIdStr: string, connections: Connection[]): ro
|
|
|
24
24
|
* - Otherwise, the first closed connection
|
|
25
25
|
*/
|
|
26
26
|
export function getRelevantConnection(connections: Connection[]): Connection | null {
|
|
27
|
-
const byStatus = new Map<
|
|
27
|
+
const byStatus = new Map<ConnectionStatus, Connection>();
|
|
28
28
|
for (const conn of connections) {
|
|
29
29
|
if (conn.status === "open") return conn;
|
|
30
30
|
if (!byStatus.has(conn.status)) byStatus.set(conn.status, conn);
|
|
@@ -37,7 +37,7 @@ export function getRelevantConnection(connections: Connection[]): Connection | n
|
|
|
37
37
|
* Map libp2p connection status to the API's peer state notation
|
|
38
38
|
* @param status
|
|
39
39
|
*/
|
|
40
|
-
function getPeerState(status:
|
|
40
|
+
function getPeerState(status: ConnectionStatus): routes.node.PeerState {
|
|
41
41
|
switch (status) {
|
|
42
42
|
case "open":
|
|
43
43
|
return "connected";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
2
1
|
import {routes} from "@lodestar/api";
|
|
3
2
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
4
3
|
import {ExecutionStatus, ProtoBlock} from "@lodestar/fork-choice";
|
|
5
4
|
import {
|
|
5
|
+
BUILDER_INDEX_SELF_BUILD,
|
|
6
6
|
ForkName,
|
|
7
7
|
ForkPostBellatrix,
|
|
8
8
|
ForkPreGloas,
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
isForkPostBellatrix,
|
|
15
15
|
isForkPostDeneb,
|
|
16
16
|
isForkPostElectra,
|
|
17
|
+
isForkPostGloas,
|
|
17
18
|
} from "@lodestar/params";
|
|
18
19
|
import {
|
|
19
20
|
CachedBeaconStateAllForks,
|
|
@@ -25,6 +26,7 @@ import {
|
|
|
25
26
|
computeStartSlotAtEpoch,
|
|
26
27
|
computeTimeAtSlot,
|
|
27
28
|
createCachedBeaconState,
|
|
29
|
+
createPubkeyCache,
|
|
28
30
|
getBlockRootAtSlot,
|
|
29
31
|
getCurrentSlot,
|
|
30
32
|
loadState,
|
|
@@ -45,6 +47,7 @@ import {
|
|
|
45
47
|
Wei,
|
|
46
48
|
bellatrix,
|
|
47
49
|
getValidatorStatus,
|
|
50
|
+
gloas,
|
|
48
51
|
phase0,
|
|
49
52
|
ssz,
|
|
50
53
|
} from "@lodestar/types";
|
|
@@ -69,7 +72,7 @@ import {
|
|
|
69
72
|
} from "../../../chain/errors/index.js";
|
|
70
73
|
import {ChainEvent, CommonBlockBody} from "../../../chain/index.js";
|
|
71
74
|
import {PREPARE_NEXT_SLOT_BPS} from "../../../chain/prepareNextSlot.js";
|
|
72
|
-
import {BlockType, ProduceFullDeneb} from "../../../chain/produceBlock/index.js";
|
|
75
|
+
import {BlockType, ProduceFullDeneb, ProduceFullGloas} from "../../../chain/produceBlock/index.js";
|
|
73
76
|
import {RegenCaller} from "../../../chain/regen/index.js";
|
|
74
77
|
import {CheckpointHex} from "../../../chain/stateCache/types.js";
|
|
75
78
|
import {validateApiAggregateAndProof} from "../../../chain/validation/index.js";
|
|
@@ -901,6 +904,77 @@ export function getValidatorApi(
|
|
|
901
904
|
return {data, meta};
|
|
902
905
|
},
|
|
903
906
|
|
|
907
|
+
async produceBlockV4({slot, randaoReveal, graffiti, feeRecipient}) {
|
|
908
|
+
const fork = config.getForkName(slot);
|
|
909
|
+
|
|
910
|
+
if (!isForkPostGloas(fork)) {
|
|
911
|
+
throw new ApiError(400, `produceBlockV4 not supported for pre-gloas fork=${fork}`);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
notWhileSyncing();
|
|
915
|
+
await waitForSlot(slot);
|
|
916
|
+
|
|
917
|
+
// TODO GLOAS: support producing blocks from builder bids
|
|
918
|
+
const source = ProducedBlockSource.engine;
|
|
919
|
+
|
|
920
|
+
// TODO GLOAS: needs to be updated after fork choice changes are merged
|
|
921
|
+
const parentBlock = chain.getProposerHead(slot);
|
|
922
|
+
const {blockRoot: parentBlockRootHex, slot: parentSlot} = parentBlock;
|
|
923
|
+
const parentBlockRoot = fromHex(parentBlockRootHex);
|
|
924
|
+
notOnOutOfRangeData(parentBlockRoot);
|
|
925
|
+
metrics?.blockProductionSlotDelta.set(slot - parentSlot);
|
|
926
|
+
metrics?.blockProductionRequests.inc({source});
|
|
927
|
+
|
|
928
|
+
const graffitiBytes = toGraffitiBytes(
|
|
929
|
+
graffiti ?? getDefaultGraffiti(getLodestarClientVersion(), chain.executionEngine.clientVersion, {})
|
|
930
|
+
);
|
|
931
|
+
const commonBlockBodyPromise = chain.produceCommonBlockBody({
|
|
932
|
+
slot,
|
|
933
|
+
parentBlock,
|
|
934
|
+
randaoReveal,
|
|
935
|
+
graffiti: graffitiBytes,
|
|
936
|
+
});
|
|
937
|
+
|
|
938
|
+
let timer: undefined | ((opts: {source: ProducedBlockSource}) => number);
|
|
939
|
+
try {
|
|
940
|
+
timer = metrics?.blockProductionTime.startTimer();
|
|
941
|
+
const {block, executionPayloadValue, consensusBlockValue} = await chain.produceBlock({
|
|
942
|
+
slot,
|
|
943
|
+
parentBlock,
|
|
944
|
+
randaoReveal,
|
|
945
|
+
graffiti: graffitiBytes,
|
|
946
|
+
feeRecipient,
|
|
947
|
+
commonBlockBodyPromise,
|
|
948
|
+
});
|
|
949
|
+
|
|
950
|
+
metrics?.blockProductionSuccess.inc({source});
|
|
951
|
+
metrics?.blockProductionNumAggregated.observe({source}, block.body.attestations.length);
|
|
952
|
+
metrics?.blockProductionConsensusBlockValue.observe({source}, Number(formatWeiToEth(consensusBlockValue)));
|
|
953
|
+
metrics?.blockProductionExecutionPayloadValue.observe({source}, Number(formatWeiToEth(executionPayloadValue)));
|
|
954
|
+
|
|
955
|
+
const blockRoot = toRootHex(config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block));
|
|
956
|
+
logger.verbose("Produced block", {
|
|
957
|
+
slot,
|
|
958
|
+
executionPayloadValue,
|
|
959
|
+
consensusBlockValue,
|
|
960
|
+
root: blockRoot,
|
|
961
|
+
});
|
|
962
|
+
if (chain.opts.persistProducedBlocks) {
|
|
963
|
+
void chain.persistBlock(block, "produced_engine_block");
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
return {
|
|
967
|
+
data: block as gloas.BeaconBlock,
|
|
968
|
+
meta: {
|
|
969
|
+
version: fork,
|
|
970
|
+
consensusBlockValue,
|
|
971
|
+
},
|
|
972
|
+
};
|
|
973
|
+
} finally {
|
|
974
|
+
timer?.({source});
|
|
975
|
+
}
|
|
976
|
+
},
|
|
977
|
+
|
|
904
978
|
async produceAttestationData({committeeIndex, slot}) {
|
|
905
979
|
notWhileSyncing();
|
|
906
980
|
|
|
@@ -1049,8 +1123,7 @@ export function getValidatorApi(
|
|
|
1049
1123
|
{
|
|
1050
1124
|
config: chain.config,
|
|
1051
1125
|
// Not required to compute proposers
|
|
1052
|
-
|
|
1053
|
-
index2pubkey: [],
|
|
1126
|
+
pubkeyCache: createPubkeyCache(),
|
|
1054
1127
|
},
|
|
1055
1128
|
{skipSyncPubkeys: true, skipSyncCommitteeCache: true}
|
|
1056
1129
|
);
|
|
@@ -1511,7 +1584,7 @@ export function getValidatorApi(
|
|
|
1511
1584
|
|
|
1512
1585
|
const filteredRegistrations = registrations.filter((registration) => {
|
|
1513
1586
|
const {pubkey} = registration.message;
|
|
1514
|
-
const validatorIndex = chain.
|
|
1587
|
+
const validatorIndex = chain.pubkeyCache.getIndex(pubkey);
|
|
1515
1588
|
if (validatorIndex === null) return false;
|
|
1516
1589
|
|
|
1517
1590
|
const validator = headState.validators.getReadonly(validatorIndex);
|
|
@@ -1532,5 +1605,54 @@ export function getValidatorApi(
|
|
|
1532
1605
|
count: filteredRegistrations.length,
|
|
1533
1606
|
});
|
|
1534
1607
|
},
|
|
1608
|
+
|
|
1609
|
+
async getExecutionPayloadEnvelope({slot, beaconBlockRoot}) {
|
|
1610
|
+
const fork = config.getForkName(slot);
|
|
1611
|
+
|
|
1612
|
+
if (!isForkPostGloas(fork)) {
|
|
1613
|
+
throw new ApiError(400, `getExecutionPayloadEnvelope not supported for pre-gloas fork=${fork}`);
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
notWhileSyncing();
|
|
1617
|
+
await waitForSlot(slot);
|
|
1618
|
+
|
|
1619
|
+
const blockRootHex = toRootHex(beaconBlockRoot);
|
|
1620
|
+
const produceResult = chain.blockProductionCache.get(blockRootHex);
|
|
1621
|
+
|
|
1622
|
+
if (produceResult === undefined) {
|
|
1623
|
+
throw new ApiError(404, `No cached block production result found for block root ${blockRootHex}`);
|
|
1624
|
+
}
|
|
1625
|
+
if (!isForkPostGloas(produceResult.fork)) {
|
|
1626
|
+
throw Error(`Cached block production result is for pre-gloas fork=${produceResult.fork}`);
|
|
1627
|
+
}
|
|
1628
|
+
if (produceResult.type !== BlockType.Full) {
|
|
1629
|
+
throw Error("Cached block production result is not full block");
|
|
1630
|
+
}
|
|
1631
|
+
|
|
1632
|
+
const {executionPayload, executionRequests, envelopeStateRoot} = produceResult as ProduceFullGloas;
|
|
1633
|
+
|
|
1634
|
+
const envelope: gloas.ExecutionPayloadEnvelope = {
|
|
1635
|
+
payload: executionPayload,
|
|
1636
|
+
executionRequests: executionRequests,
|
|
1637
|
+
builderIndex: BUILDER_INDEX_SELF_BUILD,
|
|
1638
|
+
beaconBlockRoot,
|
|
1639
|
+
slot,
|
|
1640
|
+
stateRoot: envelopeStateRoot,
|
|
1641
|
+
};
|
|
1642
|
+
|
|
1643
|
+
logger.info("Produced execution payload envelope", {
|
|
1644
|
+
slot,
|
|
1645
|
+
blockRoot: blockRootHex,
|
|
1646
|
+
transactions: executionPayload.transactions.length,
|
|
1647
|
+
blockHash: toRootHex(executionPayload.blockHash),
|
|
1648
|
+
});
|
|
1649
|
+
|
|
1650
|
+
return {
|
|
1651
|
+
data: envelope,
|
|
1652
|
+
meta: {
|
|
1653
|
+
version: fork,
|
|
1654
|
+
},
|
|
1655
|
+
};
|
|
1656
|
+
},
|
|
1535
1657
|
};
|
|
1536
1658
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {CheckpointWithHex} from "@lodestar/fork-choice";
|
|
2
2
|
import {LoggerNode} from "@lodestar/logger/node";
|
|
3
|
+
import {ForkSeq} from "@lodestar/params";
|
|
3
4
|
import {Checkpoint} from "@lodestar/types/phase0";
|
|
4
5
|
import {callFnWhenAwait} from "@lodestar/utils";
|
|
5
6
|
import {IBeaconDb} from "../../db/index.js";
|
|
@@ -13,6 +14,7 @@ import {HistoricalStateRegen} from "./historicalState/historicalStateRegen.js";
|
|
|
13
14
|
import {ArchiveMode, ArchiveStoreOpts, StateArchiveStrategy} from "./interface.js";
|
|
14
15
|
import {FrequencyStateArchiveStrategy} from "./strategies/frequencyStateArchiveStrategy.js";
|
|
15
16
|
import {archiveBlocks} from "./utils/archiveBlocks.js";
|
|
17
|
+
import {archiveExecutionPayloadEnvelopes} from "./utils/archivePayloads.js";
|
|
16
18
|
import {pruneHistory} from "./utils/pruneHistory.js";
|
|
17
19
|
import {updateBackfillRange} from "./utils/updateBackfillRange.js";
|
|
18
20
|
|
|
@@ -27,6 +29,7 @@ type ArchiveStoreInitOpts = ArchiveStoreOpts & {dbName: string; anchorState: {fi
|
|
|
27
29
|
|
|
28
30
|
export enum ArchiveStoreTask {
|
|
29
31
|
ArchiveBlocks = "archive_blocks",
|
|
32
|
+
ArchivePayloads = "archive_payloads",
|
|
30
33
|
PruneHistory = "prune_history",
|
|
31
34
|
OnFinalizedCheckpoint = "on_finalized_checkpoint",
|
|
32
35
|
MaybeArchiveState = "maybe_archive_state",
|
|
@@ -189,6 +192,7 @@ export class ArchiveStore {
|
|
|
189
192
|
private processFinalizedCheckpoint = async (finalized: CheckpointWithHex): Promise<void> => {
|
|
190
193
|
try {
|
|
191
194
|
const finalizedEpoch = finalized.epoch;
|
|
195
|
+
const finalizedFork = this.chain.config.getForkSeqAtEpoch(finalizedEpoch);
|
|
192
196
|
this.logger.verbose("Start processing finalized checkpoint", {epoch: finalizedEpoch, rootHex: finalized.rootHex});
|
|
193
197
|
|
|
194
198
|
let timer = this.metrics?.processFinalizedCheckpoint.durationByTask.startTimer();
|
|
@@ -206,6 +210,12 @@ export class ArchiveStore {
|
|
|
206
210
|
);
|
|
207
211
|
timer?.({source: ArchiveStoreTask.ArchiveBlocks});
|
|
208
212
|
|
|
213
|
+
if (finalizedFork >= ForkSeq.gloas) {
|
|
214
|
+
timer = this.metrics?.processFinalizedCheckpoint.durationByTask.startTimer();
|
|
215
|
+
await archiveExecutionPayloadEnvelopes(this.chain, finalized);
|
|
216
|
+
timer?.({source: ArchiveStoreTask.ArchivePayloads});
|
|
217
|
+
}
|
|
218
|
+
|
|
209
219
|
if (this.opts.pruneHistory) {
|
|
210
220
|
timer = this.metrics?.processFinalizedCheckpoint.durationByTask.startTimer();
|
|
211
221
|
await pruneHistory(
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
2
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
3
2
|
import {
|
|
4
3
|
BeaconStateAllForks,
|
|
5
4
|
CachedBeaconStateAllForks,
|
|
6
5
|
DataAvailabilityStatus,
|
|
7
6
|
ExecutionPayloadStatus,
|
|
7
|
+
PubkeyCache,
|
|
8
8
|
createCachedBeaconState,
|
|
9
9
|
stateTransition,
|
|
10
10
|
} from "@lodestar/state-transition";
|
|
@@ -15,16 +15,16 @@ import {HistoricalStateRegenMetrics} from "./metrics.js";
|
|
|
15
15
|
import {RegenErrorType} from "./types.js";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
* Populate a
|
|
18
|
+
* Populate a PubkeyCache with any new entries based on a BeaconState
|
|
19
19
|
*/
|
|
20
|
-
export function syncPubkeyCache(state: BeaconStateAllForks,
|
|
20
|
+
export function syncPubkeyCache(state: BeaconStateAllForks, pubkeyCache: PubkeyCache): void {
|
|
21
21
|
// Get the validators sub tree once for all the loop
|
|
22
22
|
const validators = state.validators;
|
|
23
23
|
|
|
24
24
|
const newCount = state.validators.length;
|
|
25
|
-
for (let i =
|
|
25
|
+
for (let i = pubkeyCache.size; i < newCount; i++) {
|
|
26
26
|
const pubkey = validators.getReadonly(i).pubkey;
|
|
27
|
-
|
|
27
|
+
pubkeyCache.set(i, pubkey);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -35,7 +35,7 @@ export async function getNearestState(
|
|
|
35
35
|
slot: number,
|
|
36
36
|
config: BeaconConfig,
|
|
37
37
|
db: IBeaconDb,
|
|
38
|
-
|
|
38
|
+
pubkeyCache: PubkeyCache
|
|
39
39
|
): Promise<CachedBeaconStateAllForks> {
|
|
40
40
|
const stateBytesArr = await db.stateArchive.binaries({limit: 1, lte: slot, reverse: true});
|
|
41
41
|
if (!stateBytesArr.length) {
|
|
@@ -44,14 +44,13 @@ export async function getNearestState(
|
|
|
44
44
|
|
|
45
45
|
const stateBytes = stateBytesArr[0];
|
|
46
46
|
const state = getStateTypeFromBytes(config, stateBytes).deserializeToViewDU(stateBytes);
|
|
47
|
-
syncPubkeyCache(state,
|
|
47
|
+
syncPubkeyCache(state, pubkeyCache);
|
|
48
48
|
|
|
49
49
|
return createCachedBeaconState(
|
|
50
50
|
state,
|
|
51
51
|
{
|
|
52
52
|
config,
|
|
53
|
-
|
|
54
|
-
index2pubkey: [],
|
|
53
|
+
pubkeyCache,
|
|
55
54
|
},
|
|
56
55
|
{
|
|
57
56
|
skipSyncPubkeys: true,
|
|
@@ -66,13 +65,13 @@ export async function getHistoricalState(
|
|
|
66
65
|
slot: number,
|
|
67
66
|
config: BeaconConfig,
|
|
68
67
|
db: IBeaconDb,
|
|
69
|
-
|
|
68
|
+
pubkeyCache: PubkeyCache,
|
|
70
69
|
metrics?: HistoricalStateRegenMetrics
|
|
71
70
|
): Promise<Uint8Array> {
|
|
72
71
|
const regenTimer = metrics?.regenTime.startTimer();
|
|
73
72
|
|
|
74
73
|
const loadStateTimer = metrics?.loadStateTime.startTimer();
|
|
75
|
-
let state = await getNearestState(slot, config, db,
|
|
74
|
+
let state = await getNearestState(slot, config, db, pubkeyCache).catch((e) => {
|
|
76
75
|
metrics?.regenErrorCount.inc({reason: RegenErrorType.loadState});
|
|
77
76
|
throw e;
|
|
78
77
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import worker from "node:worker_threads";
|
|
2
|
-
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
3
2
|
import {Transfer, expose} from "@chainsafe/threads/worker";
|
|
4
3
|
import {chainConfigFromJson, createBeaconConfig} from "@lodestar/config";
|
|
5
4
|
import {LevelDbController} from "@lodestar/db/controller/level";
|
|
6
5
|
import {getNodeLogger} from "@lodestar/logger/node";
|
|
6
|
+
import {createPubkeyCache} from "@lodestar/state-transition";
|
|
7
7
|
import {BeaconDb} from "../../../db/index.js";
|
|
8
8
|
import {RegistryMetricCreator, collectNodeJSMetrics} from "../../../metrics/index.js";
|
|
9
9
|
import {JobFnQueue} from "../../../util/queue/fnQueue.js";
|
|
@@ -52,7 +52,7 @@ const queue = new JobFnQueue(
|
|
|
52
52
|
queueMetrics
|
|
53
53
|
);
|
|
54
54
|
|
|
55
|
-
const
|
|
55
|
+
const pubkeyCache = createPubkeyCache();
|
|
56
56
|
|
|
57
57
|
const api: HistoricalStateWorkerApi = {
|
|
58
58
|
async close() {
|
|
@@ -65,7 +65,7 @@ const api: HistoricalStateWorkerApi = {
|
|
|
65
65
|
historicalStateRegenMetrics?.regenRequestCount.inc();
|
|
66
66
|
|
|
67
67
|
const stateBytes = await queue.push<Uint8Array>(() =>
|
|
68
|
-
getHistoricalState(slot, config, db,
|
|
68
|
+
getHistoricalState(slot, config, db, pubkeyCache, historicalStateRegenMetrics)
|
|
69
69
|
);
|
|
70
70
|
const result = Transfer(stateBytes, [stateBytes.buffer]) as unknown as Uint8Array;
|
|
71
71
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {CheckpointWithHex} from "@lodestar/fork-choice";
|
|
2
|
+
import {IBeaconChain} from "../../interface.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Archives execution payload envelopes from hot DB to archive DB after finalization.
|
|
6
|
+
*/
|
|
7
|
+
export async function archiveExecutionPayloadEnvelopes(
|
|
8
|
+
chain: IBeaconChain,
|
|
9
|
+
_finalized: CheckpointWithHex
|
|
10
|
+
): Promise<void> {
|
|
11
|
+
const finalizedBlock = chain.forkChoice.getFinalizedBlock();
|
|
12
|
+
if (!finalizedBlock) return;
|
|
13
|
+
|
|
14
|
+
// TODO GLOAS: Implement payload envelope archival after epbs fork choice changes are merged
|
|
15
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {ForkName, ForkPostFulu, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
|
|
2
|
-
import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
|
|
1
|
+
import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
|
|
2
|
+
import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
|
|
3
3
|
import {byteArrayEquals, fromHex, prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
|
|
4
4
|
import {VersionedHashes} from "../../../execution/index.js";
|
|
5
5
|
import {kzgCommitmentToVersionedHash} from "../../../util/blobs.js";
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
SourceMeta,
|
|
25
25
|
} from "./types.js";
|
|
26
26
|
|
|
27
|
-
export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns;
|
|
27
|
+
export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns | BlockInputNoData;
|
|
28
28
|
|
|
29
29
|
export function isBlockInputPreDeneb(blockInput: IBlockInput): blockInput is BlockInputPreData {
|
|
30
30
|
return blockInput.type === DAType.PreData;
|
|
@@ -37,6 +37,10 @@ export function isBlockInputColumns(blockInput: IBlockInput): blockInput is Bloc
|
|
|
37
37
|
return blockInput.type === DAType.Columns;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
export function isBlockInputNoData(blockInput: IBlockInput): blockInput is BlockInputNoData {
|
|
41
|
+
return blockInput.type === DAType.NoData;
|
|
42
|
+
}
|
|
43
|
+
|
|
40
44
|
function createPromise<T>(): PromiseParts<T> {
|
|
41
45
|
let resolve!: (value: T) => void;
|
|
42
46
|
let reject!: (e: Error) => void;
|
|
@@ -903,3 +907,64 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
|
|
|
903
907
|
return Promise.resolve(this.getSampledColumns());
|
|
904
908
|
}
|
|
905
909
|
}
|
|
910
|
+
|
|
911
|
+
type BlockInputNoDataState = {
|
|
912
|
+
hasBlock: true;
|
|
913
|
+
hasAllData: true;
|
|
914
|
+
block: SignedBeaconBlock<ForkPostGloas>;
|
|
915
|
+
source: SourceMeta;
|
|
916
|
+
timeCompleteSec: number;
|
|
917
|
+
};
|
|
918
|
+
|
|
919
|
+
export class BlockInputNoData extends AbstractBlockInput<ForkPostGloas, null> {
|
|
920
|
+
type = DAType.NoData as const;
|
|
921
|
+
|
|
922
|
+
state: BlockInputNoDataState;
|
|
923
|
+
|
|
924
|
+
private constructor(init: BlockInputInit, state: BlockInputNoDataState) {
|
|
925
|
+
super(init);
|
|
926
|
+
this.state = state;
|
|
927
|
+
this.dataPromise.resolve(null);
|
|
928
|
+
this.blockPromise.resolve(state.block);
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
static createFromBlock(props: AddBlock<ForkPostGloas> & CreateBlockInputMeta): BlockInputNoData {
|
|
932
|
+
const init: BlockInputInit = {
|
|
933
|
+
daOutOfRange: props.daOutOfRange,
|
|
934
|
+
timeCreated: props.seenTimestampSec,
|
|
935
|
+
forkName: props.forkName,
|
|
936
|
+
slot: props.block.message.slot,
|
|
937
|
+
blockRootHex: props.blockRootHex,
|
|
938
|
+
parentRootHex: toRootHex(props.block.message.parentRoot),
|
|
939
|
+
};
|
|
940
|
+
const state: BlockInputNoDataState = {
|
|
941
|
+
hasBlock: true,
|
|
942
|
+
hasAllData: true,
|
|
943
|
+
block: props.block,
|
|
944
|
+
source: {
|
|
945
|
+
source: props.source,
|
|
946
|
+
seenTimestampSec: props.seenTimestampSec,
|
|
947
|
+
peerIdStr: props.peerIdStr,
|
|
948
|
+
},
|
|
949
|
+
timeCompleteSec: props.seenTimestampSec,
|
|
950
|
+
};
|
|
951
|
+
return new BlockInputNoData(init, state);
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
addBlock(_: AddBlock<ForkPostGloas>, opts = {throwOnDuplicateAdd: true}): void {
|
|
955
|
+
if (opts.throwOnDuplicateAdd) {
|
|
956
|
+
throw new BlockInputError(
|
|
957
|
+
{
|
|
958
|
+
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
959
|
+
blockRoot: this.blockRootHex,
|
|
960
|
+
},
|
|
961
|
+
"Cannot addBlock to BlockInputNoData - block already exists"
|
|
962
|
+
);
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
getBlobKzgCommitments(): deneb.BlobKzgCommitments {
|
|
967
|
+
return (this.state.block.message.body as gloas.BeaconBlockBody).signedExecutionPayloadBid.message
|
|
968
|
+
.blobKzgCommitments;
|
|
969
|
+
}
|
|
970
|
+
}
|
|
@@ -29,6 +29,9 @@ export async function verifyBlocksDataAvailability(
|
|
|
29
29
|
|
|
30
30
|
const availableTime = Math.max(0, Math.max(...blocks.map((blockInput) => blockInput.getTimeComplete())));
|
|
31
31
|
const dataAvailabilityStatuses: DataAvailabilityStatus[] = blocks.map((blockInput) => {
|
|
32
|
+
if (blockInput.type === DAType.NoData) {
|
|
33
|
+
return DataAvailabilityStatus.NotRequired;
|
|
34
|
+
}
|
|
32
35
|
if (blockInput.type === DAType.PreData) {
|
|
33
36
|
return DataAvailabilityStatus.PreData;
|
|
34
37
|
}
|
|
@@ -21,7 +21,7 @@ import {Metrics} from "../../metrics/metrics.js";
|
|
|
21
21
|
import {IClock} from "../../util/clock.js";
|
|
22
22
|
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
23
23
|
import {BlockProcessOpts} from "../options.js";
|
|
24
|
-
import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
|
|
24
|
+
import {isBlockInputBlobs, isBlockInputColumns, isBlockInputNoData} from "./blockInput/blockInput.js";
|
|
25
25
|
import {IBlockInput} from "./blockInput/types.js";
|
|
26
26
|
import {ImportBlockOpts} from "./types.js";
|
|
27
27
|
|
|
@@ -51,7 +51,8 @@ type VerifyBlockExecutionResponse =
|
|
|
51
51
|
| VerifyExecutionErrorResponse
|
|
52
52
|
| {executionStatus: ExecutionStatus.Valid; lvhResponse: LVHValidResponse; execError: null}
|
|
53
53
|
| {executionStatus: ExecutionStatus.Syncing; lvhResponse?: LVHValidResponse; execError: null}
|
|
54
|
-
| {executionStatus: ExecutionStatus.PreMerge; lvhResponse: undefined; execError: null}
|
|
54
|
+
| {executionStatus: ExecutionStatus.PreMerge; lvhResponse: undefined; execError: null}
|
|
55
|
+
| {executionStatus: ExecutionStatus.PayloadSeparated; lvhResponse: undefined; execError: null};
|
|
55
56
|
|
|
56
57
|
/**
|
|
57
58
|
* Verifies 1 or more execution payloads from a linear sequence of blocks.
|
|
@@ -148,6 +149,12 @@ export async function verifyBlockExecutionPayload(
|
|
|
148
149
|
preState0: CachedBeaconStateAllForks
|
|
149
150
|
): Promise<VerifyBlockExecutionResponse> {
|
|
150
151
|
const block = blockInput.getBlock();
|
|
152
|
+
|
|
153
|
+
// Gloas block doesn't have execution payload. Return right away
|
|
154
|
+
if (isBlockInputNoData(blockInput)) {
|
|
155
|
+
return {executionStatus: ExecutionStatus.PayloadSeparated, lvhResponse: undefined, execError: null};
|
|
156
|
+
}
|
|
157
|
+
|
|
151
158
|
/** Not null if execution is enabled */
|
|
152
159
|
const executionPayloadEnabled =
|
|
153
160
|
isExecutionStateType(preState0) &&
|