@lodestar/beacon-node 1.42.0-dev.7552832620 → 1.42.0-dev.78c54f483b
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/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/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 +21 -21
- 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 +25 -17
- 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/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 +4 -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 +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/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 +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 +727 -0
- 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/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/types.ts +1 -0
- package/src/chain/blocks/importBlock.ts +23 -25
- package/src/chain/blocks/importExecutionPayload.ts +29 -23
- package/src/chain/blocks/index.ts +3 -2
- 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 +9 -14
- 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/options.ts +2 -0
- 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
|
@@ -1,33 +1,15 @@
|
|
|
1
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
2
2
|
import {
|
|
3
|
-
BeaconStateAllForks,
|
|
4
|
-
CachedBeaconStateAllForks,
|
|
5
3
|
DataAvailabilityStatus,
|
|
6
4
|
ExecutionPayloadStatus,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
stateTransition,
|
|
5
|
+
IBeaconStateView,
|
|
6
|
+
createBeaconStateViewForHistoricalRegen,
|
|
10
7
|
} from "@lodestar/state-transition";
|
|
11
8
|
import {byteArrayEquals} from "@lodestar/utils";
|
|
12
9
|
import {IBeaconDb} from "../../../db/index.js";
|
|
13
|
-
import {getStateTypeFromBytes} from "../../../util/multifork.js";
|
|
14
10
|
import {HistoricalStateRegenMetrics} from "./metrics.js";
|
|
15
11
|
import {RegenErrorType} from "./types.js";
|
|
16
12
|
|
|
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
13
|
/**
|
|
32
14
|
* Get the nearest BeaconState at or before a slot
|
|
33
15
|
*/
|
|
@@ -35,27 +17,17 @@ export async function getNearestState(
|
|
|
35
17
|
slot: number,
|
|
36
18
|
config: BeaconConfig,
|
|
37
19
|
db: IBeaconDb,
|
|
38
|
-
|
|
39
|
-
): Promise<
|
|
20
|
+
nativeStateView: boolean
|
|
21
|
+
): Promise<IBeaconStateView> {
|
|
40
22
|
const stateBytesArr = await db.stateArchive.binaries({limit: 1, lte: slot, reverse: true});
|
|
41
23
|
if (!stateBytesArr.length) {
|
|
42
24
|
throw new Error("No near state found in the database");
|
|
43
25
|
}
|
|
44
26
|
|
|
45
27
|
const stateBytes = stateBytesArr[0];
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return createCachedBeaconState(
|
|
50
|
-
state,
|
|
51
|
-
{
|
|
52
|
-
config,
|
|
53
|
-
pubkeyCache,
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
skipSyncPubkeys: true,
|
|
57
|
-
}
|
|
58
|
-
);
|
|
28
|
+
return nativeStateView
|
|
29
|
+
? createBeaconStateViewForHistoricalRegen({useNative: true, stateBytes})
|
|
30
|
+
: createBeaconStateViewForHistoricalRegen({useNative: false, config, stateBytes});
|
|
59
31
|
}
|
|
60
32
|
|
|
61
33
|
/**
|
|
@@ -65,13 +37,13 @@ export async function getHistoricalState(
|
|
|
65
37
|
slot: number,
|
|
66
38
|
config: BeaconConfig,
|
|
67
39
|
db: IBeaconDb,
|
|
68
|
-
|
|
40
|
+
nativeStateView: boolean,
|
|
69
41
|
metrics?: HistoricalStateRegenMetrics
|
|
70
42
|
): Promise<Uint8Array> {
|
|
71
43
|
const regenTimer = metrics?.regenTime.startTimer();
|
|
72
44
|
|
|
73
45
|
const loadStateTimer = metrics?.loadStateTime.startTimer();
|
|
74
|
-
let state = await getNearestState(slot, config, db,
|
|
46
|
+
let state = await getNearestState(slot, config, db, nativeStateView).catch((e) => {
|
|
75
47
|
metrics?.regenErrorCount.inc({reason: RegenErrorType.loadState});
|
|
76
48
|
throw e;
|
|
77
49
|
});
|
|
@@ -81,8 +53,7 @@ export async function getHistoricalState(
|
|
|
81
53
|
let blockCount = 0;
|
|
82
54
|
for await (const block of db.blockArchive.valuesStream({gt: state.slot, lte: slot})) {
|
|
83
55
|
try {
|
|
84
|
-
state = stateTransition(
|
|
85
|
-
state,
|
|
56
|
+
state = state.stateTransition(
|
|
86
57
|
block,
|
|
87
58
|
{
|
|
88
59
|
verifyProposer: false,
|
|
@@ -20,7 +20,7 @@ export class HistoricalStateRegen implements HistoricalStateWorkerApi {
|
|
|
20
20
|
private readonly api: ModuleThread<HistoricalStateWorkerApi>;
|
|
21
21
|
private readonly logger: LoggerNode;
|
|
22
22
|
|
|
23
|
-
constructor(modules: HistoricalStateRegenModules) {
|
|
23
|
+
private constructor(modules: HistoricalStateRegenModules) {
|
|
24
24
|
this.api = modules.api;
|
|
25
25
|
this.logger = modules.logger;
|
|
26
26
|
modules.signal?.addEventListener("abort", () => this.close(), {once: true});
|
|
@@ -35,6 +35,7 @@ export class HistoricalStateRegen implements HistoricalStateWorkerApi {
|
|
|
35
35
|
dbLocation: modules.opts.dbLocation,
|
|
36
36
|
metricsEnabled: Boolean(modules.metrics),
|
|
37
37
|
loggerOpts: modules.logger.toOpts(),
|
|
38
|
+
nativeStateView: modules.opts.nativeStateView,
|
|
38
39
|
};
|
|
39
40
|
|
|
40
41
|
const worker = new Worker(path.join(WORKER_DIR, "worker.js"), {
|
|
@@ -7,6 +7,7 @@ export type HistoricalStateRegenInitModules = {
|
|
|
7
7
|
opts: {
|
|
8
8
|
genesisTime: number;
|
|
9
9
|
dbLocation: string;
|
|
10
|
+
nativeStateView: boolean;
|
|
10
11
|
};
|
|
11
12
|
config: BeaconConfig;
|
|
12
13
|
logger: LoggerNode;
|
|
@@ -26,6 +27,7 @@ export type HistoricalStateWorkerData = {
|
|
|
26
27
|
dbLocation: string;
|
|
27
28
|
metricsEnabled: boolean;
|
|
28
29
|
loggerOpts: LoggerNodeOpts;
|
|
30
|
+
nativeStateView: boolean;
|
|
29
31
|
};
|
|
30
32
|
|
|
31
33
|
export type HistoricalStateWorkerApi = {
|
|
@@ -3,7 +3,6 @@ import {Transfer, expose} from "@chainsafe/threads/worker";
|
|
|
3
3
|
import {chainConfigFromJson, createBeaconConfig} from "@lodestar/config";
|
|
4
4
|
import {LevelDbController} from "@lodestar/db/controller/level";
|
|
5
5
|
import {getNodeLogger} from "@lodestar/logger/node";
|
|
6
|
-
import {createPubkeyCache} from "@lodestar/state-transition";
|
|
7
6
|
import {BeaconDb} from "../../../db/index.js";
|
|
8
7
|
import {RegistryMetricCreator, collectNodeJSMetrics} from "../../../metrics/index.js";
|
|
9
8
|
import {JobFnQueue} from "../../../util/queue/fnQueue.js";
|
|
@@ -52,8 +51,6 @@ const queue = new JobFnQueue(
|
|
|
52
51
|
queueMetrics
|
|
53
52
|
);
|
|
54
53
|
|
|
55
|
-
const pubkeyCache = createPubkeyCache();
|
|
56
|
-
|
|
57
54
|
const api: HistoricalStateWorkerApi = {
|
|
58
55
|
async close() {
|
|
59
56
|
abortController.abort();
|
|
@@ -65,7 +62,7 @@ const api: HistoricalStateWorkerApi = {
|
|
|
65
62
|
historicalStateRegenMetrics?.regenRequestCount.inc();
|
|
66
63
|
|
|
67
64
|
const stateBytes = await queue.push<Uint8Array>(() =>
|
|
68
|
-
getHistoricalState(slot, config, db,
|
|
65
|
+
getHistoricalState(slot, config, db, workerData.nativeStateView, historicalStateRegenMetrics)
|
|
69
66
|
);
|
|
70
67
|
const result = Transfer(stateBytes, [stateBytes.buffer]) as unknown as Uint8Array;
|
|
71
68
|
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import {CheckpointWithHex} from "@lodestar/fork-choice";
|
|
2
|
-
import {
|
|
3
|
-
CachedBeaconStateAllForks,
|
|
4
|
-
EffectiveBalanceIncrements,
|
|
5
|
-
computeStartSlotAtEpoch,
|
|
6
|
-
getBlockRootAtSlot,
|
|
7
|
-
getEffectiveBalanceIncrementsZeroInactive,
|
|
8
|
-
} from "@lodestar/state-transition";
|
|
2
|
+
import {EffectiveBalanceIncrements, IBeaconStateView, computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
9
3
|
import {Epoch, RootHex} from "@lodestar/types";
|
|
10
4
|
import {toRootHex} from "@lodestar/utils";
|
|
11
5
|
|
|
@@ -29,11 +23,11 @@ export class CheckpointBalancesCache {
|
|
|
29
23
|
* `state.current_epoch`. If there is not already some entry for the given block root, then
|
|
30
24
|
* add the effective balances from the `state` to the cache.
|
|
31
25
|
*/
|
|
32
|
-
processState(blockRootHex: RootHex, state:
|
|
33
|
-
const epoch = state.
|
|
26
|
+
processState(blockRootHex: RootHex, state: IBeaconStateView): void {
|
|
27
|
+
const epoch = state.epoch;
|
|
34
28
|
const epochBoundarySlot = computeStartSlotAtEpoch(epoch);
|
|
35
29
|
const epochBoundaryRoot =
|
|
36
|
-
epochBoundarySlot === state.slot ? blockRootHex : toRootHex(getBlockRootAtSlot(
|
|
30
|
+
epochBoundarySlot === state.slot ? blockRootHex : toRootHex(state.getBlockRootAtSlot(epochBoundarySlot));
|
|
37
31
|
|
|
38
32
|
const index = this.items.findIndex((item) => item.epoch === epoch && item.rootHex === epochBoundaryRoot);
|
|
39
33
|
if (index === -1) {
|
|
@@ -41,7 +35,7 @@ export class CheckpointBalancesCache {
|
|
|
41
35
|
this.items.shift();
|
|
42
36
|
}
|
|
43
37
|
// expect to reach this once per epoch
|
|
44
|
-
this.items.push({epoch, rootHex: epochBoundaryRoot, balances: getEffectiveBalanceIncrementsZeroInactive(
|
|
38
|
+
this.items.push({epoch, rootHex: epochBoundaryRoot, balances: state.getEffectiveBalanceIncrementsZeroInactive()});
|
|
45
39
|
}
|
|
46
40
|
}
|
|
47
41
|
|
|
@@ -16,6 +16,7 @@ export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecars;
|
|
|
16
16
|
* sources so each should be labelled individually.
|
|
17
17
|
*/
|
|
18
18
|
export enum BlockInputSource {
|
|
19
|
+
network_processor = "network_processor",
|
|
19
20
|
gossip = "gossip",
|
|
20
21
|
api = "api",
|
|
21
22
|
engine = "engine",
|
|
@@ -3,6 +3,7 @@ import {routes} from "@lodestar/api";
|
|
|
3
3
|
import {
|
|
4
4
|
AncestorStatus,
|
|
5
5
|
EpochDifference,
|
|
6
|
+
ExecutionStatus,
|
|
6
7
|
ForkChoiceError,
|
|
7
8
|
ForkChoiceErrorCode,
|
|
8
9
|
NotReorgedReason,
|
|
@@ -18,15 +19,12 @@ import {
|
|
|
18
19
|
SLOTS_PER_EPOCH,
|
|
19
20
|
} from "@lodestar/params";
|
|
20
21
|
import {
|
|
21
|
-
|
|
22
|
-
EpochCache,
|
|
22
|
+
IBeaconStateView,
|
|
23
23
|
RootCache,
|
|
24
24
|
computeEpochAtSlot,
|
|
25
25
|
computeStartSlotAtEpoch,
|
|
26
26
|
computeTimeAtSlot,
|
|
27
|
-
isExecutionStateType,
|
|
28
27
|
isStartSlotOfEpoch,
|
|
29
|
-
isStateValidatorsNodesPopulated,
|
|
30
28
|
} from "@lodestar/state-transition";
|
|
31
29
|
import {
|
|
32
30
|
Attestation,
|
|
@@ -87,7 +85,7 @@ export async function importBlock(
|
|
|
87
85
|
fullyVerifiedBlock: FullyVerifiedBlock,
|
|
88
86
|
opts: ImportBlockOpts
|
|
89
87
|
): Promise<void> {
|
|
90
|
-
const {blockInput,
|
|
88
|
+
const {blockInput, postBlockState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
|
|
91
89
|
fullyVerifiedBlock;
|
|
92
90
|
const block = blockInput.getBlock();
|
|
93
91
|
const source = blockInput.getBlockSource();
|
|
@@ -99,7 +97,7 @@ export async function importBlock(
|
|
|
99
97
|
const blockEpoch = computeEpochAtSlot(blockSlot);
|
|
100
98
|
const prevFinalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
101
99
|
const blockDelaySec =
|
|
102
|
-
fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot,
|
|
100
|
+
fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot, postBlockState.genesisTime);
|
|
103
101
|
const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
|
|
104
102
|
const fork = this.config.getForkSeq(blockSlot);
|
|
105
103
|
|
|
@@ -122,13 +120,13 @@ export async function importBlock(
|
|
|
122
120
|
// 2. Import block to fork choice
|
|
123
121
|
|
|
124
122
|
// Should compute checkpoint balances before forkchoice.onBlock
|
|
125
|
-
this.checkpointBalancesCache.processState(blockRootHex,
|
|
123
|
+
this.checkpointBalancesCache.processState(blockRootHex, postBlockState);
|
|
126
124
|
const blockSummary = this.forkChoice.onBlock(
|
|
127
125
|
block.message,
|
|
128
|
-
|
|
126
|
+
postBlockState,
|
|
129
127
|
blockDelaySec,
|
|
130
128
|
currentSlot,
|
|
131
|
-
executionStatus,
|
|
129
|
+
fork >= ForkSeq.gloas ? ExecutionStatus.PayloadSeparated : executionStatus,
|
|
132
130
|
dataAvailabilityStatus
|
|
133
131
|
);
|
|
134
132
|
|
|
@@ -138,7 +136,7 @@ export async function importBlock(
|
|
|
138
136
|
// Post-Gloas: blockSummary.payloadStatus is always PENDING, so payloadPresent = false (block state only, no payload processing yet)
|
|
139
137
|
const payloadPresent = !isGloasBlock(blockSummary);
|
|
140
138
|
// processState manages both block state and payload state variants together for memory/disk management
|
|
141
|
-
this.regen.processBlockState(blockRootHex,
|
|
139
|
+
this.regen.processBlockState(blockRootHex, postBlockState);
|
|
142
140
|
|
|
143
141
|
// For Gloas blocks, create PayloadEnvelopeInput so it's available for later payload import
|
|
144
142
|
if (fork >= ForkSeq.gloas) {
|
|
@@ -174,7 +172,7 @@ export async function importBlock(
|
|
|
174
172
|
(opts.importAttestations !== AttestationImportOpt.Skip && blockEpoch >= currentEpoch - FORK_CHOICE_ATT_EPOCH_LIMIT)
|
|
175
173
|
) {
|
|
176
174
|
const attestations = block.message.body.attestations;
|
|
177
|
-
const rootCache = new RootCache(
|
|
175
|
+
const rootCache = new RootCache(postBlockState);
|
|
178
176
|
const invalidAttestationErrorsByCode = new Map<string, {error: Error; count: number}>();
|
|
179
177
|
|
|
180
178
|
const addAttestation = fork >= ForkSeq.electra ? addAttestationPostElectra : addAttestationPreElectra;
|
|
@@ -188,7 +186,7 @@ export async function importBlock(
|
|
|
188
186
|
const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
|
|
189
187
|
addAttestation.call(
|
|
190
188
|
this,
|
|
191
|
-
|
|
189
|
+
postBlockState,
|
|
192
190
|
target,
|
|
193
191
|
attDataRoot,
|
|
194
192
|
attestation as Attestation<ForkPostElectra>,
|
|
@@ -303,7 +301,7 @@ export async function importBlock(
|
|
|
303
301
|
|
|
304
302
|
if (newHead.blockRoot !== oldHead.blockRoot) {
|
|
305
303
|
// Set head state as strong reference
|
|
306
|
-
this.regen.updateHeadState(newHead,
|
|
304
|
+
this.regen.updateHeadState(newHead, postBlockState);
|
|
307
305
|
|
|
308
306
|
try {
|
|
309
307
|
this.emitter.emit(routes.events.EventType.head, {
|
|
@@ -375,7 +373,7 @@ export async function importBlock(
|
|
|
375
373
|
try {
|
|
376
374
|
this.lightClientServer?.onImportBlockHead(
|
|
377
375
|
block.message as BeaconBlock<ForkPostAltair>,
|
|
378
|
-
|
|
376
|
+
postBlockState,
|
|
379
377
|
parentBlockSlot
|
|
380
378
|
);
|
|
381
379
|
} catch (e) {
|
|
@@ -396,11 +394,11 @@ export async function importBlock(
|
|
|
396
394
|
// and the block is weak and can potentially be reorged out.
|
|
397
395
|
let shouldOverrideFcu = false;
|
|
398
396
|
|
|
399
|
-
if (blockSlot >= currentSlot && isExecutionStateType
|
|
397
|
+
if (blockSlot >= currentSlot && postBlockState.isExecutionStateType) {
|
|
400
398
|
let notOverrideFcuReason = NotReorgedReason.Unknown;
|
|
401
399
|
const proposalSlot = blockSlot + 1;
|
|
402
400
|
try {
|
|
403
|
-
const proposerIndex =
|
|
401
|
+
const proposerIndex = postBlockState.getBeaconProposer(proposalSlot);
|
|
404
402
|
const feeRecipient = this.beaconProposerCache.get(proposerIndex);
|
|
405
403
|
|
|
406
404
|
if (feeRecipient) {
|
|
@@ -480,20 +478,20 @@ export async function importBlock(
|
|
|
480
478
|
}
|
|
481
479
|
}
|
|
482
480
|
|
|
483
|
-
if (!isStateValidatorsNodesPopulated(
|
|
484
|
-
this.logger.verbose("After importBlock caching postState without SSZ cache", {slot:
|
|
481
|
+
if (!postBlockState.isStateValidatorsNodesPopulated()) {
|
|
482
|
+
this.logger.verbose("After importBlock caching postState without SSZ cache", {slot: postBlockState.slot});
|
|
485
483
|
}
|
|
486
484
|
|
|
487
485
|
// Cache shufflings when crossing an epoch boundary
|
|
488
486
|
const parentEpoch = computeEpochAtSlot(parentBlockSlot);
|
|
489
487
|
if (parentEpoch < blockEpoch) {
|
|
490
|
-
this.shufflingCache.processState(
|
|
488
|
+
this.shufflingCache.processState(postBlockState);
|
|
491
489
|
this.logger.verbose("Processed shuffling for next epoch", {parentEpoch, blockEpoch, slot: blockSlot});
|
|
492
490
|
}
|
|
493
491
|
|
|
494
492
|
if (blockSlot % SLOTS_PER_EPOCH === 0) {
|
|
495
493
|
// Cache state to preserve epoch transition work
|
|
496
|
-
const checkpointState =
|
|
494
|
+
const checkpointState = postBlockState;
|
|
497
495
|
const cp = getCheckpointFromState(checkpointState);
|
|
498
496
|
this.regen.addCheckpointState(cp, checkpointState, payloadPresent);
|
|
499
497
|
// consumers should not mutate state ever
|
|
@@ -502,7 +500,7 @@ export async function importBlock(
|
|
|
502
500
|
// Note: in-lined code from previos handler of ChainEvent.checkpoint
|
|
503
501
|
this.logger.verbose("Checkpoint processed", toCheckpointHexPayload(cp, payloadPresent));
|
|
504
502
|
|
|
505
|
-
const activeValidatorsCount = checkpointState.
|
|
503
|
+
const activeValidatorsCount = checkpointState.activeValidatorCount;
|
|
506
504
|
this.metrics?.currentActiveValidators.set(activeValidatorsCount);
|
|
507
505
|
this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
|
|
508
506
|
|
|
@@ -587,7 +585,7 @@ export async function importBlock(
|
|
|
587
585
|
this.validatorMonitor?.registerSyncAggregateInBlock(
|
|
588
586
|
blockEpoch,
|
|
589
587
|
(block as altair.SignedBeaconBlock).message.body.syncAggregate,
|
|
590
|
-
fullyVerifiedBlock.
|
|
588
|
+
fullyVerifiedBlock.postBlockState.currentSyncCommitteeIndexed.validatorIndices
|
|
591
589
|
);
|
|
592
590
|
}
|
|
593
591
|
|
|
@@ -629,7 +627,7 @@ export async function importBlock(
|
|
|
629
627
|
export function addAttestationPreElectra(
|
|
630
628
|
this: BeaconChain,
|
|
631
629
|
// added to have the same signature as addAttestationPostElectra
|
|
632
|
-
_:
|
|
630
|
+
_: IBeaconStateView,
|
|
633
631
|
target: phase0.Checkpoint,
|
|
634
632
|
attDataRoot: string,
|
|
635
633
|
attestation: Attestation,
|
|
@@ -646,7 +644,7 @@ export function addAttestationPreElectra(
|
|
|
646
644
|
|
|
647
645
|
export function addAttestationPostElectra(
|
|
648
646
|
this: BeaconChain,
|
|
649
|
-
|
|
647
|
+
state: IBeaconStateView,
|
|
650
648
|
target: phase0.Checkpoint,
|
|
651
649
|
attDataRoot: string,
|
|
652
650
|
attestation: Attestation<ForkPostElectra>,
|
|
@@ -664,7 +662,7 @@ export function addAttestationPostElectra(
|
|
|
664
662
|
} else {
|
|
665
663
|
const attSlot = attestation.data.slot;
|
|
666
664
|
const attEpoch = computeEpochAtSlot(attSlot);
|
|
667
|
-
const decisionRoot =
|
|
665
|
+
const decisionRoot = state.getShufflingDecisionRoot(attEpoch);
|
|
668
666
|
const committees = this.shufflingCache.getBeaconCommittees(attEpoch, decisionRoot, attSlot, committeeIndices);
|
|
669
667
|
const aggregationBools = attestation.aggregationBits.toBoolArray();
|
|
670
668
|
let offset = 0;
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
CachedBeaconStateGloas,
|
|
6
|
-
getExecutionPayloadEnvelopeSignatureSet,
|
|
7
|
-
} from "@lodestar/state-transition";
|
|
8
|
-
import {processExecutionPayloadEnvelope} from "@lodestar/state-transition/block";
|
|
2
|
+
import {ExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
|
|
3
|
+
import {ForkName, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
4
|
+
import {getExecutionPayloadEnvelopeSignatureSet} from "@lodestar/state-transition";
|
|
9
5
|
import {byteArrayEquals, fromHex, toRootHex} from "@lodestar/utils";
|
|
10
6
|
import {ExecutionPayloadStatus} from "../../execution/index.js";
|
|
11
7
|
import {isQueueErrorAborted} from "../../util/queue/index.js";
|
|
@@ -56,6 +52,19 @@ export class PayloadError extends Error {
|
|
|
56
52
|
}
|
|
57
53
|
}
|
|
58
54
|
|
|
55
|
+
function toForkChoiceExecutionStatus(status: ExecutionPayloadStatus): PayloadExecutionStatus {
|
|
56
|
+
switch (status) {
|
|
57
|
+
case ExecutionPayloadStatus.VALID:
|
|
58
|
+
return ExecutionStatus.Valid;
|
|
59
|
+
// TODO GLOAS: Handle optimistic import for payload
|
|
60
|
+
case ExecutionPayloadStatus.SYNCING:
|
|
61
|
+
case ExecutionPayloadStatus.ACCEPTED:
|
|
62
|
+
return ExecutionStatus.Syncing;
|
|
63
|
+
default:
|
|
64
|
+
throw new Error(`Unexpected execution payload status for fork choice: ${status}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
59
68
|
/**
|
|
60
69
|
* Import an execution payload envelope after all data is available.
|
|
61
70
|
*
|
|
@@ -93,12 +102,12 @@ export async function importExecutionPayload(
|
|
|
93
102
|
|
|
94
103
|
// 3. Get pre-state for processExecutionPayloadEnvelope
|
|
95
104
|
// We need the block state (post-block, pre-payload) to process the envelope
|
|
96
|
-
const blockState =
|
|
105
|
+
const blockState = await this.regen.getBlockSlotState(
|
|
97
106
|
protoBlock,
|
|
98
107
|
protoBlock.slot,
|
|
99
108
|
{dontTransferCache: true},
|
|
100
109
|
RegenCaller.processBlock
|
|
101
|
-
)
|
|
110
|
+
);
|
|
102
111
|
|
|
103
112
|
// 4. Run verification steps in parallel
|
|
104
113
|
// Note: No data availability check needed here - importExecutionPayload is only
|
|
@@ -117,8 +126,8 @@ export async function importExecutionPayload(
|
|
|
117
126
|
: (async () => {
|
|
118
127
|
const signatureSet = getExecutionPayloadEnvelopeSignatureSet(
|
|
119
128
|
this.config,
|
|
120
|
-
|
|
121
|
-
|
|
129
|
+
this.pubkeyCache,
|
|
130
|
+
blockState,
|
|
122
131
|
envelope,
|
|
123
132
|
payloadInput.proposerIndex
|
|
124
133
|
);
|
|
@@ -130,7 +139,7 @@ export async function importExecutionPayload(
|
|
|
130
139
|
(async () => {
|
|
131
140
|
try {
|
|
132
141
|
return {
|
|
133
|
-
postPayloadState: processExecutionPayloadEnvelope(
|
|
142
|
+
postPayloadState: blockState.processExecutionPayloadEnvelope(envelope, {
|
|
134
143
|
verifySignature: false,
|
|
135
144
|
verifyStateRoot: false,
|
|
136
145
|
}),
|
|
@@ -166,12 +175,7 @@ export async function importExecutionPayload(
|
|
|
166
175
|
|
|
167
176
|
case ExecutionPayloadStatus.ACCEPTED:
|
|
168
177
|
case ExecutionPayloadStatus.SYNCING:
|
|
169
|
-
|
|
170
|
-
throw new PayloadError({
|
|
171
|
-
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
|
|
172
|
-
execStatus: execResult.status,
|
|
173
|
-
errorMessage: execResult.validationError ?? "EL syncing, payload not yet validated",
|
|
174
|
-
});
|
|
178
|
+
break;
|
|
175
179
|
|
|
176
180
|
case ExecutionPayloadStatus.INVALID_BLOCK_HASH:
|
|
177
181
|
case ExecutionPayloadStatus.ELERROR:
|
|
@@ -209,14 +213,16 @@ export async function importExecutionPayload(
|
|
|
209
213
|
blockRootHex,
|
|
210
214
|
payloadInput.getBlockHashHex(),
|
|
211
215
|
envelope.message.payload.blockNumber,
|
|
212
|
-
toRootHex(postPayloadStateRoot)
|
|
216
|
+
toRootHex(postPayloadStateRoot),
|
|
217
|
+
toForkChoiceExecutionStatus(execResult.status)
|
|
213
218
|
);
|
|
214
219
|
|
|
215
220
|
// 7. Cache payload state
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
221
|
+
this.regen.processPayloadState(postPayloadState);
|
|
222
|
+
if (postPayloadState.slot % SLOTS_PER_EPOCH === 0) {
|
|
223
|
+
const {checkpoint} = postPayloadState.computeAnchorCheckpoint();
|
|
224
|
+
this.regen.addCheckpointState(checkpoint, postPayloadState, true);
|
|
225
|
+
}
|
|
220
226
|
|
|
221
227
|
// 8. Record metrics for payload envelope and column sources
|
|
222
228
|
this.metrics?.importPayload.bySource.inc({source: payloadInput.getPayloadEnvelopeSource().source});
|
|
@@ -88,7 +88,8 @@ export async function processBlocks(
|
|
|
88
88
|
const fullyVerifiedBlocks = relevantBlocks.map(
|
|
89
89
|
(block, i): FullyVerifiedBlock => ({
|
|
90
90
|
blockInput: block,
|
|
91
|
-
|
|
91
|
+
postBlockState: postStates[i],
|
|
92
|
+
postEnvelopeState: null,
|
|
92
93
|
parentBlockSlot: parentSlots[i],
|
|
93
94
|
executionStatus: executionStatuses[i],
|
|
94
95
|
// start supporting optimistic syncing/processing
|
|
@@ -126,7 +127,7 @@ export async function processBlocks(
|
|
|
126
127
|
const {state} = err.type;
|
|
127
128
|
const forkTypes = this.config.getForkTypes(blockSlot);
|
|
128
129
|
this.persistInvalidSszValue(forkTypes.SignedBeaconBlock, signedBlock, `${blockSlot}_invalid_signature`);
|
|
129
|
-
this.
|
|
130
|
+
this.persistInvalidSszBytes("BeaconState", state.serialize(), `${state.slot}_invalid_signature`);
|
|
130
131
|
} else if (err.type.code === BlockErrorCode.INVALID_STATE_ROOT) {
|
|
131
132
|
const {signedBlock} = err;
|
|
132
133
|
const blockSlot = signedBlock.message.slot;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {
|
|
2
|
+
import {BlockExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
|
|
3
3
|
import {ForkSeq} from "@lodestar/params";
|
|
4
|
-
import {
|
|
4
|
+
import {DataAvailabilityStatus, IBeaconStateView, computeEpochAtSlot} from "@lodestar/state-transition";
|
|
5
5
|
import type {IndexedAttestation, Slot, fulu} from "@lodestar/types";
|
|
6
6
|
import {IBlockInput} from "./blockInput/types.js";
|
|
7
7
|
|
|
@@ -88,24 +88,35 @@ export type ImportBlockOpts = {
|
|
|
88
88
|
seenTimestampSec?: number;
|
|
89
89
|
};
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
* A wrapper around a `SignedBeaconBlock` that indicates that this block is fully verified and ready to import
|
|
93
|
-
*/
|
|
94
|
-
export type FullyVerifiedBlock = {
|
|
91
|
+
type FullyVerifiedBlockBase = {
|
|
95
92
|
blockInput: IBlockInput;
|
|
96
|
-
|
|
93
|
+
postBlockState: IBeaconStateView;
|
|
97
94
|
parentBlockSlot: Slot;
|
|
98
95
|
proposerBalanceDelta: number;
|
|
99
|
-
/**
|
|
100
|
-
* If the execution payload couldnt be verified because of EL syncing status,
|
|
101
|
-
* used in optimistic sync or for merge block
|
|
102
|
-
*/
|
|
103
|
-
executionStatus: MaybeValidExecutionStatus;
|
|
104
96
|
dataAvailabilityStatus: DataAvailabilityStatus;
|
|
105
|
-
/**
|
|
106
|
-
* Pre-computed indexed attestations from signature verification to avoid duplicate work
|
|
107
|
-
*/
|
|
97
|
+
/** Pre-computed indexed attestations from signature verification to avoid duplicate work */
|
|
108
98
|
indexedAttestations: IndexedAttestation[];
|
|
109
99
|
/** Seen timestamp seconds */
|
|
110
100
|
seenTimestampSec: number;
|
|
111
101
|
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* A wrapper around a `SignedBeaconBlock` that indicates that this block is fully verified and ready to import.
|
|
105
|
+
*
|
|
106
|
+
* Discriminated union on `postEnvelopeState`:
|
|
107
|
+
* - `null` → block has no pre-verified envelope; `executionStatus` is any `BlockExecutionStatus`
|
|
108
|
+
* - non-null → envelope was pre-verified during state transition; `executionStatus` is narrowed to
|
|
109
|
+
* `Valid | Syncing` (matching what `forkChoice.onExecutionPayload` expects)
|
|
110
|
+
*/
|
|
111
|
+
export type FullyVerifiedBlock = FullyVerifiedBlockBase &
|
|
112
|
+
(
|
|
113
|
+
| {
|
|
114
|
+
postEnvelopeState: null;
|
|
115
|
+
/** If the execution payload couldn't be verified because of EL syncing status, used in optimistic sync or for merge block */
|
|
116
|
+
executionStatus: BlockExecutionStatus;
|
|
117
|
+
}
|
|
118
|
+
| {
|
|
119
|
+
postEnvelopeState: IBeaconStateView;
|
|
120
|
+
executionStatus: PayloadExecutionStatus;
|
|
121
|
+
}
|
|
122
|
+
);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
2
|
-
import {
|
|
2
|
+
import {IBeaconStateView, computeEpochAtSlot} from "@lodestar/state-transition";
|
|
3
3
|
import {phase0, ssz} from "@lodestar/types";
|
|
4
4
|
import {ZERO_HASH} from "../../../constants/index.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Compute a Checkpoint type from `state.latestBlockHeader`
|
|
8
8
|
*/
|
|
9
|
-
export function getCheckpointFromState(checkpointState:
|
|
9
|
+
export function getCheckpointFromState(checkpointState: IBeaconStateView): phase0.Checkpoint {
|
|
10
10
|
const slot = checkpointState.slot;
|
|
11
11
|
|
|
12
12
|
if (slot % SLOTS_PER_EPOCH !== 0) {
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import {ExecutionStatus, ProtoBlock} from "@lodestar/fork-choice";
|
|
2
2
|
import {ForkName, isForkPostFulu} from "@lodestar/params";
|
|
3
|
-
import {
|
|
4
|
-
CachedBeaconStateAllForks,
|
|
5
|
-
DataAvailabilityStatus,
|
|
6
|
-
computeEpochAtSlot,
|
|
7
|
-
isStateValidatorsNodesPopulated,
|
|
8
|
-
} from "@lodestar/state-transition";
|
|
3
|
+
import {DataAvailabilityStatus, IBeaconStateView, computeEpochAtSlot} from "@lodestar/state-transition";
|
|
9
4
|
import {IndexedAttestation, deneb} from "@lodestar/types";
|
|
10
5
|
import type {BeaconChain} from "../chain.js";
|
|
11
6
|
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
@@ -39,7 +34,7 @@ export async function verifyBlocksInEpoch(
|
|
|
39
34
|
blockInputs: IBlockInput[],
|
|
40
35
|
opts: BlockProcessOpts & ImportBlockOpts
|
|
41
36
|
): Promise<{
|
|
42
|
-
postStates:
|
|
37
|
+
postStates: IBeaconStateView[];
|
|
43
38
|
proposerBalanceDeltas: number[];
|
|
44
39
|
segmentExecStatus: SegmentExecStatus;
|
|
45
40
|
dataAvailabilityStatuses: DataAvailabilityStatus[];
|
|
@@ -78,10 +73,10 @@ export async function verifyBlocksInEpoch(
|
|
|
78
73
|
// otherwise it may fail to get indexed attestations from shuffling cache later
|
|
79
74
|
this.shufflingCache.processState(preState0);
|
|
80
75
|
|
|
81
|
-
if (!isStateValidatorsNodesPopulated(
|
|
76
|
+
if (!preState0.isStateValidatorsNodesPopulated()) {
|
|
82
77
|
this.logger.verbose("verifyBlocksInEpoch preState0 SSZ cache stats", {
|
|
83
78
|
slot: preState0.slot,
|
|
84
|
-
cache: isStateValidatorsNodesPopulated(
|
|
79
|
+
cache: preState0.isStateValidatorsNodesPopulated(),
|
|
85
80
|
clonedCount: preState0.clonedCount,
|
|
86
81
|
clonedCountWithTransferCache: preState0.clonedCountWithTransferCache,
|
|
87
82
|
createdWithTransferCache: preState0.createdWithTransferCache,
|
|
@@ -110,7 +105,7 @@ export async function verifyBlocksInEpoch(
|
|
|
110
105
|
for (const [i, block] of blocks.entries()) {
|
|
111
106
|
indexedAttestationsByBlock[i] = block.message.body.attestations.map((attestation) => {
|
|
112
107
|
const attEpoch = computeEpochAtSlot(attestation.data.slot);
|
|
113
|
-
const decisionRoot = preState0.
|
|
108
|
+
const decisionRoot = preState0.getShufflingDecisionRoot(attEpoch);
|
|
114
109
|
return this.shufflingCache.getIndexedAttestation(attEpoch, decisionRoot, fork, attestation);
|
|
115
110
|
});
|
|
116
111
|
}
|