@lodestar/beacon-node 1.41.0 → 1.42.0-dev.2f0347050b
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 +36 -17
- 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 +6 -6
- 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 +32 -28
- 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 +0 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -9
- 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 +5 -4
- package/lib/chain/archiveStore/interface.d.ts.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +4 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +38 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/balancesCache.d.ts +2 -2
- package/lib/chain/balancesCache.d.ts.map +1 -1
- package/lib/chain/balancesCache.js +4 -4
- package/lib/chain/balancesCache.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +4 -3
- 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 +48 -28
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +48 -0
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -0
- package/lib/chain/blocks/importExecutionPayload.js +167 -0
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -0
- 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/index.d.ts +3 -0
- package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/index.js +3 -0
- package/lib/chain/blocks/payloadEnvelopeInput/index.js.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +80 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +248 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +29 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.js +11 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +15 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +46 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -0
- package/lib/chain/blocks/types.d.ts +28 -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 +2 -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/blocks/writePayloadEnvelopeInputToDb.d.ts +12 -0
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -0
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +40 -0
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -0
- package/lib/chain/chain.d.ts +22 -17
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +90 -48
- 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/errors/executionPayloadEnvelope.d.ts +12 -2
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.js +3 -1
- package/lib/chain/errors/executionPayloadEnvelope.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 +27 -33
- 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 +19 -17
- 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 +2 -2
- 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 +9 -5
- 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 +8 -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 +13 -17
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/errors.d.ts +11 -1
- package/lib/chain/regen/errors.d.ts.map +1 -1
- package/lib/chain/regen/errors.js +2 -0
- package/lib/chain/regen/errors.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +22 -14
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +2 -0
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/regen/queued.d.ts +20 -15
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +40 -8
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +11 -5
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +38 -11
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/seenCache/index.d.ts +1 -1
- package/lib/chain/seenCache/index.d.ts.map +1 -1
- package/lib/chain/seenCache/index.js +1 -1
- package/lib/chain/seenCache/index.js.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 +38 -0
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -0
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +76 -0
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -0
- 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/datastore/db.d.ts +4 -5
- package/lib/chain/stateCache/datastore/db.d.ts.map +1 -1
- package/lib/chain/stateCache/datastore/db.js +32 -10
- package/lib/chain/stateCache/datastore/db.js.map +1 -1
- package/lib/chain/stateCache/datastore/file.d.ts +1 -1
- package/lib/chain/stateCache/datastore/file.d.ts.map +1 -1
- package/lib/chain/stateCache/datastore/file.js +5 -5
- package/lib/chain/stateCache/datastore/file.js.map +1 -1
- package/lib/chain/stateCache/datastore/types.d.ts +1 -1
- package/lib/chain/stateCache/datastore/types.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +13 -10
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +8 -3
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +36 -17
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +228 -134
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +23 -16
- 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 +29 -19
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.js +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.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 +5 -4
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +13 -8
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +2 -2
- package/lib/metrics/metrics/lodestar.d.ts +40 -4
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +93 -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/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 +11 -5
- package/lib/network/network.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 +15 -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 +39 -9
- 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 +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +10 -1
- 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 +3 -3
- package/lib/sync/backfill/backfill.d.ts.map +1 -1
- package/lib/sync/backfill/backfill.js +3 -3
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/constants.d.ts +1 -1
- package/lib/sync/constants.js +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/sszBytes.d.ts +4 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +69 -12
- 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 +37 -18
- 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 +13 -27
- 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 +35 -43
- package/src/api/impl/validator/utils.ts +4 -7
- package/src/chain/archiveStore/archiveStore.ts +1 -10
- 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 +5 -4
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +8 -5
- package/src/chain/archiveStore/utils/archiveBlocks.ts +59 -1
- package/src/chain/balancesCache.ts +5 -11
- package/src/chain/blocks/blockInput/types.ts +4 -3
- package/src/chain/blocks/importBlock.ts +69 -32
- package/src/chain/blocks/importExecutionPayload.ts +247 -0
- package/src/chain/blocks/index.ts +3 -2
- package/src/chain/blocks/payloadEnvelopeInput/index.ts +2 -0
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +336 -0
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +33 -0
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +61 -0
- package/src/chain/blocks/types.ts +34 -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 +4 -4
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
- package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +55 -0
- package/src/chain/chain.ts +134 -81
- package/src/chain/emitter.ts +2 -2
- package/src/chain/errors/blockError.ts +4 -4
- package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
- package/src/chain/forkChoice/index.ts +33 -52
- package/src/chain/initState.ts +7 -2
- package/src/chain/interface.ts +20 -18
- 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 +4 -4
- package/src/chain/options.ts +2 -0
- package/src/chain/prepareNextSlot.ts +12 -10
- package/src/chain/produceBlock/computeNewStateRoot.ts +11 -10
- package/src/chain/produceBlock/produceBlockBody.ts +23 -50
- package/src/chain/regen/errors.ts +6 -1
- package/src/chain/regen/interface.ts +22 -18
- package/src/chain/regen/queued.ts +59 -27
- package/src/chain/regen/regen.ts +52 -23
- package/src/chain/seenCache/index.ts +1 -1
- package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +106 -0
- package/src/chain/serializeState.ts +3 -3
- package/src/chain/shufflingCache.ts +5 -7
- package/src/chain/stateCache/datastore/db.ts +33 -10
- package/src/chain/stateCache/datastore/file.ts +6 -5
- package/src/chain/stateCache/datastore/types.ts +3 -2
- package/src/chain/stateCache/fifoBlockStateCache.ts +17 -11
- package/src/chain/stateCache/persistentCheckpointsCache.ts +266 -172
- package/src/chain/stateCache/types.ts +22 -16
- 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 +36 -29
- package/src/chain/validation/lightClientFinalityUpdate.ts +1 -1
- package/src/chain/validation/lightClientOptimisticUpdate.ts +1 -1
- 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 -7
- package/src/chain/validatorMonitor.ts +23 -12
- package/src/execution/engine/interface.ts +2 -2
- package/src/metrics/metrics/lodestar.ts +100 -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 +34 -6
- package/src/network/processor/extractSlotRootFns.ts +19 -6
- package/src/network/processor/gossipHandlers.ts +45 -8
- package/src/network/processor/index.ts +110 -89
- package/src/network/reqresp/ReqRespBeaconNode.ts +14 -1
- 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 +4 -4
- package/src/sync/constants.ts +1 -1
- package/src/sync/unknownBlock.ts +10 -50
- package/src/util/sszBytes.ts +90 -10
- package/src/util/types.ts +6 -0
- package/lib/chain/archiveStore/utils/archivePayloads.d.ts +0 -7
- package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +0 -1
- package/lib/chain/archiveStore/utils/archivePayloads.js +0 -10
- package/lib/chain/archiveStore/utils/archivePayloads.js.map +0 -1
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +0 -15
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +0 -1
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +0 -28
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +0 -1
- package/src/chain/archiveStore/utils/archivePayloads.ts +0 -15
- package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +0 -34
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {ForkName} from "@lodestar/params";
|
|
2
|
-
import {ColumnIndex, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
|
|
2
|
+
import {ColumnIndex, DataColumnSidecars, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
|
|
3
3
|
import {VersionedHashes} from "../../../execution/index.js";
|
|
4
4
|
|
|
5
5
|
export enum DAType {
|
|
@@ -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",
|
|
@@ -107,9 +108,9 @@ export type MissingColumnMeta = {
|
|
|
107
108
|
export interface IDataColumnsInput {
|
|
108
109
|
readonly slot: Slot;
|
|
109
110
|
readonly blockRootHex: string;
|
|
110
|
-
getCustodyColumns():
|
|
111
|
+
getCustodyColumns(): DataColumnSidecars;
|
|
111
112
|
hasComputedAllData(): boolean;
|
|
112
|
-
waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<
|
|
113
|
+
waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<DataColumnSidecars>;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
/**
|
|
@@ -3,24 +3,40 @@ 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,
|
|
9
10
|
getSafeExecutionBlockHash,
|
|
11
|
+
isGloasBlock,
|
|
10
12
|
} from "@lodestar/fork-choice";
|
|
11
|
-
import {ForkPostAltair, ForkPostElectra, ForkSeq, MAX_SEED_LOOKAHEAD, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
12
13
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
ForkPostAltair,
|
|
15
|
+
ForkPostElectra,
|
|
16
|
+
ForkPostGloas,
|
|
17
|
+
ForkSeq,
|
|
18
|
+
MAX_SEED_LOOKAHEAD,
|
|
19
|
+
SLOTS_PER_EPOCH,
|
|
20
|
+
} from "@lodestar/params";
|
|
21
|
+
import {
|
|
22
|
+
IBeaconStateView,
|
|
15
23
|
RootCache,
|
|
16
24
|
computeEpochAtSlot,
|
|
17
25
|
computeStartSlotAtEpoch,
|
|
18
26
|
computeTimeAtSlot,
|
|
19
|
-
isExecutionStateType,
|
|
20
27
|
isStartSlotOfEpoch,
|
|
21
|
-
isStateValidatorsNodesPopulated,
|
|
22
28
|
} from "@lodestar/state-transition";
|
|
23
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
Attestation,
|
|
31
|
+
BeaconBlock,
|
|
32
|
+
SignedBeaconBlock,
|
|
33
|
+
altair,
|
|
34
|
+
capella,
|
|
35
|
+
electra,
|
|
36
|
+
isGloasBeaconBlock,
|
|
37
|
+
phase0,
|
|
38
|
+
ssz,
|
|
39
|
+
} from "@lodestar/types";
|
|
24
40
|
import {isErrorAborted, toRootHex} from "@lodestar/utils";
|
|
25
41
|
import {ZERO_HASH_HEX} from "../../constants/index.js";
|
|
26
42
|
import {callInNextEventLoop} from "../../util/eventLoop.js";
|
|
@@ -30,7 +46,7 @@ import type {BeaconChain} from "../chain.js";
|
|
|
30
46
|
import {ChainEvent, ReorgEventData} from "../emitter.js";
|
|
31
47
|
import {ForkchoiceCaller} from "../forkChoice/index.js";
|
|
32
48
|
import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_SEC} from "../reprocess.js";
|
|
33
|
-
import {
|
|
49
|
+
import {toCheckpointHexPayload} from "../stateCache/persistentCheckpointsCache.js";
|
|
34
50
|
import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
|
|
35
51
|
import {AttestationImportOpt, FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
|
|
36
52
|
import {getCheckpointFromState} from "./utils/checkpoint.js";
|
|
@@ -69,7 +85,7 @@ export async function importBlock(
|
|
|
69
85
|
fullyVerifiedBlock: FullyVerifiedBlock,
|
|
70
86
|
opts: ImportBlockOpts
|
|
71
87
|
): Promise<void> {
|
|
72
|
-
const {blockInput,
|
|
88
|
+
const {blockInput, postBlockState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
|
|
73
89
|
fullyVerifiedBlock;
|
|
74
90
|
const block = blockInput.getBlock();
|
|
75
91
|
const source = blockInput.getBlockSource();
|
|
@@ -81,7 +97,7 @@ export async function importBlock(
|
|
|
81
97
|
const blockEpoch = computeEpochAtSlot(blockSlot);
|
|
82
98
|
const prevFinalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
83
99
|
const blockDelaySec =
|
|
84
|
-
fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot,
|
|
100
|
+
fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot, postBlockState.genesisTime);
|
|
85
101
|
const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
|
|
86
102
|
const fork = this.config.getForkSeq(blockSlot);
|
|
87
103
|
|
|
@@ -104,19 +120,40 @@ export async function importBlock(
|
|
|
104
120
|
// 2. Import block to fork choice
|
|
105
121
|
|
|
106
122
|
// Should compute checkpoint balances before forkchoice.onBlock
|
|
107
|
-
this.checkpointBalancesCache.processState(blockRootHex,
|
|
123
|
+
this.checkpointBalancesCache.processState(blockRootHex, postBlockState);
|
|
108
124
|
const blockSummary = this.forkChoice.onBlock(
|
|
109
125
|
block.message,
|
|
110
|
-
|
|
126
|
+
postBlockState,
|
|
111
127
|
blockDelaySec,
|
|
112
128
|
currentSlot,
|
|
113
|
-
executionStatus,
|
|
129
|
+
fork >= ForkSeq.gloas ? ExecutionStatus.PayloadSeparated : executionStatus,
|
|
114
130
|
dataAvailabilityStatus
|
|
115
131
|
);
|
|
116
132
|
|
|
117
133
|
// This adds the state necessary to process the next block
|
|
118
134
|
// Some block event handlers require state being in state cache so need to do this before emitting EventType.block
|
|
119
|
-
|
|
135
|
+
// Pre-Gloas: blockSummary.payloadStatus is always FULL, payloadPresent = true
|
|
136
|
+
// Post-Gloas: blockSummary.payloadStatus is always PENDING, so payloadPresent = false (block state only, no payload processing yet)
|
|
137
|
+
const payloadPresent = !isGloasBlock(blockSummary);
|
|
138
|
+
// processState manages both block state and payload state variants together for memory/disk management
|
|
139
|
+
this.regen.processBlockState(blockRootHex, postBlockState);
|
|
140
|
+
|
|
141
|
+
// For Gloas blocks, create PayloadEnvelopeInput so it's available for later payload import
|
|
142
|
+
if (fork >= ForkSeq.gloas) {
|
|
143
|
+
this.seenPayloadEnvelopeInputCache.add({
|
|
144
|
+
blockRootHex,
|
|
145
|
+
block: block as SignedBeaconBlock<ForkPostGloas>,
|
|
146
|
+
sampledColumns: this.custodyConfig.sampledColumns,
|
|
147
|
+
custodyColumns: this.custodyConfig.custodyColumns,
|
|
148
|
+
timeCreatedSec: fullyVerifiedBlock.seenTimestampSec,
|
|
149
|
+
});
|
|
150
|
+
this.logger.debug("Created PayloadEnvelopeInput for block", {
|
|
151
|
+
slot: blockSlot,
|
|
152
|
+
root: blockRootHex,
|
|
153
|
+
source: source.source,
|
|
154
|
+
...(opts.seenTimestampSec !== undefined ? {recvToImport: Date.now() / 1000 - opts.seenTimestampSec} : {}),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
120
157
|
|
|
121
158
|
this.metrics?.importBlock.bySource.inc({source: source.source});
|
|
122
159
|
this.logger.verbose("Added block to forkchoice and state cache", {slot: blockSlot, root: blockRootHex});
|
|
@@ -135,7 +172,7 @@ export async function importBlock(
|
|
|
135
172
|
(opts.importAttestations !== AttestationImportOpt.Skip && blockEpoch >= currentEpoch - FORK_CHOICE_ATT_EPOCH_LIMIT)
|
|
136
173
|
) {
|
|
137
174
|
const attestations = block.message.body.attestations;
|
|
138
|
-
const rootCache = new RootCache(
|
|
175
|
+
const rootCache = new RootCache(postBlockState);
|
|
139
176
|
const invalidAttestationErrorsByCode = new Map<string, {error: Error; count: number}>();
|
|
140
177
|
|
|
141
178
|
const addAttestation = fork >= ForkSeq.electra ? addAttestationPostElectra : addAttestationPreElectra;
|
|
@@ -149,7 +186,7 @@ export async function importBlock(
|
|
|
149
186
|
const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
|
|
150
187
|
addAttestation.call(
|
|
151
188
|
this,
|
|
152
|
-
|
|
189
|
+
postBlockState,
|
|
153
190
|
target,
|
|
154
191
|
attDataRoot,
|
|
155
192
|
attestation as Attestation<ForkPostElectra>,
|
|
@@ -264,7 +301,7 @@ export async function importBlock(
|
|
|
264
301
|
|
|
265
302
|
if (newHead.blockRoot !== oldHead.blockRoot) {
|
|
266
303
|
// Set head state as strong reference
|
|
267
|
-
this.regen.updateHeadState(newHead,
|
|
304
|
+
this.regen.updateHeadState(newHead, postBlockState);
|
|
268
305
|
|
|
269
306
|
try {
|
|
270
307
|
this.emitter.emit(routes.events.EventType.head, {
|
|
@@ -336,7 +373,7 @@ export async function importBlock(
|
|
|
336
373
|
try {
|
|
337
374
|
this.lightClientServer?.onImportBlockHead(
|
|
338
375
|
block.message as BeaconBlock<ForkPostAltair>,
|
|
339
|
-
|
|
376
|
+
postBlockState,
|
|
340
377
|
parentBlockSlot
|
|
341
378
|
);
|
|
342
379
|
} catch (e) {
|
|
@@ -357,11 +394,11 @@ export async function importBlock(
|
|
|
357
394
|
// and the block is weak and can potentially be reorged out.
|
|
358
395
|
let shouldOverrideFcu = false;
|
|
359
396
|
|
|
360
|
-
if (blockSlot >= currentSlot && isExecutionStateType
|
|
397
|
+
if (blockSlot >= currentSlot && postBlockState.isExecutionStateType) {
|
|
361
398
|
let notOverrideFcuReason = NotReorgedReason.Unknown;
|
|
362
399
|
const proposalSlot = blockSlot + 1;
|
|
363
400
|
try {
|
|
364
|
-
const proposerIndex =
|
|
401
|
+
const proposerIndex = postBlockState.getBeaconProposer(proposalSlot);
|
|
365
402
|
const feeRecipient = this.beaconProposerCache.get(proposerIndex);
|
|
366
403
|
|
|
367
404
|
if (feeRecipient) {
|
|
@@ -441,29 +478,29 @@ export async function importBlock(
|
|
|
441
478
|
}
|
|
442
479
|
}
|
|
443
480
|
|
|
444
|
-
if (!isStateValidatorsNodesPopulated(
|
|
445
|
-
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});
|
|
446
483
|
}
|
|
447
484
|
|
|
448
485
|
// Cache shufflings when crossing an epoch boundary
|
|
449
486
|
const parentEpoch = computeEpochAtSlot(parentBlockSlot);
|
|
450
487
|
if (parentEpoch < blockEpoch) {
|
|
451
|
-
this.shufflingCache.processState(
|
|
488
|
+
this.shufflingCache.processState(postBlockState);
|
|
452
489
|
this.logger.verbose("Processed shuffling for next epoch", {parentEpoch, blockEpoch, slot: blockSlot});
|
|
453
490
|
}
|
|
454
491
|
|
|
455
492
|
if (blockSlot % SLOTS_PER_EPOCH === 0) {
|
|
456
493
|
// Cache state to preserve epoch transition work
|
|
457
|
-
const checkpointState =
|
|
494
|
+
const checkpointState = postBlockState;
|
|
458
495
|
const cp = getCheckpointFromState(checkpointState);
|
|
459
|
-
this.regen.addCheckpointState(cp, checkpointState);
|
|
496
|
+
this.regen.addCheckpointState(cp, checkpointState, payloadPresent);
|
|
460
497
|
// consumers should not mutate state ever
|
|
461
498
|
this.emitter.emit(ChainEvent.checkpoint, cp, checkpointState);
|
|
462
499
|
|
|
463
500
|
// Note: in-lined code from previos handler of ChainEvent.checkpoint
|
|
464
|
-
this.logger.verbose("Checkpoint processed",
|
|
501
|
+
this.logger.verbose("Checkpoint processed", toCheckpointHexPayload(cp, payloadPresent));
|
|
465
502
|
|
|
466
|
-
const activeValidatorsCount = checkpointState.
|
|
503
|
+
const activeValidatorsCount = checkpointState.activeValidatorCount;
|
|
467
504
|
this.metrics?.currentActiveValidators.set(activeValidatorsCount);
|
|
468
505
|
this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
|
|
469
506
|
|
|
@@ -479,7 +516,7 @@ export async function importBlock(
|
|
|
479
516
|
const justifiedEpoch = justifiedCheckpoint.epoch;
|
|
480
517
|
const preJustifiedEpoch = parentBlockSummary.justifiedEpoch;
|
|
481
518
|
if (justifiedEpoch > preJustifiedEpoch) {
|
|
482
|
-
this.logger.verbose("Checkpoint justified",
|
|
519
|
+
this.logger.verbose("Checkpoint justified", toCheckpointHexPayload(justifiedCheckpoint, payloadPresent));
|
|
483
520
|
this.metrics?.previousJustifiedEpoch.set(checkpointState.previousJustifiedCheckpoint.epoch);
|
|
484
521
|
this.metrics?.currentJustifiedEpoch.set(justifiedCheckpoint.epoch);
|
|
485
522
|
}
|
|
@@ -493,7 +530,7 @@ export async function importBlock(
|
|
|
493
530
|
state: toRootHex(checkpointState.hashTreeRoot()),
|
|
494
531
|
executionOptimistic: false,
|
|
495
532
|
});
|
|
496
|
-
this.logger.verbose("Checkpoint finalized",
|
|
533
|
+
this.logger.verbose("Checkpoint finalized", toCheckpointHexPayload(finalizedCheckpoint, payloadPresent));
|
|
497
534
|
this.metrics?.finalizedEpoch.set(finalizedCheckpoint.epoch);
|
|
498
535
|
}
|
|
499
536
|
}
|
|
@@ -548,7 +585,7 @@ export async function importBlock(
|
|
|
548
585
|
this.validatorMonitor?.registerSyncAggregateInBlock(
|
|
549
586
|
blockEpoch,
|
|
550
587
|
(block as altair.SignedBeaconBlock).message.body.syncAggregate,
|
|
551
|
-
fullyVerifiedBlock.
|
|
588
|
+
fullyVerifiedBlock.postBlockState.currentSyncCommitteeIndexed.validatorIndices
|
|
552
589
|
);
|
|
553
590
|
}
|
|
554
591
|
|
|
@@ -590,7 +627,7 @@ export async function importBlock(
|
|
|
590
627
|
export function addAttestationPreElectra(
|
|
591
628
|
this: BeaconChain,
|
|
592
629
|
// added to have the same signature as addAttestationPostElectra
|
|
593
|
-
_:
|
|
630
|
+
_: IBeaconStateView,
|
|
594
631
|
target: phase0.Checkpoint,
|
|
595
632
|
attDataRoot: string,
|
|
596
633
|
attestation: Attestation,
|
|
@@ -607,7 +644,7 @@ export function addAttestationPreElectra(
|
|
|
607
644
|
|
|
608
645
|
export function addAttestationPostElectra(
|
|
609
646
|
this: BeaconChain,
|
|
610
|
-
|
|
647
|
+
state: IBeaconStateView,
|
|
611
648
|
target: phase0.Checkpoint,
|
|
612
649
|
attDataRoot: string,
|
|
613
650
|
attestation: Attestation<ForkPostElectra>,
|
|
@@ -625,7 +662,7 @@ export function addAttestationPostElectra(
|
|
|
625
662
|
} else {
|
|
626
663
|
const attSlot = attestation.data.slot;
|
|
627
664
|
const attEpoch = computeEpochAtSlot(attSlot);
|
|
628
|
-
const decisionRoot =
|
|
665
|
+
const decisionRoot = state.getShufflingDecisionRoot(attEpoch);
|
|
629
666
|
const committees = this.shufflingCache.getBeaconCommittees(attEpoch, decisionRoot, attSlot, committeeIndices);
|
|
630
667
|
const aggregationBools = attestation.aggregationBits.toBoolArray();
|
|
631
668
|
let offset = 0;
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import {routes} from "@lodestar/api";
|
|
2
|
+
import {ExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
|
|
3
|
+
import {ForkName, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
4
|
+
import {getExecutionPayloadEnvelopeSignatureSet} from "@lodestar/state-transition";
|
|
5
|
+
import {byteArrayEquals, fromHex, toRootHex} from "@lodestar/utils";
|
|
6
|
+
import {ExecutionPayloadStatus} from "../../execution/index.js";
|
|
7
|
+
import {isQueueErrorAborted} from "../../util/queue/index.js";
|
|
8
|
+
import {BeaconChain} from "../chain.js";
|
|
9
|
+
import {RegenCaller} from "../regen/interface.js";
|
|
10
|
+
import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
|
|
11
|
+
import {ImportPayloadOpts} from "./types.js";
|
|
12
|
+
|
|
13
|
+
const EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS = 64;
|
|
14
|
+
|
|
15
|
+
export enum PayloadErrorCode {
|
|
16
|
+
EXECUTION_ENGINE_INVALID = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID",
|
|
17
|
+
EXECUTION_ENGINE_ERROR = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR",
|
|
18
|
+
BLOCK_NOT_IN_FORK_CHOICE = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE",
|
|
19
|
+
STATE_TRANSITION_ERROR = "PAYLOAD_ERROR_STATE_TRANSITION_ERROR",
|
|
20
|
+
INVALID_SIGNATURE = "PAYLOAD_ERROR_INVALID_SIGNATURE",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type PayloadErrorType =
|
|
24
|
+
| {
|
|
25
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_INVALID;
|
|
26
|
+
execStatus: ExecutionPayloadStatus;
|
|
27
|
+
errorMessage: string;
|
|
28
|
+
}
|
|
29
|
+
| {
|
|
30
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR;
|
|
31
|
+
execStatus: ExecutionPayloadStatus;
|
|
32
|
+
errorMessage: string;
|
|
33
|
+
}
|
|
34
|
+
| {
|
|
35
|
+
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE;
|
|
36
|
+
blockRootHex: string;
|
|
37
|
+
}
|
|
38
|
+
| {
|
|
39
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR;
|
|
40
|
+
message: string;
|
|
41
|
+
}
|
|
42
|
+
| {
|
|
43
|
+
code: PayloadErrorCode.INVALID_SIGNATURE;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export class PayloadError extends Error {
|
|
47
|
+
type: PayloadErrorType;
|
|
48
|
+
|
|
49
|
+
constructor(type: PayloadErrorType, message?: string) {
|
|
50
|
+
super(message ?? type.code);
|
|
51
|
+
this.type = type;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
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
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Import an execution payload envelope after all data is available.
|
|
70
|
+
*
|
|
71
|
+
* This function:
|
|
72
|
+
* 1. Gets the ProtoBlock from fork choice
|
|
73
|
+
* 2. Applies write-queue backpressure (waitForSpace) early, before verification
|
|
74
|
+
* 3. Regenerates the block state
|
|
75
|
+
* 4. Runs EL verification (notifyNewPayload) in parallel with signature verification and processExecutionPayloadEnvelope
|
|
76
|
+
* 5. Persists verified payload envelope to hot DB
|
|
77
|
+
* 6. Updates fork choice
|
|
78
|
+
* 7. Caches the post-execution payload state
|
|
79
|
+
* 8. Records metrics for column sources
|
|
80
|
+
*
|
|
81
|
+
*/
|
|
82
|
+
export async function importExecutionPayload(
|
|
83
|
+
this: BeaconChain,
|
|
84
|
+
payloadInput: PayloadEnvelopeInput,
|
|
85
|
+
opts: ImportPayloadOpts = {}
|
|
86
|
+
): Promise<void> {
|
|
87
|
+
const envelope = payloadInput.getPayloadEnvelope();
|
|
88
|
+
const blockRootHex = payloadInput.blockRootHex;
|
|
89
|
+
|
|
90
|
+
// 1. Get ProtoBlock for parent root lookup
|
|
91
|
+
const protoBlock = this.forkChoice.getBlockHexDefaultStatus(blockRootHex);
|
|
92
|
+
if (!protoBlock) {
|
|
93
|
+
throw new PayloadError({
|
|
94
|
+
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE,
|
|
95
|
+
blockRootHex,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 2. Apply backpressure from the write queue early, before doing verification work.
|
|
100
|
+
// The actual DB write is deferred until after verification succeeds.
|
|
101
|
+
await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
|
|
102
|
+
|
|
103
|
+
// 3. Get pre-state for processExecutionPayloadEnvelope
|
|
104
|
+
// We need the block state (post-block, pre-payload) to process the envelope
|
|
105
|
+
const blockState = await this.regen.getBlockSlotState(
|
|
106
|
+
protoBlock,
|
|
107
|
+
protoBlock.slot,
|
|
108
|
+
{dontTransferCache: true},
|
|
109
|
+
RegenCaller.processBlock
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// 4. Run verification steps in parallel
|
|
113
|
+
// Note: No data availability check needed here - importExecutionPayload is only
|
|
114
|
+
// called when payloadInput.isComplete() is true, so all data is already available.
|
|
115
|
+
const [execResult, signatureValid, postPayloadResult] = await Promise.all([
|
|
116
|
+
this.executionEngine.notifyNewPayload(
|
|
117
|
+
ForkName.gloas,
|
|
118
|
+
envelope.message.payload,
|
|
119
|
+
payloadInput.getVersionedHashes(),
|
|
120
|
+
fromHex(protoBlock.parentRoot),
|
|
121
|
+
envelope.message.executionRequests
|
|
122
|
+
),
|
|
123
|
+
|
|
124
|
+
opts.validSignature === true
|
|
125
|
+
? Promise.resolve(true)
|
|
126
|
+
: (async () => {
|
|
127
|
+
const signatureSet = getExecutionPayloadEnvelopeSignatureSet(
|
|
128
|
+
this.config,
|
|
129
|
+
this.pubkeyCache,
|
|
130
|
+
blockState,
|
|
131
|
+
envelope,
|
|
132
|
+
payloadInput.proposerIndex
|
|
133
|
+
);
|
|
134
|
+
return this.bls.verifySignatureSets([signatureSet]);
|
|
135
|
+
})(),
|
|
136
|
+
|
|
137
|
+
// Signature verified separately above.
|
|
138
|
+
// State root check is done separately below with better error typing (matching block pipeline pattern).
|
|
139
|
+
(async () => {
|
|
140
|
+
try {
|
|
141
|
+
return {
|
|
142
|
+
postPayloadState: blockState.processExecutionPayloadEnvelope(envelope, {
|
|
143
|
+
verifySignature: false,
|
|
144
|
+
verifyStateRoot: false,
|
|
145
|
+
}),
|
|
146
|
+
};
|
|
147
|
+
} catch (e) {
|
|
148
|
+
throw new PayloadError(
|
|
149
|
+
{
|
|
150
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
151
|
+
message: (e as Error).message,
|
|
152
|
+
},
|
|
153
|
+
`State transition error: ${(e as Error).message}`
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
})(),
|
|
157
|
+
]);
|
|
158
|
+
|
|
159
|
+
// 4b. Check signature verification result
|
|
160
|
+
if (!signatureValid) {
|
|
161
|
+
throw new PayloadError({code: PayloadErrorCode.INVALID_SIGNATURE});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// 5. Handle EL response
|
|
165
|
+
switch (execResult.status) {
|
|
166
|
+
case ExecutionPayloadStatus.VALID:
|
|
167
|
+
break;
|
|
168
|
+
|
|
169
|
+
case ExecutionPayloadStatus.INVALID:
|
|
170
|
+
throw new PayloadError({
|
|
171
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_INVALID,
|
|
172
|
+
execStatus: execResult.status,
|
|
173
|
+
errorMessage: execResult.validationError ?? "",
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
case ExecutionPayloadStatus.ACCEPTED:
|
|
177
|
+
case ExecutionPayloadStatus.SYNCING:
|
|
178
|
+
break;
|
|
179
|
+
|
|
180
|
+
case ExecutionPayloadStatus.INVALID_BLOCK_HASH:
|
|
181
|
+
case ExecutionPayloadStatus.ELERROR:
|
|
182
|
+
case ExecutionPayloadStatus.UNAVAILABLE:
|
|
183
|
+
throw new PayloadError({
|
|
184
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
|
|
185
|
+
execStatus: execResult.status,
|
|
186
|
+
errorMessage: execResult.validationError ?? "",
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// 5b. Verify envelope state root matches post-state
|
|
191
|
+
const postPayloadState = postPayloadResult.postPayloadState;
|
|
192
|
+
const postPayloadStateRoot = postPayloadState.hashTreeRoot();
|
|
193
|
+
if (!byteArrayEquals(envelope.message.stateRoot, postPayloadStateRoot)) {
|
|
194
|
+
throw new PayloadError({
|
|
195
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
196
|
+
message: `Envelope state root mismatch expected=${toRootHex(envelope.message.stateRoot)} actual=${toRootHex(postPayloadStateRoot)}`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// 5c. Persist payload envelope to hot DB (performed asynchronously to avoid blocking)
|
|
201
|
+
this.unfinalizedPayloadEnvelopeWrites.push(payloadInput).catch((e) => {
|
|
202
|
+
if (!isQueueErrorAborted(e)) {
|
|
203
|
+
this.logger.error(
|
|
204
|
+
"Error pushing payload envelope to unfinalized write queue",
|
|
205
|
+
{slot: payloadInput.slot, root: blockRootHex},
|
|
206
|
+
e as Error
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// 6. Update fork choice
|
|
212
|
+
this.forkChoice.onExecutionPayload(
|
|
213
|
+
blockRootHex,
|
|
214
|
+
payloadInput.getBlockHashHex(),
|
|
215
|
+
envelope.message.payload.blockNumber,
|
|
216
|
+
toRootHex(postPayloadStateRoot),
|
|
217
|
+
toForkChoiceExecutionStatus(execResult.status)
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
// 7. Cache payload state
|
|
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
|
+
}
|
|
226
|
+
|
|
227
|
+
// 8. Record metrics for payload envelope and column sources
|
|
228
|
+
this.metrics?.importPayload.bySource.inc({source: payloadInput.getPayloadEnvelopeSource().source});
|
|
229
|
+
for (const {source} of payloadInput.getSampledColumnsWithSource()) {
|
|
230
|
+
this.metrics?.importPayload.columnsBySource.inc({source});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
this.logger.verbose("Execution payload imported", {
|
|
234
|
+
slot: payloadInput.slot,
|
|
235
|
+
root: blockRootHex,
|
|
236
|
+
blockHash: payloadInput.getBlockHashHex(),
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// 9. Emit event after payload is fully verified and imported to fork choice, only for recent enough payloads
|
|
240
|
+
const currentSlot = this.clock.currentSlot;
|
|
241
|
+
if (currentSlot - payloadInput.slot < EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS) {
|
|
242
|
+
this.emitter.emit(routes.events.EventType.executionPayloadAvailable, {
|
|
243
|
+
slot: payloadInput.slot,
|
|
244
|
+
blockRoot: blockRootHex,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
@@ -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;
|