@lodestar/beacon-node 1.42.0-dev.c35b4283f1 → 1.42.0-dev.c58e92512e
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 +25 -13
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +5 -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 +38 -40
- 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/debug/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.d.ts.map +1 -1
- package/lib/api/impl/lodestar/index.js +8 -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 +33 -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/ColumnReconstructionTracker.d.ts +2 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.js +5 -5
- package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +2 -1
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +14 -12
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -3
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +1 -0
- package/lib/chain/archiveStore/interface.d.ts.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/blockInput.d.ts +5 -5
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +5 -4
- 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 +37 -23
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +10 -8
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +87 -51
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +3 -2
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +14 -6
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +33 -2
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +2 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.d.ts +21 -15
- 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 +5 -5
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -4
- 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 +4 -2
- 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 +15 -14
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +110 -62
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +31 -9
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +12 -3
- package/lib/chain/emitter.js.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/errors/dataColumnSidecarError.d.ts +31 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.js +7 -0
- package/lib/chain/errors/dataColumnSidecarError.js.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 +30 -24
- 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 +15 -14
- 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 +11 -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 +13 -13
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.d.ts +2 -2
- package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.js +2 -2
- package/lib/chain/opPools/executionPayloadBidPool.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/options.d.ts +1 -0
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.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 +10 -4
- 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 +32 -17
- 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/seenCache/seenGossipBlockInput.d.ts +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +2 -2
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.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.d.ts +11 -4
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +185 -6
- 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 +10 -7
- 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 +7 -3
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +5 -3
- 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 +3 -3
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +5 -1
- 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 +5 -2
- 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 +11 -9
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/buckets.d.ts +2 -2
- package/lib/db/buckets.d.ts.map +1 -1
- package/lib/db/buckets.js +2 -2
- package/lib/db/buckets.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.map +1 -1
- package/lib/db/repositories/dataColumnSidecar.js +4 -2
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +4 -2
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +32 -4
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +52 -15
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/interface.d.ts +7 -4
- 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 +22 -11
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +7 -4
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +12 -3
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +7 -2
- package/lib/network/options.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +25 -5
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +261 -74
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/index.d.ts +22 -7
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +313 -80
- 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 +10 -4
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +16 -4
- 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 +3 -3
- 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 +1 -1
- package/lib/sync/unknownBlock.js +3 -3
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +3 -3
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +4 -2
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +3 -3
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +10 -5
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.d.ts +3 -3
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js +21 -10
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +18 -11
- package/lib/util/dataColumns.d.ts.map +1 -1
- package/lib/util/dataColumns.js +51 -17
- package/lib/util/dataColumns.js.map +1 -1
- package/lib/util/execution.d.ts +6 -2
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +49 -25
- package/lib/util/execution.js.map +1 -1
- package/lib/util/sszBytes.d.ts +25 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +189 -2
- package/lib/util/sszBytes.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 +33 -16
- package/src/api/impl/beacon/pool/index.ts +5 -1
- package/src/api/impl/beacon/state/index.ts +43 -55
- package/src/api/impl/beacon/state/utils.ts +11 -25
- package/src/api/impl/debug/index.ts +2 -2
- package/src/api/impl/lodestar/index.ts +8 -8
- package/src/api/impl/proof/index.ts +2 -9
- package/src/api/impl/validator/index.ts +36 -41
- package/src/api/impl/validator/utils.ts +4 -7
- package/src/chain/ColumnReconstructionTracker.ts +6 -5
- package/src/chain/GetBlobsTracker.ts +14 -12
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
- package/src/chain/archiveStore/historicalState/types.ts +2 -0
- package/src/chain/archiveStore/historicalState/worker.ts +1 -4
- package/src/chain/archiveStore/interface.ts +1 -0
- package/src/chain/balancesCache.ts +5 -11
- package/src/chain/blocks/blockInput/blockInput.ts +8 -8
- package/src/chain/blocks/blockInput/types.ts +5 -4
- package/src/chain/blocks/importBlock.ts +50 -31
- package/src/chain/blocks/importExecutionPayload.ts +98 -62
- package/src/chain/blocks/index.ts +3 -2
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +53 -12
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +2 -1
- package/src/chain/blocks/types.ts +26 -15
- package/src/chain/blocks/utils/checkpoint.ts +2 -2
- package/src/chain/blocks/verifyBlock.ts +5 -10
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +10 -14
- package/src/chain/blocks/verifyBlocksSignatures.ts +10 -3
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
- package/src/chain/chain.ts +148 -95
- package/src/chain/emitter.ts +27 -9
- package/src/chain/errors/blockError.ts +4 -4
- package/src/chain/errors/dataColumnSidecarError.ts +32 -1
- package/src/chain/forkChoice/index.ts +35 -41
- package/src/chain/initState.ts +7 -2
- package/src/chain/interface.ts +16 -15
- package/src/chain/lightClient/index.ts +17 -18
- package/src/chain/opPools/aggregatedAttestationPool.ts +20 -21
- package/src/chain/opPools/executionPayloadBidPool.ts +3 -3
- package/src/chain/opPools/opPool.ts +13 -14
- package/src/chain/opPools/utils.ts +3 -3
- package/src/chain/options.ts +2 -0
- package/src/chain/prepareNextSlot.ts +14 -8
- package/src/chain/produceBlock/computeNewStateRoot.ts +7 -10
- package/src/chain/produceBlock/produceBlockBody.ts +49 -46
- 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/seenCache/seenGossipBlockInput.ts +2 -2
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +2 -2
- 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 +3 -4
- package/src/chain/validation/blsToExecutionChange.ts +2 -2
- package/src/chain/validation/dataColumnSidecar.ts +231 -8
- package/src/chain/validation/executionPayloadBid.ts +10 -10
- package/src/chain/validation/executionPayloadEnvelope.ts +7 -4
- package/src/chain/validation/payloadAttestationMessage.ts +6 -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 +10 -6
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +9 -10
- package/src/chain/validation/voluntaryExit.ts +3 -8
- package/src/chain/validatorMonitor.ts +15 -13
- package/src/db/buckets.ts +2 -2
- package/src/db/repositories/dataColumnSidecar.ts +4 -2
- package/src/db/repositories/dataColumnSidecarArchive.ts +4 -2
- package/src/metrics/metrics/lodestar.ts +57 -19
- package/src/network/interface.ts +18 -4
- package/src/network/libp2p/index.ts +24 -13
- package/src/network/network.ts +39 -8
- package/src/network/options.ts +7 -2
- package/src/network/processor/extractSlotRootFns.ts +32 -6
- package/src/network/processor/gossipHandlers.ts +326 -87
- package/src/network/processor/index.ts +395 -92
- 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 +26 -5
- package/src/node/nodejs.ts +6 -5
- package/src/node/notifier.ts +5 -6
- package/src/sync/backfill/backfill.ts +3 -3
- package/src/sync/unknownBlock.ts +4 -4
- package/src/sync/utils/downloadByRange.ts +9 -7
- package/src/sync/utils/downloadByRoot.ts +16 -12
- package/src/util/blobs.ts +35 -15
- package/src/util/dataColumns.ts +69 -25
- package/src/util/execution.ts +49 -30
- package/src/util/sszBytes.ts +245 -3
- package/src/util/types.ts +6 -0
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
2
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
3
|
+
import {EPOCHS_PER_HISTORICAL_VECTOR, SLOTS_PER_EPOCH, SYNC_COMMITTEE_SUBNET_SIZE} from "@lodestar/params";
|
|
3
4
|
import {
|
|
4
|
-
|
|
5
|
-
SLOTS_PER_EPOCH,
|
|
6
|
-
SYNC_COMMITTEE_SUBNET_SIZE,
|
|
7
|
-
isForkPostElectra,
|
|
8
|
-
isForkPostFulu,
|
|
9
|
-
} from "@lodestar/params";
|
|
10
|
-
import {
|
|
11
|
-
BeaconStateAllForks,
|
|
12
|
-
BeaconStateElectra,
|
|
13
|
-
BeaconStateFulu,
|
|
14
|
-
CachedBeaconStateAltair,
|
|
5
|
+
IBeaconStateView,
|
|
15
6
|
computeEpochAtSlot,
|
|
16
7
|
computeStartSlotAtEpoch,
|
|
17
8
|
getCurrentEpoch,
|
|
18
|
-
|
|
19
|
-
|
|
9
|
+
isStatePostAltair,
|
|
10
|
+
isStatePostElectra,
|
|
11
|
+
isStatePostFulu,
|
|
20
12
|
} from "@lodestar/state-transition";
|
|
21
|
-
import {ValidatorIndex, getValidatorStatus} from "@lodestar/types";
|
|
13
|
+
import {ValidatorIndex, getValidatorStatus, ssz} from "@lodestar/types";
|
|
22
14
|
import {ApiError} from "../../errors.js";
|
|
23
15
|
import {ApiModules} from "../../types.js";
|
|
24
16
|
import {assertUniqueItems} from "../../utils.js";
|
|
@@ -35,11 +27,11 @@ export function getBeaconStateApi({
|
|
|
35
27
|
}: Pick<ApiModules, "chain" | "config">): ApplicationMethods<routes.beacon.state.Endpoints> {
|
|
36
28
|
async function getState(
|
|
37
29
|
stateId: routes.beacon.StateId
|
|
38
|
-
): Promise<{state:
|
|
30
|
+
): Promise<{state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean}> {
|
|
39
31
|
const {state, executionOptimistic, finalized} = await getStateResponseWithRegen(chain, stateId);
|
|
40
32
|
|
|
41
33
|
return {
|
|
42
|
-
state: state instanceof Uint8Array ?
|
|
34
|
+
state: state instanceof Uint8Array ? chain.getHeadState().loadOtherState(state) : state,
|
|
43
35
|
executionOptimistic,
|
|
44
36
|
finalized,
|
|
45
37
|
};
|
|
@@ -71,7 +63,7 @@ export function getBeaconStateApi({
|
|
|
71
63
|
throw new ApiError(400, "Requested epoch is out of range");
|
|
72
64
|
}
|
|
73
65
|
|
|
74
|
-
const randao = getRandaoMix(
|
|
66
|
+
const randao = state.getRandaoMix(usedEpoch);
|
|
75
67
|
|
|
76
68
|
return {
|
|
77
69
|
data: {randao},
|
|
@@ -94,7 +86,6 @@ export function getBeaconStateApi({
|
|
|
94
86
|
async getStateValidators({stateId, validatorIds = [], statuses = []}) {
|
|
95
87
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
96
88
|
const currentEpoch = getCurrentEpoch(state);
|
|
97
|
-
const {validators, balances} = state; // Get the validators sub tree once for all the loop
|
|
98
89
|
const {pubkeyCache} = chain;
|
|
99
90
|
|
|
100
91
|
const validatorResponses: routes.beacon.ValidatorResponse[] = [];
|
|
@@ -105,14 +96,14 @@ export function getBeaconStateApi({
|
|
|
105
96
|
const resp = getStateValidatorIndex(id, state, pubkeyCache);
|
|
106
97
|
if (resp.valid) {
|
|
107
98
|
const validatorIndex = resp.validatorIndex;
|
|
108
|
-
const validator =
|
|
99
|
+
const validator = state.getValidator(validatorIndex);
|
|
109
100
|
if (statuses.length && !statuses.includes(getValidatorStatus(validator, currentEpoch))) {
|
|
110
101
|
continue;
|
|
111
102
|
}
|
|
112
103
|
const validatorResponse = toValidatorResponse(
|
|
113
104
|
validatorIndex,
|
|
114
105
|
validator,
|
|
115
|
-
|
|
106
|
+
state.getBalance(validatorIndex),
|
|
116
107
|
currentEpoch
|
|
117
108
|
);
|
|
118
109
|
validatorResponses.push(validatorResponse);
|
|
@@ -135,8 +126,8 @@ export function getBeaconStateApi({
|
|
|
135
126
|
}
|
|
136
127
|
|
|
137
128
|
// TODO: This loops over the entire state, it's a DOS vector
|
|
138
|
-
const validatorsArr = state.
|
|
139
|
-
const balancesArr = state.
|
|
129
|
+
const validatorsArr = state.getAllValidators();
|
|
130
|
+
const balancesArr = state.getAllBalances();
|
|
140
131
|
const resp: routes.beacon.ValidatorResponse[] = [];
|
|
141
132
|
for (let i = 0; i < validatorsArr.length; i++) {
|
|
142
133
|
resp.push(toValidatorResponse(i, validatorsArr[i], balancesArr[i], currentEpoch));
|
|
@@ -166,12 +157,12 @@ export function getBeaconStateApi({
|
|
|
166
157
|
const resp = getStateValidatorIndex(id, state, pubkeyCache);
|
|
167
158
|
if (resp.valid) {
|
|
168
159
|
const index = resp.validatorIndex;
|
|
169
|
-
const {pubkey, activationEpoch} = state.
|
|
160
|
+
const {pubkey, activationEpoch} = state.getValidator(index);
|
|
170
161
|
validatorIdentities.push({index, pubkey, activationEpoch});
|
|
171
162
|
}
|
|
172
163
|
}
|
|
173
164
|
} else {
|
|
174
|
-
const validatorsArr = state.
|
|
165
|
+
const validatorsArr = state.getAllValidators();
|
|
175
166
|
validatorIdentities = new Array(validatorsArr.length) as routes.beacon.ValidatorIdentities;
|
|
176
167
|
for (let i = 0; i < validatorsArr.length; i++) {
|
|
177
168
|
const {pubkey, activationEpoch} = validatorsArr[i];
|
|
@@ -198,8 +189,8 @@ export function getBeaconStateApi({
|
|
|
198
189
|
return {
|
|
199
190
|
data: toValidatorResponse(
|
|
200
191
|
validatorIndex,
|
|
201
|
-
state.
|
|
202
|
-
state.
|
|
192
|
+
state.getValidator(validatorIndex),
|
|
193
|
+
state.getBalance(validatorIndex),
|
|
203
194
|
getCurrentEpoch(state)
|
|
204
195
|
),
|
|
205
196
|
meta: {executionOptimistic, finalized},
|
|
@@ -219,7 +210,7 @@ export function getBeaconStateApi({
|
|
|
219
210
|
if (resp.valid) {
|
|
220
211
|
balances.push({
|
|
221
212
|
index: resp.validatorIndex,
|
|
222
|
-
balance: state.
|
|
213
|
+
balance: state.getBalance(resp.validatorIndex),
|
|
223
214
|
});
|
|
224
215
|
}
|
|
225
216
|
}
|
|
@@ -230,7 +221,7 @@ export function getBeaconStateApi({
|
|
|
230
221
|
}
|
|
231
222
|
|
|
232
223
|
// TODO: This loops over the entire state, it's a DOS vector
|
|
233
|
-
const balancesArr = state.
|
|
224
|
+
const balancesArr = state.getAllBalances();
|
|
234
225
|
const resp: routes.beacon.ValidatorBalance[] = [];
|
|
235
226
|
for (let i = 0; i < balancesArr.length; i++) {
|
|
236
227
|
resp.push({index: i, balance: balancesArr[i]});
|
|
@@ -248,11 +239,6 @@ export function getBeaconStateApi({
|
|
|
248
239
|
async getEpochCommittees({stateId, ...filters}) {
|
|
249
240
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
250
241
|
|
|
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
242
|
const stateEpoch = computeEpochAtSlot(state.slot);
|
|
257
243
|
const epoch = filters.epoch ?? stateEpoch;
|
|
258
244
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
@@ -266,7 +252,7 @@ export function getBeaconStateApi({
|
|
|
266
252
|
throw new ApiError(400, `Slot ${filters.slot} is not in epoch ${epoch}`);
|
|
267
253
|
}
|
|
268
254
|
|
|
269
|
-
const decisionRoot =
|
|
255
|
+
const decisionRoot = state.getShufflingDecisionRoot(epoch);
|
|
270
256
|
const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
|
|
271
257
|
if (!shuffling) {
|
|
272
258
|
throw new ApiError(
|
|
@@ -314,13 +300,11 @@ export function getBeaconStateApi({
|
|
|
314
300
|
if (stateEpoch < config.ALTAIR_FORK_EPOCH) {
|
|
315
301
|
throw new ApiError(400, "Requested state before ALTAIR_FORK_EPOCH");
|
|
316
302
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
if (stateCached.epochCtx === undefined) {
|
|
320
|
-
throw new ApiError(400, `No cached state available for stateId: ${stateId}`);
|
|
303
|
+
if (!isStatePostAltair(state)) {
|
|
304
|
+
throw new Error("Expected Altair state for sync committee lookup");
|
|
321
305
|
}
|
|
322
306
|
|
|
323
|
-
const syncCommitteeCache =
|
|
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
|
|
@@ -340,64 +324,68 @@ export function getBeaconStateApi({
|
|
|
340
324
|
|
|
341
325
|
async getPendingDeposits({stateId}, context) {
|
|
342
326
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
343
|
-
const fork =
|
|
327
|
+
const fork = state.forkName;
|
|
344
328
|
|
|
345
|
-
if (!
|
|
329
|
+
if (!isStatePostElectra(state)) {
|
|
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
|
},
|
|
356
340
|
|
|
357
341
|
async getPendingPartialWithdrawals({stateId}, context) {
|
|
358
342
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
359
|
-
const fork =
|
|
343
|
+
const fork = state.forkName;
|
|
360
344
|
|
|
361
|
-
if (!
|
|
345
|
+
if (!isStatePostElectra(state)) {
|
|
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
|
},
|
|
372
358
|
|
|
373
359
|
async getPendingConsolidations({stateId}, context) {
|
|
374
360
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
375
|
-
const fork =
|
|
361
|
+
const fork = state.forkName;
|
|
376
362
|
|
|
377
|
-
if (!
|
|
363
|
+
if (!isStatePostElectra(state)) {
|
|
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
|
},
|
|
388
376
|
|
|
389
377
|
async getProposerLookahead({stateId}, context) {
|
|
390
378
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
391
|
-
const fork =
|
|
379
|
+
const fork = state.forkName;
|
|
392
380
|
|
|
393
|
-
if (!
|
|
381
|
+
if (!isStatePostFulu(state)) {
|
|
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};
|
|
@@ -2,7 +2,7 @@ import {routes} from "@lodestar/api";
|
|
|
2
2
|
import {ApplicationMethods} from "@lodestar/api/server";
|
|
3
3
|
import {ExecutionStatus} from "@lodestar/fork-choice";
|
|
4
4
|
import {ForkPostDeneb, ZERO_HASH_HEX, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
|
|
5
|
-
import {BeaconState, DataColumnSidecars, type SignedBeaconBlock, sszTypesFor} from "@lodestar/types";
|
|
5
|
+
import {BeaconState, DataColumnSidecar, DataColumnSidecars, type SignedBeaconBlock, sszTypesFor} from "@lodestar/types";
|
|
6
6
|
import {toRootHex} from "@lodestar/utils";
|
|
7
7
|
import {getBlobKzgCommitments} from "../../../util/dataColumns.js";
|
|
8
8
|
import {isOptimisticBlock} from "../../../util/forkChoice.js";
|
|
@@ -98,7 +98,7 @@ export function getDebugApi({
|
|
|
98
98
|
const fork = config.getForkName(block.message.slot);
|
|
99
99
|
const blockRoot = sszTypesFor(fork).BeaconBlock.hashTreeRoot(block.message);
|
|
100
100
|
|
|
101
|
-
let dataColumnSidecars:
|
|
101
|
+
let dataColumnSidecars: DataColumnSidecar[];
|
|
102
102
|
|
|
103
103
|
const blobCount = isForkPostDeneb(fork)
|
|
104
104
|
? getBlobKzgCommitments(fork, block as SignedBeaconBlock<ForkPostDeneb>).length
|
|
@@ -1,10 +1,9 @@
|
|
|
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 {
|
|
6
|
+
import {isStatePostCapella} from "@lodestar/state-transition";
|
|
8
7
|
import {ssz} from "@lodestar/types";
|
|
9
8
|
import {Checkpoint} from "@lodestar/types/phase0";
|
|
10
9
|
import {fromHex, toHex, toRootHex} from "@lodestar/utils";
|
|
@@ -86,7 +85,7 @@ export function getLodestarApi({
|
|
|
86
85
|
|
|
87
86
|
async getLatestWeakSubjectivityCheckpointEpoch() {
|
|
88
87
|
const state = chain.getHeadState();
|
|
89
|
-
return {data: getLatestWeakSubjectivityCheckpointEpoch(
|
|
88
|
+
return {data: state.getLatestWeakSubjectivityCheckpointEpoch()};
|
|
90
89
|
},
|
|
91
90
|
|
|
92
91
|
async getSyncChainsDebugState() {
|
|
@@ -214,22 +213,23 @@ export function getLodestarApi({
|
|
|
214
213
|
async getHistoricalSummaries({stateId}) {
|
|
215
214
|
const {state, executionOptimistic, finalized} = await getStateResponseWithRegen(chain, stateId);
|
|
216
215
|
|
|
217
|
-
const stateView = (
|
|
218
|
-
state instanceof Uint8Array ? loadState(config, chain.getHeadState(), state).state : state
|
|
219
|
-
) as BeaconStateCapella;
|
|
216
|
+
const stateView = state instanceof Uint8Array ? chain.getHeadState().loadOtherState(state) : state;
|
|
220
217
|
|
|
221
218
|
const fork = config.getForkName(stateView.slot);
|
|
222
219
|
if (ForkSeq[fork] < ForkSeq.capella) {
|
|
223
220
|
throw new Error("Historical summaries are not supported before Capella");
|
|
224
221
|
}
|
|
222
|
+
if (!isStatePostCapella(stateView)) {
|
|
223
|
+
throw new Error("Expected Capella state for historical summaries");
|
|
224
|
+
}
|
|
225
225
|
|
|
226
226
|
const {gindex} = ssz[fork].BeaconState.getPathInfo(["historicalSummaries"]);
|
|
227
|
-
const proof =
|
|
227
|
+
const proof = stateView.getSingleProof(gindex);
|
|
228
228
|
|
|
229
229
|
return {
|
|
230
230
|
data: {
|
|
231
231
|
slot: stateView.slot,
|
|
232
|
-
historicalSummaries: stateView.historicalSummaries
|
|
232
|
+
historicalSummaries: stateView.historicalSummaries,
|
|
233
233
|
proof: proof,
|
|
234
234
|
},
|
|
235
235
|
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,15 @@ 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
|
-
|
|
28
|
+
isStatePostAltair,
|
|
33
29
|
proposerShufflingDecisionRoot,
|
|
34
30
|
} from "@lodestar/state-transition";
|
|
35
31
|
import {
|
|
@@ -193,11 +189,13 @@ export function getValidatorApi(
|
|
|
193
189
|
const MAX_API_CLOCK_DISPARITY_MS = MAX_API_CLOCK_DISPARITY_SEC * 1000;
|
|
194
190
|
|
|
195
191
|
/** Compute and cache the genesis block root */
|
|
196
|
-
async function getGenesisBlockRoot(state:
|
|
192
|
+
async function getGenesisBlockRoot(state: IBeaconStateView): Promise<Root> {
|
|
197
193
|
if (!genesisBlockRoot) {
|
|
198
194
|
// Close to genesis the genesis block may not be available in the DB
|
|
199
|
-
if (state.slot
|
|
200
|
-
genesisBlockRoot = state.
|
|
195
|
+
if (state.slot === GENESIS_SLOT) {
|
|
196
|
+
genesisBlockRoot = state.computeAnchorCheckpoint().checkpoint.root;
|
|
197
|
+
} else if (state.slot < SLOTS_PER_HISTORICAL_ROOT) {
|
|
198
|
+
genesisBlockRoot = state.getBlockRootAtSlot(GENESIS_SLOT);
|
|
201
199
|
}
|
|
202
200
|
|
|
203
201
|
const blockRes = await chain.getCanonicalBlockAtSlot(GENESIS_SLOT);
|
|
@@ -303,7 +301,7 @@ export function getValidatorApi(
|
|
|
303
301
|
* |
|
|
304
302
|
* prepareNextSlot (4s before next slot)
|
|
305
303
|
*/
|
|
306
|
-
async function waitForCheckpointState(cpHex: CheckpointHexPayload): Promise<
|
|
304
|
+
async function waitForCheckpointState(cpHex: CheckpointHexPayload): Promise<IBeaconStateView | null> {
|
|
307
305
|
const cpState = chain.regen.getCheckpointStateSync(cpHex);
|
|
308
306
|
if (cpState) {
|
|
309
307
|
return cpState;
|
|
@@ -995,7 +993,7 @@ export function getValidatorApi(
|
|
|
995
993
|
headBlockRoot
|
|
996
994
|
: // Permit attesting to slots *prior* to the current head. This is desirable when
|
|
997
995
|
// the VC and BN are out-of-sync due to time issues or overloading.
|
|
998
|
-
getBlockRootAtSlot(
|
|
996
|
+
headState.getBlockRootAtSlot(slot);
|
|
999
997
|
|
|
1000
998
|
let index: CommitteeIndex;
|
|
1001
999
|
if (isForkPostGloas(fork)) {
|
|
@@ -1026,7 +1024,7 @@ export function getValidatorApi(
|
|
|
1026
1024
|
targetSlot >= headSlot
|
|
1027
1025
|
? // If the state is earlier than the target slot then the target *must* be the head block root.
|
|
1028
1026
|
headBlockRoot
|
|
1029
|
-
: getBlockRootAtSlot(
|
|
1027
|
+
: headState.getBlockRootAtSlot(targetSlot);
|
|
1030
1028
|
|
|
1031
1029
|
// Check the execution status as validator shouldn't vote on an optimistic head
|
|
1032
1030
|
// Check on target is sufficient as a valid target would imply a valid source
|
|
@@ -1068,7 +1066,7 @@ export function getValidatorApi(
|
|
|
1068
1066
|
// see https://github.com/ChainSafe/lodestar/issues/5063
|
|
1069
1067
|
if (!chain.forkChoice.hasBlock(beaconBlockRoot)) {
|
|
1070
1068
|
const rootHex = toRootHex(beaconBlockRoot);
|
|
1071
|
-
network.
|
|
1069
|
+
network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.api);
|
|
1072
1070
|
// 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
1071
|
await chain.waitForBlock(slot, rootHex);
|
|
1074
1072
|
}
|
|
@@ -1103,7 +1101,7 @@ export function getValidatorApi(
|
|
|
1103
1101
|
}
|
|
1104
1102
|
|
|
1105
1103
|
const head = chain.forkChoice.getHead();
|
|
1106
|
-
let state:
|
|
1104
|
+
let state: IBeaconStateView | undefined = undefined;
|
|
1107
1105
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
1108
1106
|
const prepareNextSlotLookAheadMs =
|
|
1109
1107
|
config.SLOT_DURATION_MS - config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS);
|
|
@@ -1133,43 +1131,34 @@ export function getValidatorApi(
|
|
|
1133
1131
|
} else {
|
|
1134
1132
|
const res = await getStateResponseWithRegen(chain, startSlot);
|
|
1135
1133
|
|
|
1136
|
-
|
|
1137
|
-
res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state;
|
|
1134
|
+
state = res.state instanceof Uint8Array ? chain.getHeadState().loadOtherState(res.state) : res.state;
|
|
1138
1135
|
|
|
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}`);
|
|
1136
|
+
if (state.epoch !== epoch) {
|
|
1137
|
+
throw Error(`Loaded state epoch ${state.epoch} does not match requested epoch ${epoch}`);
|
|
1151
1138
|
}
|
|
1152
1139
|
}
|
|
1153
1140
|
}
|
|
1154
1141
|
|
|
1155
|
-
const stateEpoch = state.
|
|
1142
|
+
const stateEpoch = state.epoch;
|
|
1156
1143
|
let indexes: ValidatorIndex[] = [];
|
|
1157
1144
|
|
|
1158
1145
|
switch (epoch) {
|
|
1159
1146
|
case stateEpoch:
|
|
1160
|
-
indexes = state.
|
|
1147
|
+
indexes = state.currentProposers;
|
|
1161
1148
|
break;
|
|
1162
1149
|
|
|
1163
|
-
case stateEpoch + 1:
|
|
1150
|
+
case stateEpoch + 1: {
|
|
1164
1151
|
// make sure shuffling is calculated and ready for next call to calculate nextProposers
|
|
1165
|
-
|
|
1152
|
+
const nextEpoch = state.epoch + 1;
|
|
1153
|
+
await chain.shufflingCache.get(nextEpoch, state.nextDecisionRoot);
|
|
1166
1154
|
// Requesting duties for next epoch is allowed since they can be predicted with high probabilities.
|
|
1167
1155
|
// @see `epochCtx.getBeaconProposersNextEpoch` JSDocs for rationale.
|
|
1168
|
-
indexes = state.
|
|
1156
|
+
indexes = state.nextProposers;
|
|
1169
1157
|
break;
|
|
1158
|
+
}
|
|
1170
1159
|
|
|
1171
1160
|
case stateEpoch - 1: {
|
|
1172
|
-
const indexesPrevEpoch = state.
|
|
1161
|
+
const indexesPrevEpoch = state.previousProposers;
|
|
1173
1162
|
if (indexesPrevEpoch === null) {
|
|
1174
1163
|
// Should not happen as previous proposer duties should be initialized for head state
|
|
1175
1164
|
// and if we load state from `Uint8Array` it will always be the state of requested epoch
|
|
@@ -1188,7 +1177,7 @@ export function getValidatorApi(
|
|
|
1188
1177
|
// See benchmark -> packages/lodestar/test/perf/api/impl/validator/attester.test.ts
|
|
1189
1178
|
// After dropping the flat caches attached to the CachedBeaconState it's no longer available.
|
|
1190
1179
|
// TODO: Add a flag to just send 0x00 as pubkeys since the Lodestar validator does not need them.
|
|
1191
|
-
const pubkeys = getPubkeysForIndices(state
|
|
1180
|
+
const pubkeys = getPubkeysForIndices(state, indexes);
|
|
1192
1181
|
|
|
1193
1182
|
const duties: routes.validator.ProposerDuty[] = [];
|
|
1194
1183
|
for (let i = 0; i < SLOTS_PER_EPOCH; i++) {
|
|
@@ -1242,8 +1231,8 @@ export function getValidatorApi(
|
|
|
1242
1231
|
// will equal `currentEpoch + 1`
|
|
1243
1232
|
|
|
1244
1233
|
// Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
|
|
1245
|
-
const pubkeys = getPubkeysForIndices(state
|
|
1246
|
-
const decisionRoot = state.
|
|
1234
|
+
const pubkeys = getPubkeysForIndices(state, indices);
|
|
1235
|
+
const decisionRoot = state.getShufflingDecisionRoot(epoch);
|
|
1247
1236
|
const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
|
|
1248
1237
|
if (!shuffling) {
|
|
1249
1238
|
throw new ApiError(
|
|
@@ -1264,7 +1253,7 @@ export function getValidatorApi(
|
|
|
1264
1253
|
}
|
|
1265
1254
|
}
|
|
1266
1255
|
|
|
1267
|
-
const dependentRoot =
|
|
1256
|
+
const dependentRoot = fromHex(state.getShufflingDecisionRoot(epoch)) || (await getGenesisBlockRoot(state));
|
|
1268
1257
|
|
|
1269
1258
|
return {
|
|
1270
1259
|
data: duties,
|
|
@@ -1294,6 +1283,9 @@ export function getValidatorApi(
|
|
|
1294
1283
|
if (indices.length === 0) {
|
|
1295
1284
|
throw new ApiError(400, "No validator to get attester duties");
|
|
1296
1285
|
}
|
|
1286
|
+
if (epoch < config.ALTAIR_FORK_EPOCH) {
|
|
1287
|
+
throw new ApiError(400, "Sync committee duties are not supported before Altair");
|
|
1288
|
+
}
|
|
1297
1289
|
|
|
1298
1290
|
// May request for an epoch that's in the future
|
|
1299
1291
|
await waitForNextClosestEpoch();
|
|
@@ -1303,11 +1295,14 @@ export function getValidatorApi(
|
|
|
1303
1295
|
// Note: does not support requesting past duties
|
|
1304
1296
|
const head = chain.forkChoice.getHead();
|
|
1305
1297
|
const state = chain.getHeadState();
|
|
1298
|
+
if (!isStatePostAltair(state)) {
|
|
1299
|
+
throw new ApiError(400, "Sync committee duties are not available before Altair");
|
|
1300
|
+
}
|
|
1306
1301
|
|
|
1307
1302
|
// Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
|
|
1308
|
-
const pubkeys = getPubkeysForIndices(state
|
|
1303
|
+
const pubkeys = getPubkeysForIndices(state, indices);
|
|
1309
1304
|
// Ensures `epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD <= current_epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD + 1`
|
|
1310
|
-
const syncCommitteeCache = state.
|
|
1305
|
+
const syncCommitteeCache = state.getIndexedSyncCommitteeAtEpoch(epoch);
|
|
1311
1306
|
const validatorSyncCommitteeIndexMap = syncCommitteeCache.validatorIndexMap;
|
|
1312
1307
|
|
|
1313
1308
|
const duties: routes.validator.SyncDuty[] = [];
|
|
@@ -1605,7 +1600,7 @@ export function getValidatorApi(
|
|
|
1605
1600
|
const validatorIndex = chain.pubkeyCache.getIndex(pubkey);
|
|
1606
1601
|
if (validatorIndex === null) return false;
|
|
1607
1602
|
|
|
1608
|
-
const validator = headState.
|
|
1603
|
+
const validator = headState.getValidator(validatorIndex);
|
|
1609
1604
|
const status = getValidatorStatus(validator, currentEpoch);
|
|
1610
1605
|
return (
|
|
1611
1606
|
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
|
|