@lodestar/beacon-node 1.42.0-dev.7b5ce3932d → 1.42.0-dev.83dedda569
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/beacon/blocks/index.js +1 -1
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +1 -1
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/index.js +27 -32
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +4 -4
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +7 -10
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/lodestar/index.d.ts.map +1 -1
- package/lib/api/impl/lodestar/index.js +4 -6
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/proof/index.d.ts.map +1 -1
- package/lib/api/impl/proof/index.js +2 -6
- package/lib/api/impl/proof/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +27 -27
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +2 -2
- package/lib/api/impl/validator/utils.d.ts.map +1 -1
- package/lib/api/impl/validator/utils.js +3 -3
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +2 -6
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +3 -23
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -0
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/balancesCache.d.ts +2 -2
- package/lib/chain/balancesCache.d.ts.map +1 -1
- package/lib/chain/balancesCache.js +4 -4
- package/lib/chain/balancesCache.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +1 -0
- 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/importBlock.d.ts +3 -3
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +9 -9
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +4 -5
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.js +1 -1
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +2 -2
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
- package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts +2 -2
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +4 -4
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +3 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +3 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/chain.d.ts +12 -12
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +47 -39
- 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/errors/blockError.d.ts +4 -4
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +4 -4
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +27 -23
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/initState.d.ts +2 -2
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +1 -1
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +11 -12
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/lightClient/index.d.ts +2 -2
- package/lib/chain/lightClient/index.d.ts.map +1 -1
- package/lib/chain/lightClient/index.js +4 -4
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +10 -13
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/opPool.d.ts +3 -3
- package/lib/chain/opPools/opPool.d.ts.map +1 -1
- package/lib/chain/opPools/opPool.js +7 -7
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +2 -2
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +2 -2
- package/lib/chain/prepareNextSlot.d.ts.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 +4 -4
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +3 -4
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +12 -16
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +13 -13
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +14 -14
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +6 -5
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +6 -6
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/serializeState.d.ts +2 -2
- package/lib/chain/serializeState.d.ts.map +1 -1
- package/lib/chain/serializeState.js +1 -1
- package/lib/chain/serializeState.js.map +1 -1
- package/lib/chain/shufflingCache.d.ts +2 -2
- package/lib/chain/shufflingCache.d.ts.map +1 -1
- package/lib/chain/shufflingCache.js +3 -4
- package/lib/chain/shufflingCache.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +14 -14
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +3 -3
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/blobSidecar.js +1 -1
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +3 -3
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/blsToExecutionChange.js +2 -2
- package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +1 -1
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +4 -4
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +2 -3
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +1 -2
- 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/signatureSets/contributionAndProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
- package/lib/chain/validation/syncCommittee.d.ts +4 -4
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +13 -12
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +3 -3
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +3 -3
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +9 -7
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +12 -4
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +19 -15
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/encoding.d.ts.map +1 -1
- package/lib/network/gossip/encoding.js +15 -0
- package/lib/network/gossip/encoding.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +2 -729
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/interface.d.ts +4 -2
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -0
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +4 -2
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +9 -3
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
- package/lib/network/processor/extractSlotRootFns.js +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +9 -7
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/index.d.ts +12 -7
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +99 -78
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +9 -0
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +11 -1
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +2 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +10 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +8 -0
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +2 -0
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +8 -2
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +7 -1
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/node/nodejs.d.ts +2 -2
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +1 -4
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.d.ts.map +1 -1
- package/lib/node/notifier.js +3 -3
- package/lib/node/notifier.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts +2 -2
- package/lib/sync/backfill/backfill.d.ts.map +1 -1
- package/lib/sync/backfill/backfill.js +2 -2
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +3 -9
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +8 -41
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/types.d.ts +2 -0
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -0
- package/lib/util/types.js.map +1 -1
- package/package.json +16 -16
- package/src/api/impl/beacon/blocks/index.ts +1 -1
- package/src/api/impl/beacon/pool/index.ts +1 -1
- package/src/api/impl/beacon/state/index.ts +29 -41
- package/src/api/impl/beacon/state/utils.ts +11 -25
- package/src/api/impl/lodestar/index.ts +4 -8
- package/src/api/impl/proof/index.ts +2 -9
- package/src/api/impl/validator/index.ts +29 -41
- package/src/api/impl/validator/utils.ts +4 -7
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +6 -36
- package/src/chain/archiveStore/historicalState/worker.ts +1 -0
- package/src/chain/balancesCache.ts +5 -11
- package/src/chain/blocks/blockInput/types.ts +1 -0
- package/src/chain/blocks/importBlock.ts +11 -14
- package/src/chain/blocks/importExecutionPayload.ts +6 -11
- package/src/chain/blocks/index.ts +1 -1
- package/src/chain/blocks/types.ts +2 -2
- package/src/chain/blocks/utils/checkpoint.ts +2 -2
- package/src/chain/blocks/verifyBlock.ts +5 -10
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +5 -10
- package/src/chain/blocks/verifyBlocksSignatures.ts +3 -3
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
- package/src/chain/chain.ts +75 -67
- package/src/chain/emitter.ts +2 -2
- package/src/chain/errors/blockError.ts +4 -4
- package/src/chain/forkChoice/index.ts +33 -42
- package/src/chain/initState.ts +7 -2
- package/src/chain/interface.ts +12 -13
- package/src/chain/lightClient/index.ts +9 -22
- package/src/chain/opPools/aggregatedAttestationPool.ts +15 -21
- package/src/chain/opPools/opPool.ts +13 -14
- package/src/chain/opPools/utils.ts +3 -3
- package/src/chain/prepareNextSlot.ts +6 -8
- package/src/chain/produceBlock/computeNewStateRoot.ts +6 -10
- package/src/chain/produceBlock/produceBlockBody.ts +22 -49
- package/src/chain/regen/interface.ts +13 -17
- package/src/chain/regen/queued.ts +16 -20
- package/src/chain/regen/regen.ts +16 -17
- package/src/chain/serializeState.ts +3 -3
- package/src/chain/shufflingCache.ts +5 -7
- package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
- package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
- package/src/chain/stateCache/types.ts +14 -18
- package/src/chain/validation/attesterSlashing.ts +3 -3
- package/src/chain/validation/blobSidecar.ts +1 -1
- package/src/chain/validation/block.ts +2 -4
- package/src/chain/validation/blsToExecutionChange.ts +2 -2
- package/src/chain/validation/dataColumnSidecar.ts +1 -1
- package/src/chain/validation/executionPayloadBid.ts +3 -7
- package/src/chain/validation/executionPayloadEnvelope.ts +2 -8
- package/src/chain/validation/payloadAttestationMessage.ts +2 -4
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
- package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
- package/src/chain/validation/syncCommittee.ts +21 -20
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -10
- package/src/chain/validation/voluntaryExit.ts +3 -8
- package/src/chain/validatorMonitor.ts +12 -11
- package/src/metrics/metrics/lodestar.ts +23 -19
- package/src/network/gossip/encoding.ts +16 -0
- package/src/network/interface.ts +15 -2
- package/src/network/libp2p/index.ts +5 -0
- package/src/network/network.ts +32 -4
- package/src/network/processor/extractSlotRootFns.ts +1 -1
- package/src/network/processor/gossipHandlers.ts +9 -8
- package/src/network/processor/index.ts +110 -89
- package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
- package/src/network/reqresp/handlers/index.ts +12 -0
- package/src/network/reqresp/protocols.ts +12 -0
- package/src/network/reqresp/rateLimit.ts +18 -0
- package/src/network/reqresp/score.ts +2 -0
- package/src/network/reqresp/types.ts +13 -0
- package/src/node/nodejs.ts +3 -5
- package/src/node/notifier.ts +4 -10
- package/src/sync/backfill/backfill.ts +3 -3
- package/src/sync/unknownBlock.ts +10 -50
- package/src/util/types.ts +6 -0
|
@@ -8,17 +8,12 @@ import {
|
|
|
8
8
|
isForkPostFulu,
|
|
9
9
|
} from "@lodestar/params";
|
|
10
10
|
import {
|
|
11
|
-
|
|
12
|
-
BeaconStateElectra,
|
|
13
|
-
BeaconStateFulu,
|
|
14
|
-
CachedBeaconStateAltair,
|
|
11
|
+
IBeaconStateView,
|
|
15
12
|
computeEpochAtSlot,
|
|
16
13
|
computeStartSlotAtEpoch,
|
|
17
14
|
getCurrentEpoch,
|
|
18
|
-
getRandaoMix,
|
|
19
|
-
loadState,
|
|
20
15
|
} from "@lodestar/state-transition";
|
|
21
|
-
import {ValidatorIndex, getValidatorStatus} from "@lodestar/types";
|
|
16
|
+
import {ValidatorIndex, getValidatorStatus, ssz} from "@lodestar/types";
|
|
22
17
|
import {ApiError} from "../../errors.js";
|
|
23
18
|
import {ApiModules} from "../../types.js";
|
|
24
19
|
import {assertUniqueItems} from "../../utils.js";
|
|
@@ -35,11 +30,11 @@ export function getBeaconStateApi({
|
|
|
35
30
|
}: Pick<ApiModules, "chain" | "config">): ApplicationMethods<routes.beacon.state.Endpoints> {
|
|
36
31
|
async function getState(
|
|
37
32
|
stateId: routes.beacon.StateId
|
|
38
|
-
): Promise<{state:
|
|
33
|
+
): Promise<{state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean}> {
|
|
39
34
|
const {state, executionOptimistic, finalized} = await getStateResponseWithRegen(chain, stateId);
|
|
40
35
|
|
|
41
36
|
return {
|
|
42
|
-
state: state instanceof Uint8Array ?
|
|
37
|
+
state: state instanceof Uint8Array ? chain.getHeadState().loadOtherState(state) : state,
|
|
43
38
|
executionOptimistic,
|
|
44
39
|
finalized,
|
|
45
40
|
};
|
|
@@ -71,7 +66,7 @@ export function getBeaconStateApi({
|
|
|
71
66
|
throw new ApiError(400, "Requested epoch is out of range");
|
|
72
67
|
}
|
|
73
68
|
|
|
74
|
-
const randao = getRandaoMix(
|
|
69
|
+
const randao = state.getRandaoMix(usedEpoch);
|
|
75
70
|
|
|
76
71
|
return {
|
|
77
72
|
data: {randao},
|
|
@@ -94,7 +89,6 @@ export function getBeaconStateApi({
|
|
|
94
89
|
async getStateValidators({stateId, validatorIds = [], statuses = []}) {
|
|
95
90
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
96
91
|
const currentEpoch = getCurrentEpoch(state);
|
|
97
|
-
const {validators, balances} = state; // Get the validators sub tree once for all the loop
|
|
98
92
|
const {pubkeyCache} = chain;
|
|
99
93
|
|
|
100
94
|
const validatorResponses: routes.beacon.ValidatorResponse[] = [];
|
|
@@ -105,14 +99,14 @@ export function getBeaconStateApi({
|
|
|
105
99
|
const resp = getStateValidatorIndex(id, state, pubkeyCache);
|
|
106
100
|
if (resp.valid) {
|
|
107
101
|
const validatorIndex = resp.validatorIndex;
|
|
108
|
-
const validator =
|
|
102
|
+
const validator = state.getValidator(validatorIndex);
|
|
109
103
|
if (statuses.length && !statuses.includes(getValidatorStatus(validator, currentEpoch))) {
|
|
110
104
|
continue;
|
|
111
105
|
}
|
|
112
106
|
const validatorResponse = toValidatorResponse(
|
|
113
107
|
validatorIndex,
|
|
114
108
|
validator,
|
|
115
|
-
|
|
109
|
+
state.getBalance(validatorIndex),
|
|
116
110
|
currentEpoch
|
|
117
111
|
);
|
|
118
112
|
validatorResponses.push(validatorResponse);
|
|
@@ -135,8 +129,8 @@ export function getBeaconStateApi({
|
|
|
135
129
|
}
|
|
136
130
|
|
|
137
131
|
// TODO: This loops over the entire state, it's a DOS vector
|
|
138
|
-
const validatorsArr = state.
|
|
139
|
-
const balancesArr = state.
|
|
132
|
+
const validatorsArr = state.getAllValidators();
|
|
133
|
+
const balancesArr = state.getAllBalances();
|
|
140
134
|
const resp: routes.beacon.ValidatorResponse[] = [];
|
|
141
135
|
for (let i = 0; i < validatorsArr.length; i++) {
|
|
142
136
|
resp.push(toValidatorResponse(i, validatorsArr[i], balancesArr[i], currentEpoch));
|
|
@@ -166,12 +160,12 @@ export function getBeaconStateApi({
|
|
|
166
160
|
const resp = getStateValidatorIndex(id, state, pubkeyCache);
|
|
167
161
|
if (resp.valid) {
|
|
168
162
|
const index = resp.validatorIndex;
|
|
169
|
-
const {pubkey, activationEpoch} = state.
|
|
163
|
+
const {pubkey, activationEpoch} = state.getValidator(index);
|
|
170
164
|
validatorIdentities.push({index, pubkey, activationEpoch});
|
|
171
165
|
}
|
|
172
166
|
}
|
|
173
167
|
} else {
|
|
174
|
-
const validatorsArr = state.
|
|
168
|
+
const validatorsArr = state.getAllValidators();
|
|
175
169
|
validatorIdentities = new Array(validatorsArr.length) as routes.beacon.ValidatorIdentities;
|
|
176
170
|
for (let i = 0; i < validatorsArr.length; i++) {
|
|
177
171
|
const {pubkey, activationEpoch} = validatorsArr[i];
|
|
@@ -198,8 +192,8 @@ export function getBeaconStateApi({
|
|
|
198
192
|
return {
|
|
199
193
|
data: toValidatorResponse(
|
|
200
194
|
validatorIndex,
|
|
201
|
-
state.
|
|
202
|
-
state.
|
|
195
|
+
state.getValidator(validatorIndex),
|
|
196
|
+
state.getBalance(validatorIndex),
|
|
203
197
|
getCurrentEpoch(state)
|
|
204
198
|
),
|
|
205
199
|
meta: {executionOptimistic, finalized},
|
|
@@ -219,7 +213,7 @@ export function getBeaconStateApi({
|
|
|
219
213
|
if (resp.valid) {
|
|
220
214
|
balances.push({
|
|
221
215
|
index: resp.validatorIndex,
|
|
222
|
-
balance: state.
|
|
216
|
+
balance: state.getBalance(resp.validatorIndex),
|
|
223
217
|
});
|
|
224
218
|
}
|
|
225
219
|
}
|
|
@@ -230,7 +224,7 @@ export function getBeaconStateApi({
|
|
|
230
224
|
}
|
|
231
225
|
|
|
232
226
|
// TODO: This loops over the entire state, it's a DOS vector
|
|
233
|
-
const balancesArr = state.
|
|
227
|
+
const balancesArr = state.getAllBalances();
|
|
234
228
|
const resp: routes.beacon.ValidatorBalance[] = [];
|
|
235
229
|
for (let i = 0; i < balancesArr.length; i++) {
|
|
236
230
|
resp.push({index: i, balance: balancesArr[i]});
|
|
@@ -248,11 +242,6 @@ export function getBeaconStateApi({
|
|
|
248
242
|
async getEpochCommittees({stateId, ...filters}) {
|
|
249
243
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
250
244
|
|
|
251
|
-
const stateCached = state as CachedBeaconStateAltair;
|
|
252
|
-
if (stateCached.epochCtx === undefined) {
|
|
253
|
-
throw new ApiError(400, `No cached state available for stateId: ${stateId}`);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
245
|
const stateEpoch = computeEpochAtSlot(state.slot);
|
|
257
246
|
const epoch = filters.epoch ?? stateEpoch;
|
|
258
247
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
@@ -266,7 +255,7 @@ export function getBeaconStateApi({
|
|
|
266
255
|
throw new ApiError(400, `Slot ${filters.slot} is not in epoch ${epoch}`);
|
|
267
256
|
}
|
|
268
257
|
|
|
269
|
-
const decisionRoot =
|
|
258
|
+
const decisionRoot = state.getShufflingDecisionRoot(epoch);
|
|
270
259
|
const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
|
|
271
260
|
if (!shuffling) {
|
|
272
261
|
throw new ApiError(
|
|
@@ -315,12 +304,7 @@ export function getBeaconStateApi({
|
|
|
315
304
|
throw new ApiError(400, "Requested state before ALTAIR_FORK_EPOCH");
|
|
316
305
|
}
|
|
317
306
|
|
|
318
|
-
const
|
|
319
|
-
if (stateCached.epochCtx === undefined) {
|
|
320
|
-
throw new ApiError(400, `No cached state available for stateId: ${stateId}`);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
const syncCommitteeCache = stateCached.epochCtx.getIndexedSyncCommitteeAtEpoch(epoch ?? stateEpoch);
|
|
307
|
+
const syncCommitteeCache = state.getIndexedSyncCommitteeAtEpoch(epoch ?? stateEpoch);
|
|
324
308
|
const validatorIndices = new Array<ValidatorIndex>(...syncCommitteeCache.validatorIndices);
|
|
325
309
|
|
|
326
310
|
// Subcommittee assignments of the current sync committee
|
|
@@ -346,10 +330,10 @@ export function getBeaconStateApi({
|
|
|
346
330
|
throw new ApiError(400, `Cannot retrieve pending deposits for pre-electra state fork=${fork}`);
|
|
347
331
|
}
|
|
348
332
|
|
|
349
|
-
const
|
|
333
|
+
const pendingDeposits = state.pendingDeposits;
|
|
350
334
|
|
|
351
335
|
return {
|
|
352
|
-
data: context?.returnBytes ?
|
|
336
|
+
data: context?.returnBytes ? ssz.electra.PendingDeposits.serialize(pendingDeposits) : pendingDeposits,
|
|
353
337
|
meta: {executionOptimistic, finalized, version: fork},
|
|
354
338
|
};
|
|
355
339
|
},
|
|
@@ -362,10 +346,12 @@ export function getBeaconStateApi({
|
|
|
362
346
|
throw new ApiError(400, `Cannot retrieve pending partial withdrawals for pre-electra state fork=${fork}`);
|
|
363
347
|
}
|
|
364
348
|
|
|
365
|
-
const
|
|
349
|
+
const pendingPartialWithdrawals = state.pendingPartialWithdrawals;
|
|
366
350
|
|
|
367
351
|
return {
|
|
368
|
-
data: context?.returnBytes
|
|
352
|
+
data: context?.returnBytes
|
|
353
|
+
? ssz.electra.PendingPartialWithdrawals.serialize(pendingPartialWithdrawals)
|
|
354
|
+
: pendingPartialWithdrawals,
|
|
369
355
|
meta: {executionOptimistic, finalized, version: fork},
|
|
370
356
|
};
|
|
371
357
|
},
|
|
@@ -378,10 +364,12 @@ export function getBeaconStateApi({
|
|
|
378
364
|
throw new ApiError(400, `Cannot retrieve pending consolidations for pre-electra state fork=${fork}`);
|
|
379
365
|
}
|
|
380
366
|
|
|
381
|
-
const
|
|
367
|
+
const pendingConsolidations = state.pendingConsolidations;
|
|
382
368
|
|
|
383
369
|
return {
|
|
384
|
-
data: context?.returnBytes
|
|
370
|
+
data: context?.returnBytes
|
|
371
|
+
? ssz.electra.PendingConsolidations.serialize(pendingConsolidations)
|
|
372
|
+
: pendingConsolidations,
|
|
385
373
|
meta: {executionOptimistic, finalized, version: fork},
|
|
386
374
|
};
|
|
387
375
|
},
|
|
@@ -394,10 +382,10 @@ export function getBeaconStateApi({
|
|
|
394
382
|
throw new ApiError(400, `Cannot retrieve proposer lookahead for pre-fulu state fork=${fork}`);
|
|
395
383
|
}
|
|
396
384
|
|
|
397
|
-
const
|
|
385
|
+
const proposerLookahead = state.proposerLookahead;
|
|
398
386
|
|
|
399
387
|
return {
|
|
400
|
-
data: context?.returnBytes ?
|
|
388
|
+
data: context?.returnBytes ? ssz.fulu.ProposerLookahead.serialize(proposerLookahead) : proposerLookahead,
|
|
401
389
|
meta: {executionOptimistic, finalized, version: fork},
|
|
402
390
|
};
|
|
403
391
|
},
|
|
@@ -1,17 +1,8 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
2
|
import {CheckpointWithPayloadStatus, IForkChoice} from "@lodestar/fork-choice";
|
|
3
3
|
import {GENESIS_SLOT} from "@lodestar/params";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
BLSPubkey,
|
|
7
|
-
Epoch,
|
|
8
|
-
RootHex,
|
|
9
|
-
Slot,
|
|
10
|
-
ValidatorIndex,
|
|
11
|
-
getValidatorStatus,
|
|
12
|
-
mapToGeneralStatus,
|
|
13
|
-
phase0,
|
|
14
|
-
} from "@lodestar/types";
|
|
4
|
+
import {IBeaconStateView, PubkeyCache} from "@lodestar/state-transition";
|
|
5
|
+
import {BLSPubkey, Epoch, RootHex, Slot, ValidatorIndex, getValidatorStatus, phase0} from "@lodestar/types";
|
|
15
6
|
import {fromHex} from "@lodestar/utils";
|
|
16
7
|
import {IBeaconChain} from "../../../../chain/index.js";
|
|
17
8
|
import {ApiError, ValidationError} from "../../errors.js";
|
|
@@ -52,7 +43,7 @@ export function resolveStateId(
|
|
|
52
43
|
export async function getStateResponseWithRegen(
|
|
53
44
|
chain: IBeaconChain,
|
|
54
45
|
inStateId: routes.beacon.StateId
|
|
55
|
-
): Promise<{state:
|
|
46
|
+
): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean}> {
|
|
56
47
|
const stateId = resolveStateId(chain.forkChoice, inStateId);
|
|
57
48
|
|
|
58
49
|
const res =
|
|
@@ -89,22 +80,17 @@ export function toValidatorResponse(
|
|
|
89
80
|
|
|
90
81
|
export function filterStateValidatorsByStatus(
|
|
91
82
|
statuses: string[],
|
|
92
|
-
state:
|
|
83
|
+
state: IBeaconStateView,
|
|
93
84
|
pubkeyCache: PubkeyCache,
|
|
94
85
|
currentEpoch: Epoch
|
|
95
86
|
): routes.beacon.ValidatorResponse[] {
|
|
96
87
|
const responses: routes.beacon.ValidatorResponse[] = [];
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
for (const validator of validatorsArr) {
|
|
101
|
-
const validatorStatus = getValidatorStatus(validator, currentEpoch);
|
|
102
|
-
const generalStatus = mapToGeneralStatus(validatorStatus);
|
|
103
|
-
|
|
88
|
+
const validators = state.getValidatorsByStatus(new Set(statuses), currentEpoch);
|
|
89
|
+
for (const validator of validators) {
|
|
104
90
|
const resp = getStateValidatorIndex(validator.pubkey, state, pubkeyCache);
|
|
105
|
-
if (resp.valid
|
|
91
|
+
if (resp.valid) {
|
|
106
92
|
responses.push(
|
|
107
|
-
toValidatorResponse(resp.validatorIndex, validator, state.
|
|
93
|
+
toValidatorResponse(resp.validatorIndex, validator, state.getBalance(resp.validatorIndex), currentEpoch)
|
|
108
94
|
);
|
|
109
95
|
}
|
|
110
96
|
}
|
|
@@ -117,7 +103,7 @@ type StateValidatorIndexResponse =
|
|
|
117
103
|
|
|
118
104
|
export function getStateValidatorIndex(
|
|
119
105
|
id: routes.beacon.ValidatorId | BLSPubkey,
|
|
120
|
-
state:
|
|
106
|
+
state: IBeaconStateView,
|
|
121
107
|
pubkeyCache: PubkeyCache
|
|
122
108
|
): StateValidatorIndexResponse {
|
|
123
109
|
if (typeof id === "string") {
|
|
@@ -139,7 +125,7 @@ export function getStateValidatorIndex(
|
|
|
139
125
|
if (!Number.isSafeInteger(validatorIndex)) {
|
|
140
126
|
return {valid: false, code: 400, reason: "Invalid validator index"};
|
|
141
127
|
}
|
|
142
|
-
if (validatorIndex >= state.
|
|
128
|
+
if (validatorIndex >= state.validatorCount) {
|
|
143
129
|
return {valid: false, code: 404, reason: "Validator index from future state"};
|
|
144
130
|
}
|
|
145
131
|
return {valid: true, validatorIndex};
|
|
@@ -150,7 +136,7 @@ export function getStateValidatorIndex(
|
|
|
150
136
|
if (validatorIndex === null) {
|
|
151
137
|
return {valid: false, code: 404, reason: "Validator pubkey not found in state"};
|
|
152
138
|
}
|
|
153
|
-
if (validatorIndex >= state.
|
|
139
|
+
if (validatorIndex >= state.validatorCount) {
|
|
154
140
|
return {valid: false, code: 404, reason: "Validator pubkey from future state"};
|
|
155
141
|
}
|
|
156
142
|
return {valid: true, validatorIndex};
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {Tree} from "@chainsafe/persistent-merkle-tree";
|
|
2
1
|
import {routes} from "@lodestar/api";
|
|
3
2
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
4
3
|
import {ChainForkConfig} from "@lodestar/config";
|
|
5
4
|
import {Repository} from "@lodestar/db";
|
|
6
5
|
import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
7
|
-
import {BeaconStateCapella, getLatestWeakSubjectivityCheckpointEpoch, loadState} from "@lodestar/state-transition";
|
|
8
6
|
import {ssz} from "@lodestar/types";
|
|
9
7
|
import {Checkpoint} from "@lodestar/types/phase0";
|
|
10
8
|
import {fromHex, toHex, toRootHex} from "@lodestar/utils";
|
|
@@ -86,7 +84,7 @@ export function getLodestarApi({
|
|
|
86
84
|
|
|
87
85
|
async getLatestWeakSubjectivityCheckpointEpoch() {
|
|
88
86
|
const state = chain.getHeadState();
|
|
89
|
-
return {data: getLatestWeakSubjectivityCheckpointEpoch(
|
|
87
|
+
return {data: state.getLatestWeakSubjectivityCheckpointEpoch()};
|
|
90
88
|
},
|
|
91
89
|
|
|
92
90
|
async getSyncChainsDebugState() {
|
|
@@ -214,9 +212,7 @@ export function getLodestarApi({
|
|
|
214
212
|
async getHistoricalSummaries({stateId}) {
|
|
215
213
|
const {state, executionOptimistic, finalized} = await getStateResponseWithRegen(chain, stateId);
|
|
216
214
|
|
|
217
|
-
const stateView = (
|
|
218
|
-
state instanceof Uint8Array ? loadState(config, chain.getHeadState(), state).state : state
|
|
219
|
-
) as BeaconStateCapella;
|
|
215
|
+
const stateView = state instanceof Uint8Array ? chain.getHeadState().loadOtherState(state) : state;
|
|
220
216
|
|
|
221
217
|
const fork = config.getForkName(stateView.slot);
|
|
222
218
|
if (ForkSeq[fork] < ForkSeq.capella) {
|
|
@@ -224,12 +220,12 @@ export function getLodestarApi({
|
|
|
224
220
|
}
|
|
225
221
|
|
|
226
222
|
const {gindex} = ssz[fork].BeaconState.getPathInfo(["historicalSummaries"]);
|
|
227
|
-
const proof =
|
|
223
|
+
const proof = stateView.getSingleProof(gindex);
|
|
228
224
|
|
|
229
225
|
return {
|
|
230
226
|
data: {
|
|
231
227
|
slot: stateView.slot,
|
|
232
|
-
historicalSummaries: stateView.historicalSummaries
|
|
228
|
+
historicalSummaries: stateView.historicalSummaries,
|
|
233
229
|
proof: proof,
|
|
234
230
|
},
|
|
235
231
|
meta: {executionOptimistic, finalized, version: fork},
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {CompactMultiProof, ProofType, createProof} from "@chainsafe/persistent-merkle-tree";
|
|
2
2
|
import {routes} from "@lodestar/api";
|
|
3
3
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
4
|
-
import {loadState} from "@lodestar/state-transition";
|
|
5
4
|
import {ApiOptions} from "../../options.js";
|
|
6
5
|
import {getBlockResponse} from "../beacon/blocks/utils.js";
|
|
7
6
|
import {getStateResponseWithRegen} from "../beacon/state/utils.js";
|
|
@@ -24,16 +23,10 @@ export function getProofApi(
|
|
|
24
23
|
|
|
25
24
|
const res = await getStateResponseWithRegen(chain, stateId);
|
|
26
25
|
|
|
27
|
-
const state =
|
|
28
|
-
res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state;
|
|
29
|
-
|
|
30
|
-
// there should be no state changes in beacon-node so no need to commit() here
|
|
31
|
-
const stateNode = state.node;
|
|
32
|
-
|
|
33
|
-
const proof = createProof(stateNode, {type: ProofType.compactMulti, descriptor});
|
|
26
|
+
const state = res.state instanceof Uint8Array ? chain.getHeadState().loadOtherState(res.state) : res.state;
|
|
34
27
|
|
|
35
28
|
return {
|
|
36
|
-
data:
|
|
29
|
+
data: state.createMultiProof(descriptor),
|
|
37
30
|
meta: {version: config.getForkName(state.slot)},
|
|
38
31
|
};
|
|
39
32
|
},
|
|
@@ -17,19 +17,14 @@ import {
|
|
|
17
17
|
isForkPostGloas,
|
|
18
18
|
} from "@lodestar/params";
|
|
19
19
|
import {
|
|
20
|
-
CachedBeaconStateAllForks,
|
|
21
20
|
DataAvailabilityStatus,
|
|
22
|
-
|
|
21
|
+
IBeaconStateView,
|
|
23
22
|
beaconBlockToBlinded,
|
|
24
23
|
calculateCommitteeAssignments,
|
|
25
24
|
computeEpochAtSlot,
|
|
26
25
|
computeStartSlotAtEpoch,
|
|
27
26
|
computeTimeAtSlot,
|
|
28
|
-
createCachedBeaconState,
|
|
29
|
-
createPubkeyCache,
|
|
30
|
-
getBlockRootAtSlot,
|
|
31
27
|
getCurrentSlot,
|
|
32
|
-
loadState,
|
|
33
28
|
proposerShufflingDecisionRoot,
|
|
34
29
|
} from "@lodestar/state-transition";
|
|
35
30
|
import {
|
|
@@ -193,11 +188,13 @@ export function getValidatorApi(
|
|
|
193
188
|
const MAX_API_CLOCK_DISPARITY_MS = MAX_API_CLOCK_DISPARITY_SEC * 1000;
|
|
194
189
|
|
|
195
190
|
/** Compute and cache the genesis block root */
|
|
196
|
-
async function getGenesisBlockRoot(state:
|
|
191
|
+
async function getGenesisBlockRoot(state: IBeaconStateView): Promise<Root> {
|
|
197
192
|
if (!genesisBlockRoot) {
|
|
198
193
|
// Close to genesis the genesis block may not be available in the DB
|
|
199
|
-
if (state.slot
|
|
200
|
-
genesisBlockRoot = state.
|
|
194
|
+
if (state.slot === GENESIS_SLOT) {
|
|
195
|
+
genesisBlockRoot = state.computeAnchorCheckpoint().checkpoint.root;
|
|
196
|
+
} else if (state.slot < SLOTS_PER_HISTORICAL_ROOT) {
|
|
197
|
+
genesisBlockRoot = state.getBlockRootAtSlot(GENESIS_SLOT);
|
|
201
198
|
}
|
|
202
199
|
|
|
203
200
|
const blockRes = await chain.getCanonicalBlockAtSlot(GENESIS_SLOT);
|
|
@@ -303,7 +300,7 @@ export function getValidatorApi(
|
|
|
303
300
|
* |
|
|
304
301
|
* prepareNextSlot (4s before next slot)
|
|
305
302
|
*/
|
|
306
|
-
async function waitForCheckpointState(cpHex: CheckpointHexPayload): Promise<
|
|
303
|
+
async function waitForCheckpointState(cpHex: CheckpointHexPayload): Promise<IBeaconStateView | null> {
|
|
307
304
|
const cpState = chain.regen.getCheckpointStateSync(cpHex);
|
|
308
305
|
if (cpState) {
|
|
309
306
|
return cpState;
|
|
@@ -995,7 +992,7 @@ export function getValidatorApi(
|
|
|
995
992
|
headBlockRoot
|
|
996
993
|
: // Permit attesting to slots *prior* to the current head. This is desirable when
|
|
997
994
|
// the VC and BN are out-of-sync due to time issues or overloading.
|
|
998
|
-
getBlockRootAtSlot(
|
|
995
|
+
headState.getBlockRootAtSlot(slot);
|
|
999
996
|
|
|
1000
997
|
let index: CommitteeIndex;
|
|
1001
998
|
if (isForkPostGloas(fork)) {
|
|
@@ -1026,7 +1023,7 @@ export function getValidatorApi(
|
|
|
1026
1023
|
targetSlot >= headSlot
|
|
1027
1024
|
? // If the state is earlier than the target slot then the target *must* be the head block root.
|
|
1028
1025
|
headBlockRoot
|
|
1029
|
-
: getBlockRootAtSlot(
|
|
1026
|
+
: headState.getBlockRootAtSlot(targetSlot);
|
|
1030
1027
|
|
|
1031
1028
|
// Check the execution status as validator shouldn't vote on an optimistic head
|
|
1032
1029
|
// Check on target is sufficient as a valid target would imply a valid source
|
|
@@ -1068,7 +1065,7 @@ export function getValidatorApi(
|
|
|
1068
1065
|
// see https://github.com/ChainSafe/lodestar/issues/5063
|
|
1069
1066
|
if (!chain.forkChoice.hasBlock(beaconBlockRoot)) {
|
|
1070
1067
|
const rootHex = toRootHex(beaconBlockRoot);
|
|
1071
|
-
network.
|
|
1068
|
+
network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.api);
|
|
1072
1069
|
// if result of this call is false, i.e. block hasn't seen after 1 slot then the below notOnOptimisticBlockRoot call will throw error
|
|
1073
1070
|
await chain.waitForBlock(slot, rootHex);
|
|
1074
1071
|
}
|
|
@@ -1103,7 +1100,7 @@ export function getValidatorApi(
|
|
|
1103
1100
|
}
|
|
1104
1101
|
|
|
1105
1102
|
const head = chain.forkChoice.getHead();
|
|
1106
|
-
let state:
|
|
1103
|
+
let state: IBeaconStateView | undefined = undefined;
|
|
1107
1104
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
1108
1105
|
const prepareNextSlotLookAheadMs =
|
|
1109
1106
|
config.SLOT_DURATION_MS - config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS);
|
|
@@ -1133,43 +1130,34 @@ export function getValidatorApi(
|
|
|
1133
1130
|
} else {
|
|
1134
1131
|
const res = await getStateResponseWithRegen(chain, startSlot);
|
|
1135
1132
|
|
|
1136
|
-
|
|
1137
|
-
res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state;
|
|
1133
|
+
state = res.state instanceof Uint8Array ? chain.getHeadState().loadOtherState(res.state) : res.state;
|
|
1138
1134
|
|
|
1139
|
-
state
|
|
1140
|
-
|
|
1141
|
-
{
|
|
1142
|
-
config: chain.config,
|
|
1143
|
-
// Not required to compute proposers
|
|
1144
|
-
pubkeyCache: createPubkeyCache(),
|
|
1145
|
-
},
|
|
1146
|
-
{skipSyncPubkeys: true, skipSyncCommitteeCache: true}
|
|
1147
|
-
);
|
|
1148
|
-
|
|
1149
|
-
if (state.epochCtx.epoch !== epoch) {
|
|
1150
|
-
throw Error(`Loaded state epoch ${state.epochCtx.epoch} does not match requested epoch ${epoch}`);
|
|
1135
|
+
if (state.epoch !== epoch) {
|
|
1136
|
+
throw Error(`Loaded state epoch ${state.epoch} does not match requested epoch ${epoch}`);
|
|
1151
1137
|
}
|
|
1152
1138
|
}
|
|
1153
1139
|
}
|
|
1154
1140
|
|
|
1155
|
-
const stateEpoch = state.
|
|
1141
|
+
const stateEpoch = state.epoch;
|
|
1156
1142
|
let indexes: ValidatorIndex[] = [];
|
|
1157
1143
|
|
|
1158
1144
|
switch (epoch) {
|
|
1159
1145
|
case stateEpoch:
|
|
1160
|
-
indexes = state.
|
|
1146
|
+
indexes = state.currentProposers;
|
|
1161
1147
|
break;
|
|
1162
1148
|
|
|
1163
|
-
case stateEpoch + 1:
|
|
1149
|
+
case stateEpoch + 1: {
|
|
1164
1150
|
// make sure shuffling is calculated and ready for next call to calculate nextProposers
|
|
1165
|
-
|
|
1151
|
+
const nextEpoch = state.epoch + 1;
|
|
1152
|
+
await chain.shufflingCache.get(nextEpoch, state.nextDecisionRoot);
|
|
1166
1153
|
// Requesting duties for next epoch is allowed since they can be predicted with high probabilities.
|
|
1167
1154
|
// @see `epochCtx.getBeaconProposersNextEpoch` JSDocs for rationale.
|
|
1168
|
-
indexes = state.
|
|
1155
|
+
indexes = state.nextProposers;
|
|
1169
1156
|
break;
|
|
1157
|
+
}
|
|
1170
1158
|
|
|
1171
1159
|
case stateEpoch - 1: {
|
|
1172
|
-
const indexesPrevEpoch = state.
|
|
1160
|
+
const indexesPrevEpoch = state.previousProposers;
|
|
1173
1161
|
if (indexesPrevEpoch === null) {
|
|
1174
1162
|
// Should not happen as previous proposer duties should be initialized for head state
|
|
1175
1163
|
// and if we load state from `Uint8Array` it will always be the state of requested epoch
|
|
@@ -1188,7 +1176,7 @@ export function getValidatorApi(
|
|
|
1188
1176
|
// See benchmark -> packages/lodestar/test/perf/api/impl/validator/attester.test.ts
|
|
1189
1177
|
// After dropping the flat caches attached to the CachedBeaconState it's no longer available.
|
|
1190
1178
|
// TODO: Add a flag to just send 0x00 as pubkeys since the Lodestar validator does not need them.
|
|
1191
|
-
const pubkeys = getPubkeysForIndices(state
|
|
1179
|
+
const pubkeys = getPubkeysForIndices(state, indexes);
|
|
1192
1180
|
|
|
1193
1181
|
const duties: routes.validator.ProposerDuty[] = [];
|
|
1194
1182
|
for (let i = 0; i < SLOTS_PER_EPOCH; i++) {
|
|
@@ -1242,8 +1230,8 @@ export function getValidatorApi(
|
|
|
1242
1230
|
// will equal `currentEpoch + 1`
|
|
1243
1231
|
|
|
1244
1232
|
// Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
|
|
1245
|
-
const pubkeys = getPubkeysForIndices(state
|
|
1246
|
-
const decisionRoot = state.
|
|
1233
|
+
const pubkeys = getPubkeysForIndices(state, indices);
|
|
1234
|
+
const decisionRoot = state.getShufflingDecisionRoot(epoch);
|
|
1247
1235
|
const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
|
|
1248
1236
|
if (!shuffling) {
|
|
1249
1237
|
throw new ApiError(
|
|
@@ -1264,7 +1252,7 @@ export function getValidatorApi(
|
|
|
1264
1252
|
}
|
|
1265
1253
|
}
|
|
1266
1254
|
|
|
1267
|
-
const dependentRoot =
|
|
1255
|
+
const dependentRoot = fromHex(state.getShufflingDecisionRoot(epoch)) || (await getGenesisBlockRoot(state));
|
|
1268
1256
|
|
|
1269
1257
|
return {
|
|
1270
1258
|
data: duties,
|
|
@@ -1305,9 +1293,9 @@ export function getValidatorApi(
|
|
|
1305
1293
|
const state = chain.getHeadState();
|
|
1306
1294
|
|
|
1307
1295
|
// Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
|
|
1308
|
-
const pubkeys = getPubkeysForIndices(state
|
|
1296
|
+
const pubkeys = getPubkeysForIndices(state, indices);
|
|
1309
1297
|
// Ensures `epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD <= current_epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD + 1`
|
|
1310
|
-
const syncCommitteeCache = state.
|
|
1298
|
+
const syncCommitteeCache = state.getIndexedSyncCommitteeAtEpoch(epoch);
|
|
1311
1299
|
const validatorSyncCommitteeIndexMap = syncCommitteeCache.validatorIndexMap;
|
|
1312
1300
|
|
|
1313
1301
|
const duties: routes.validator.SyncDuty[] = [];
|
|
@@ -1605,7 +1593,7 @@ export function getValidatorApi(
|
|
|
1605
1593
|
const validatorIndex = chain.pubkeyCache.getIndex(pubkey);
|
|
1606
1594
|
if (validatorIndex === null) return false;
|
|
1607
1595
|
|
|
1608
|
-
const validator = headState.
|
|
1596
|
+
const validator = headState.getValidator(validatorIndex);
|
|
1609
1597
|
const status = getValidatorStatus(validator, currentEpoch);
|
|
1610
1598
|
return (
|
|
1611
1599
|
status === "active_exiting" ||
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
2
|
import {ATTESTATION_SUBNET_COUNT} from "@lodestar/params";
|
|
3
|
-
import {
|
|
3
|
+
import {IBeaconStateView, computeSlotsSinceEpochStart} from "@lodestar/state-transition";
|
|
4
4
|
import {BLSPubkey, CommitteeIndex, ProducedBlockSource, Slot, SubnetID, ValidatorIndex} from "@lodestar/types";
|
|
5
5
|
import {MAX_BUILDER_BOOST_FACTOR} from "@lodestar/validator";
|
|
6
6
|
import {BlockSelectionResult, BuilderBlockSelectionReason, EngineBlockSelectionReason} from "./index.js";
|
|
@@ -24,11 +24,8 @@ export function computeSubnetForCommitteesAtSlot(
|
|
|
24
24
|
* Note: This is the fastest way of getting compressed pubkeys.
|
|
25
25
|
* See benchmark -> packages/beacon-node/test/perf/api/impl/validator/attester.test.ts
|
|
26
26
|
*/
|
|
27
|
-
export function getPubkeysForIndices(
|
|
28
|
-
|
|
29
|
-
indexes: ValidatorIndex[]
|
|
30
|
-
): BLSPubkey[] {
|
|
31
|
-
const validatorsLen = validators.length; // Get once, it's expensive
|
|
27
|
+
export function getPubkeysForIndices(state: IBeaconStateView, indexes: ValidatorIndex[]): BLSPubkey[] {
|
|
28
|
+
const validatorsLen = state.validatorCount; // Get once, it's expensive
|
|
32
29
|
|
|
33
30
|
const pubkeys: BLSPubkey[] = [];
|
|
34
31
|
for (let i = 0, len = indexes.length; i < len; i++) {
|
|
@@ -38,7 +35,7 @@ export function getPubkeysForIndices(
|
|
|
38
35
|
}
|
|
39
36
|
|
|
40
37
|
// NOTE: This could be optimized further by traversing the tree optimally with .getNodes()
|
|
41
|
-
const validator =
|
|
38
|
+
const validator = state.getValidator(index);
|
|
42
39
|
pubkeys.push(validator.pubkey);
|
|
43
40
|
}
|
|
44
41
|
|
|
@@ -1,33 +1,16 @@
|
|
|
1
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
2
2
|
import {
|
|
3
|
-
BeaconStateAllForks,
|
|
4
|
-
CachedBeaconStateAllForks,
|
|
5
3
|
DataAvailabilityStatus,
|
|
6
4
|
ExecutionPayloadStatus,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
IBeaconStateView,
|
|
6
|
+
type PubkeyCache,
|
|
7
|
+
createBeaconStateViewForHistoricalRegen,
|
|
10
8
|
} from "@lodestar/state-transition";
|
|
11
9
|
import {byteArrayEquals} from "@lodestar/utils";
|
|
12
10
|
import {IBeaconDb} from "../../../db/index.js";
|
|
13
|
-
import {getStateTypeFromBytes} from "../../../util/multifork.js";
|
|
14
11
|
import {HistoricalStateRegenMetrics} from "./metrics.js";
|
|
15
12
|
import {RegenErrorType} from "./types.js";
|
|
16
13
|
|
|
17
|
-
/**
|
|
18
|
-
* Populate a PubkeyCache with any new entries based on a BeaconState
|
|
19
|
-
*/
|
|
20
|
-
export function syncPubkeyCache(state: BeaconStateAllForks, pubkeyCache: PubkeyCache): void {
|
|
21
|
-
// Get the validators sub tree once for all the loop
|
|
22
|
-
const validators = state.validators;
|
|
23
|
-
|
|
24
|
-
const newCount = state.validators.length;
|
|
25
|
-
for (let i = pubkeyCache.size; i < newCount; i++) {
|
|
26
|
-
const pubkey = validators.getReadonly(i).pubkey;
|
|
27
|
-
pubkeyCache.set(i, pubkey);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
14
|
/**
|
|
32
15
|
* Get the nearest BeaconState at or before a slot
|
|
33
16
|
*/
|
|
@@ -36,26 +19,14 @@ export async function getNearestState(
|
|
|
36
19
|
config: BeaconConfig,
|
|
37
20
|
db: IBeaconDb,
|
|
38
21
|
pubkeyCache: PubkeyCache
|
|
39
|
-
): Promise<
|
|
22
|
+
): Promise<IBeaconStateView> {
|
|
40
23
|
const stateBytesArr = await db.stateArchive.binaries({limit: 1, lte: slot, reverse: true});
|
|
41
24
|
if (!stateBytesArr.length) {
|
|
42
25
|
throw new Error("No near state found in the database");
|
|
43
26
|
}
|
|
44
27
|
|
|
45
28
|
const stateBytes = stateBytesArr[0];
|
|
46
|
-
|
|
47
|
-
syncPubkeyCache(state, pubkeyCache);
|
|
48
|
-
|
|
49
|
-
return createCachedBeaconState(
|
|
50
|
-
state,
|
|
51
|
-
{
|
|
52
|
-
config,
|
|
53
|
-
pubkeyCache,
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
skipSyncPubkeys: true,
|
|
57
|
-
}
|
|
58
|
-
);
|
|
29
|
+
return createBeaconStateViewForHistoricalRegen(config, stateBytes, pubkeyCache);
|
|
59
30
|
}
|
|
60
31
|
|
|
61
32
|
/**
|
|
@@ -81,8 +52,7 @@ export async function getHistoricalState(
|
|
|
81
52
|
let blockCount = 0;
|
|
82
53
|
for await (const block of db.blockArchive.valuesStream({gt: state.slot, lte: slot})) {
|
|
83
54
|
try {
|
|
84
|
-
state = stateTransition(
|
|
85
|
-
state,
|
|
55
|
+
state = state.stateTransition(
|
|
86
56
|
block,
|
|
87
57
|
{
|
|
88
58
|
verifyProposer: false,
|