@lodestar/beacon-node 1.41.0 → 1.42.0-dev.2fd27cd2f6
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 +0 -9
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +2 -6
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +3 -23
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -0
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +4 -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 +38 -18
- 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 +158 -0
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -0
- package/lib/chain/blocks/index.js +1 -1
- 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 +9 -2
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
- package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
- package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts +2 -2
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +4 -4
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +3 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +3 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +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/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/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 +15 -15
- 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 +0 -10
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +6 -36
- package/src/chain/archiveStore/historicalState/worker.ts +1 -0
- package/src/chain/archiveStore/interface.ts +4 -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 +58 -22
- package/src/chain/blocks/importExecutionPayload.ts +236 -0
- package/src/chain/blocks/index.ts +1 -1
- 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 +10 -2
- package/src/chain/blocks/utils/checkpoint.ts +2 -2
- package/src/chain/blocks/verifyBlock.ts +5 -10
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +5 -10
- package/src/chain/blocks/verifyBlocksSignatures.ts +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/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/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
|
@@ -7,20 +7,35 @@ import {
|
|
|
7
7
|
ForkChoiceErrorCode,
|
|
8
8
|
NotReorgedReason,
|
|
9
9
|
getSafeExecutionBlockHash,
|
|
10
|
+
isGloasBlock,
|
|
10
11
|
} from "@lodestar/fork-choice";
|
|
11
|
-
import {ForkPostAltair, ForkPostElectra, ForkSeq, MAX_SEED_LOOKAHEAD, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
12
12
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
ForkPostAltair,
|
|
14
|
+
ForkPostElectra,
|
|
15
|
+
ForkPostGloas,
|
|
16
|
+
ForkSeq,
|
|
17
|
+
MAX_SEED_LOOKAHEAD,
|
|
18
|
+
SLOTS_PER_EPOCH,
|
|
19
|
+
} from "@lodestar/params";
|
|
20
|
+
import {
|
|
21
|
+
IBeaconStateView,
|
|
15
22
|
RootCache,
|
|
16
23
|
computeEpochAtSlot,
|
|
17
24
|
computeStartSlotAtEpoch,
|
|
18
25
|
computeTimeAtSlot,
|
|
19
|
-
isExecutionStateType,
|
|
20
26
|
isStartSlotOfEpoch,
|
|
21
|
-
isStateValidatorsNodesPopulated,
|
|
22
27
|
} from "@lodestar/state-transition";
|
|
23
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
Attestation,
|
|
30
|
+
BeaconBlock,
|
|
31
|
+
SignedBeaconBlock,
|
|
32
|
+
altair,
|
|
33
|
+
capella,
|
|
34
|
+
electra,
|
|
35
|
+
isGloasBeaconBlock,
|
|
36
|
+
phase0,
|
|
37
|
+
ssz,
|
|
38
|
+
} from "@lodestar/types";
|
|
24
39
|
import {isErrorAborted, toRootHex} from "@lodestar/utils";
|
|
25
40
|
import {ZERO_HASH_HEX} from "../../constants/index.js";
|
|
26
41
|
import {callInNextEventLoop} from "../../util/eventLoop.js";
|
|
@@ -30,7 +45,7 @@ import type {BeaconChain} from "../chain.js";
|
|
|
30
45
|
import {ChainEvent, ReorgEventData} from "../emitter.js";
|
|
31
46
|
import {ForkchoiceCaller} from "../forkChoice/index.js";
|
|
32
47
|
import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_SEC} from "../reprocess.js";
|
|
33
|
-
import {
|
|
48
|
+
import {toCheckpointHexPayload} from "../stateCache/persistentCheckpointsCache.js";
|
|
34
49
|
import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
|
|
35
50
|
import {AttestationImportOpt, FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
|
|
36
51
|
import {getCheckpointFromState} from "./utils/checkpoint.js";
|
|
@@ -116,7 +131,28 @@ export async function importBlock(
|
|
|
116
131
|
|
|
117
132
|
// This adds the state necessary to process the next block
|
|
118
133
|
// Some block event handlers require state being in state cache so need to do this before emitting EventType.block
|
|
119
|
-
|
|
134
|
+
// Pre-Gloas: blockSummary.payloadStatus is always FULL, payloadPresent = true
|
|
135
|
+
// Post-Gloas: blockSummary.payloadStatus is always PENDING, so payloadPresent = false (block state only, no payload processing yet)
|
|
136
|
+
const payloadPresent = !isGloasBlock(blockSummary);
|
|
137
|
+
// processState manages both block state and payload state variants together for memory/disk management
|
|
138
|
+
this.regen.processBlockState(blockRootHex, postState);
|
|
139
|
+
|
|
140
|
+
// For Gloas blocks, create PayloadEnvelopeInput so it's available for later payload import
|
|
141
|
+
if (fork >= ForkSeq.gloas) {
|
|
142
|
+
this.seenPayloadEnvelopeInputCache.add({
|
|
143
|
+
blockRootHex,
|
|
144
|
+
block: block as SignedBeaconBlock<ForkPostGloas>,
|
|
145
|
+
sampledColumns: this.custodyConfig.sampledColumns,
|
|
146
|
+
custodyColumns: this.custodyConfig.custodyColumns,
|
|
147
|
+
timeCreatedSec: fullyVerifiedBlock.seenTimestampSec,
|
|
148
|
+
});
|
|
149
|
+
this.logger.debug("Created PayloadEnvelopeInput for block", {
|
|
150
|
+
slot: blockSlot,
|
|
151
|
+
root: blockRootHex,
|
|
152
|
+
source: source.source,
|
|
153
|
+
...(opts.seenTimestampSec !== undefined ? {recvToImport: Date.now() / 1000 - opts.seenTimestampSec} : {}),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
120
156
|
|
|
121
157
|
this.metrics?.importBlock.bySource.inc({source: source.source});
|
|
122
158
|
this.logger.verbose("Added block to forkchoice and state cache", {slot: blockSlot, root: blockRootHex});
|
|
@@ -149,7 +185,7 @@ export async function importBlock(
|
|
|
149
185
|
const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
|
|
150
186
|
addAttestation.call(
|
|
151
187
|
this,
|
|
152
|
-
postState
|
|
188
|
+
postState,
|
|
153
189
|
target,
|
|
154
190
|
attDataRoot,
|
|
155
191
|
attestation as Attestation<ForkPostElectra>,
|
|
@@ -336,7 +372,7 @@ export async function importBlock(
|
|
|
336
372
|
try {
|
|
337
373
|
this.lightClientServer?.onImportBlockHead(
|
|
338
374
|
block.message as BeaconBlock<ForkPostAltair>,
|
|
339
|
-
postState
|
|
375
|
+
postState,
|
|
340
376
|
parentBlockSlot
|
|
341
377
|
);
|
|
342
378
|
} catch (e) {
|
|
@@ -357,11 +393,11 @@ export async function importBlock(
|
|
|
357
393
|
// and the block is weak and can potentially be reorged out.
|
|
358
394
|
let shouldOverrideFcu = false;
|
|
359
395
|
|
|
360
|
-
if (blockSlot >= currentSlot && isExecutionStateType
|
|
396
|
+
if (blockSlot >= currentSlot && postState.isExecutionStateType) {
|
|
361
397
|
let notOverrideFcuReason = NotReorgedReason.Unknown;
|
|
362
398
|
const proposalSlot = blockSlot + 1;
|
|
363
399
|
try {
|
|
364
|
-
const proposerIndex = postState.
|
|
400
|
+
const proposerIndex = postState.getBeaconProposer(proposalSlot);
|
|
365
401
|
const feeRecipient = this.beaconProposerCache.get(proposerIndex);
|
|
366
402
|
|
|
367
403
|
if (feeRecipient) {
|
|
@@ -441,7 +477,7 @@ export async function importBlock(
|
|
|
441
477
|
}
|
|
442
478
|
}
|
|
443
479
|
|
|
444
|
-
if (!isStateValidatorsNodesPopulated(
|
|
480
|
+
if (!postState.isStateValidatorsNodesPopulated()) {
|
|
445
481
|
this.logger.verbose("After importBlock caching postState without SSZ cache", {slot: postState.slot});
|
|
446
482
|
}
|
|
447
483
|
|
|
@@ -456,14 +492,14 @@ export async function importBlock(
|
|
|
456
492
|
// Cache state to preserve epoch transition work
|
|
457
493
|
const checkpointState = postState;
|
|
458
494
|
const cp = getCheckpointFromState(checkpointState);
|
|
459
|
-
this.regen.addCheckpointState(cp, checkpointState);
|
|
495
|
+
this.regen.addCheckpointState(cp, checkpointState, payloadPresent);
|
|
460
496
|
// consumers should not mutate state ever
|
|
461
497
|
this.emitter.emit(ChainEvent.checkpoint, cp, checkpointState);
|
|
462
498
|
|
|
463
499
|
// Note: in-lined code from previos handler of ChainEvent.checkpoint
|
|
464
|
-
this.logger.verbose("Checkpoint processed",
|
|
500
|
+
this.logger.verbose("Checkpoint processed", toCheckpointHexPayload(cp, payloadPresent));
|
|
465
501
|
|
|
466
|
-
const activeValidatorsCount = checkpointState.
|
|
502
|
+
const activeValidatorsCount = checkpointState.activeValidatorCount;
|
|
467
503
|
this.metrics?.currentActiveValidators.set(activeValidatorsCount);
|
|
468
504
|
this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
|
|
469
505
|
|
|
@@ -479,7 +515,7 @@ export async function importBlock(
|
|
|
479
515
|
const justifiedEpoch = justifiedCheckpoint.epoch;
|
|
480
516
|
const preJustifiedEpoch = parentBlockSummary.justifiedEpoch;
|
|
481
517
|
if (justifiedEpoch > preJustifiedEpoch) {
|
|
482
|
-
this.logger.verbose("Checkpoint justified",
|
|
518
|
+
this.logger.verbose("Checkpoint justified", toCheckpointHexPayload(justifiedCheckpoint, payloadPresent));
|
|
483
519
|
this.metrics?.previousJustifiedEpoch.set(checkpointState.previousJustifiedCheckpoint.epoch);
|
|
484
520
|
this.metrics?.currentJustifiedEpoch.set(justifiedCheckpoint.epoch);
|
|
485
521
|
}
|
|
@@ -493,7 +529,7 @@ export async function importBlock(
|
|
|
493
529
|
state: toRootHex(checkpointState.hashTreeRoot()),
|
|
494
530
|
executionOptimistic: false,
|
|
495
531
|
});
|
|
496
|
-
this.logger.verbose("Checkpoint finalized",
|
|
532
|
+
this.logger.verbose("Checkpoint finalized", toCheckpointHexPayload(finalizedCheckpoint, payloadPresent));
|
|
497
533
|
this.metrics?.finalizedEpoch.set(finalizedCheckpoint.epoch);
|
|
498
534
|
}
|
|
499
535
|
}
|
|
@@ -548,7 +584,7 @@ export async function importBlock(
|
|
|
548
584
|
this.validatorMonitor?.registerSyncAggregateInBlock(
|
|
549
585
|
blockEpoch,
|
|
550
586
|
(block as altair.SignedBeaconBlock).message.body.syncAggregate,
|
|
551
|
-
fullyVerifiedBlock.postState.
|
|
587
|
+
fullyVerifiedBlock.postState.currentSyncCommitteeIndexed.validatorIndices
|
|
552
588
|
);
|
|
553
589
|
}
|
|
554
590
|
|
|
@@ -590,7 +626,7 @@ export async function importBlock(
|
|
|
590
626
|
export function addAttestationPreElectra(
|
|
591
627
|
this: BeaconChain,
|
|
592
628
|
// added to have the same signature as addAttestationPostElectra
|
|
593
|
-
_:
|
|
629
|
+
_: IBeaconStateView,
|
|
594
630
|
target: phase0.Checkpoint,
|
|
595
631
|
attDataRoot: string,
|
|
596
632
|
attestation: Attestation,
|
|
@@ -607,7 +643,7 @@ export function addAttestationPreElectra(
|
|
|
607
643
|
|
|
608
644
|
export function addAttestationPostElectra(
|
|
609
645
|
this: BeaconChain,
|
|
610
|
-
|
|
646
|
+
state: IBeaconStateView,
|
|
611
647
|
target: phase0.Checkpoint,
|
|
612
648
|
attDataRoot: string,
|
|
613
649
|
attestation: Attestation<ForkPostElectra>,
|
|
@@ -625,7 +661,7 @@ export function addAttestationPostElectra(
|
|
|
625
661
|
} else {
|
|
626
662
|
const attSlot = attestation.data.slot;
|
|
627
663
|
const attEpoch = computeEpochAtSlot(attSlot);
|
|
628
|
-
const decisionRoot =
|
|
664
|
+
const decisionRoot = state.getShufflingDecisionRoot(attEpoch);
|
|
629
665
|
const committees = this.shufflingCache.getBeaconCommittees(attEpoch, decisionRoot, attSlot, committeeIndices);
|
|
630
666
|
const aggregationBools = attestation.aggregationBits.toBoolArray();
|
|
631
667
|
let offset = 0;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import {routes} from "@lodestar/api";
|
|
2
|
+
import {ForkName} from "@lodestar/params";
|
|
3
|
+
import {getExecutionPayloadEnvelopeSignatureSet} from "@lodestar/state-transition";
|
|
4
|
+
import {byteArrayEquals, fromHex, toRootHex} from "@lodestar/utils";
|
|
5
|
+
import {ExecutionPayloadStatus} from "../../execution/index.js";
|
|
6
|
+
import {isQueueErrorAborted} from "../../util/queue/index.js";
|
|
7
|
+
import {BeaconChain} from "../chain.js";
|
|
8
|
+
import {RegenCaller} from "../regen/interface.js";
|
|
9
|
+
import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
|
|
10
|
+
import {ImportPayloadOpts} from "./types.js";
|
|
11
|
+
|
|
12
|
+
const EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS = 64;
|
|
13
|
+
|
|
14
|
+
export enum PayloadErrorCode {
|
|
15
|
+
EXECUTION_ENGINE_INVALID = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID",
|
|
16
|
+
EXECUTION_ENGINE_ERROR = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR",
|
|
17
|
+
BLOCK_NOT_IN_FORK_CHOICE = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE",
|
|
18
|
+
STATE_TRANSITION_ERROR = "PAYLOAD_ERROR_STATE_TRANSITION_ERROR",
|
|
19
|
+
INVALID_SIGNATURE = "PAYLOAD_ERROR_INVALID_SIGNATURE",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type PayloadErrorType =
|
|
23
|
+
| {
|
|
24
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_INVALID;
|
|
25
|
+
execStatus: ExecutionPayloadStatus;
|
|
26
|
+
errorMessage: string;
|
|
27
|
+
}
|
|
28
|
+
| {
|
|
29
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR;
|
|
30
|
+
execStatus: ExecutionPayloadStatus;
|
|
31
|
+
errorMessage: string;
|
|
32
|
+
}
|
|
33
|
+
| {
|
|
34
|
+
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE;
|
|
35
|
+
blockRootHex: string;
|
|
36
|
+
}
|
|
37
|
+
| {
|
|
38
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR;
|
|
39
|
+
message: string;
|
|
40
|
+
}
|
|
41
|
+
| {
|
|
42
|
+
code: PayloadErrorCode.INVALID_SIGNATURE;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export class PayloadError extends Error {
|
|
46
|
+
type: PayloadErrorType;
|
|
47
|
+
|
|
48
|
+
constructor(type: PayloadErrorType, message?: string) {
|
|
49
|
+
super(message ?? type.code);
|
|
50
|
+
this.type = type;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Import an execution payload envelope after all data is available.
|
|
56
|
+
*
|
|
57
|
+
* This function:
|
|
58
|
+
* 1. Gets the ProtoBlock from fork choice
|
|
59
|
+
* 2. Applies write-queue backpressure (waitForSpace) early, before verification
|
|
60
|
+
* 3. Regenerates the block state
|
|
61
|
+
* 4. Runs EL verification (notifyNewPayload) in parallel with signature verification and processExecutionPayloadEnvelope
|
|
62
|
+
* 5. Persists verified payload envelope to hot DB
|
|
63
|
+
* 6. Updates fork choice
|
|
64
|
+
* 7. Caches the post-execution payload state
|
|
65
|
+
* 8. Records metrics for column sources
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
68
|
+
export async function importExecutionPayload(
|
|
69
|
+
this: BeaconChain,
|
|
70
|
+
payloadInput: PayloadEnvelopeInput,
|
|
71
|
+
opts: ImportPayloadOpts = {}
|
|
72
|
+
): Promise<void> {
|
|
73
|
+
const envelope = payloadInput.getPayloadEnvelope();
|
|
74
|
+
const blockRootHex = payloadInput.blockRootHex;
|
|
75
|
+
|
|
76
|
+
// 1. Get ProtoBlock for parent root lookup
|
|
77
|
+
const protoBlock = this.forkChoice.getBlockHexDefaultStatus(blockRootHex);
|
|
78
|
+
if (!protoBlock) {
|
|
79
|
+
throw new PayloadError({
|
|
80
|
+
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE,
|
|
81
|
+
blockRootHex,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 2. Apply backpressure from the write queue early, before doing verification work.
|
|
86
|
+
// The actual DB write is deferred until after verification succeeds.
|
|
87
|
+
await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
|
|
88
|
+
|
|
89
|
+
// 3. Get pre-state for processExecutionPayloadEnvelope
|
|
90
|
+
// We need the block state (post-block, pre-payload) to process the envelope
|
|
91
|
+
const blockState = await this.regen.getBlockSlotState(
|
|
92
|
+
protoBlock,
|
|
93
|
+
protoBlock.slot,
|
|
94
|
+
{dontTransferCache: true},
|
|
95
|
+
RegenCaller.processBlock
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
// 4. Run verification steps in parallel
|
|
99
|
+
// Note: No data availability check needed here - importExecutionPayload is only
|
|
100
|
+
// called when payloadInput.isComplete() is true, so all data is already available.
|
|
101
|
+
const [execResult, signatureValid, postPayloadResult] = await Promise.all([
|
|
102
|
+
this.executionEngine.notifyNewPayload(
|
|
103
|
+
ForkName.gloas,
|
|
104
|
+
envelope.message.payload,
|
|
105
|
+
payloadInput.getVersionedHashes(),
|
|
106
|
+
fromHex(protoBlock.parentRoot),
|
|
107
|
+
envelope.message.executionRequests
|
|
108
|
+
),
|
|
109
|
+
|
|
110
|
+
opts.validSignature === true
|
|
111
|
+
? Promise.resolve(true)
|
|
112
|
+
: (async () => {
|
|
113
|
+
const signatureSet = getExecutionPayloadEnvelopeSignatureSet(
|
|
114
|
+
this.config,
|
|
115
|
+
this.pubkeyCache,
|
|
116
|
+
blockState,
|
|
117
|
+
envelope,
|
|
118
|
+
payloadInput.proposerIndex
|
|
119
|
+
);
|
|
120
|
+
return this.bls.verifySignatureSets([signatureSet]);
|
|
121
|
+
})(),
|
|
122
|
+
|
|
123
|
+
// Signature verified separately above.
|
|
124
|
+
// State root check is done separately below with better error typing (matching block pipeline pattern).
|
|
125
|
+
(async () => {
|
|
126
|
+
try {
|
|
127
|
+
return {
|
|
128
|
+
postPayloadState: blockState.processExecutionPayloadEnvelope(envelope, {
|
|
129
|
+
verifySignature: false,
|
|
130
|
+
verifyStateRoot: false,
|
|
131
|
+
}),
|
|
132
|
+
};
|
|
133
|
+
} catch (e) {
|
|
134
|
+
throw new PayloadError(
|
|
135
|
+
{
|
|
136
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
137
|
+
message: (e as Error).message,
|
|
138
|
+
},
|
|
139
|
+
`State transition error: ${(e as Error).message}`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
})(),
|
|
143
|
+
]);
|
|
144
|
+
|
|
145
|
+
// 4b. Check signature verification result
|
|
146
|
+
if (!signatureValid) {
|
|
147
|
+
throw new PayloadError({code: PayloadErrorCode.INVALID_SIGNATURE});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// 5. Handle EL response
|
|
151
|
+
switch (execResult.status) {
|
|
152
|
+
case ExecutionPayloadStatus.VALID:
|
|
153
|
+
break;
|
|
154
|
+
|
|
155
|
+
case ExecutionPayloadStatus.INVALID:
|
|
156
|
+
throw new PayloadError({
|
|
157
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_INVALID,
|
|
158
|
+
execStatus: execResult.status,
|
|
159
|
+
errorMessage: execResult.validationError ?? "",
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
case ExecutionPayloadStatus.ACCEPTED:
|
|
163
|
+
case ExecutionPayloadStatus.SYNCING:
|
|
164
|
+
// TODO GLOAS: Handle optimistic import for payload - for now treat as error
|
|
165
|
+
throw new PayloadError({
|
|
166
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
|
|
167
|
+
execStatus: execResult.status,
|
|
168
|
+
errorMessage: execResult.validationError ?? "EL syncing, payload not yet validated",
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
case ExecutionPayloadStatus.INVALID_BLOCK_HASH:
|
|
172
|
+
case ExecutionPayloadStatus.ELERROR:
|
|
173
|
+
case ExecutionPayloadStatus.UNAVAILABLE:
|
|
174
|
+
throw new PayloadError({
|
|
175
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
|
|
176
|
+
execStatus: execResult.status,
|
|
177
|
+
errorMessage: execResult.validationError ?? "",
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// 5b. Verify envelope state root matches post-state
|
|
182
|
+
const postPayloadState = postPayloadResult.postPayloadState;
|
|
183
|
+
const postPayloadStateRoot = postPayloadState.hashTreeRoot();
|
|
184
|
+
if (!byteArrayEquals(envelope.message.stateRoot, postPayloadStateRoot)) {
|
|
185
|
+
throw new PayloadError({
|
|
186
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
187
|
+
message: `Envelope state root mismatch expected=${toRootHex(envelope.message.stateRoot)} actual=${toRootHex(postPayloadStateRoot)}`,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// 5c. Persist payload envelope to hot DB (performed asynchronously to avoid blocking)
|
|
192
|
+
this.unfinalizedPayloadEnvelopeWrites.push(payloadInput).catch((e) => {
|
|
193
|
+
if (!isQueueErrorAborted(e)) {
|
|
194
|
+
this.logger.error(
|
|
195
|
+
"Error pushing payload envelope to unfinalized write queue",
|
|
196
|
+
{slot: payloadInput.slot, root: blockRootHex},
|
|
197
|
+
e as Error
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// 6. Update fork choice
|
|
203
|
+
this.forkChoice.onExecutionPayload(
|
|
204
|
+
blockRootHex,
|
|
205
|
+
payloadInput.getBlockHashHex(),
|
|
206
|
+
envelope.message.payload.blockNumber,
|
|
207
|
+
toRootHex(postPayloadStateRoot)
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
// 7. Cache payload state
|
|
211
|
+
// TODO GLOAS: Enable when PR #8868 merged (adds processPayloadState)
|
|
212
|
+
// this.regen.processPayloadState(postPayloadState);
|
|
213
|
+
// if epoch boundary also call
|
|
214
|
+
// this.regen.addCheckpointState(cp, checkpointState, true);
|
|
215
|
+
|
|
216
|
+
// 8. Record metrics for payload envelope and column sources
|
|
217
|
+
this.metrics?.importPayload.bySource.inc({source: payloadInput.getPayloadEnvelopeSource().source});
|
|
218
|
+
for (const {source} of payloadInput.getSampledColumnsWithSource()) {
|
|
219
|
+
this.metrics?.importPayload.columnsBySource.inc({source});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
this.logger.verbose("Execution payload imported", {
|
|
223
|
+
slot: payloadInput.slot,
|
|
224
|
+
root: blockRootHex,
|
|
225
|
+
blockHash: payloadInput.getBlockHashHex(),
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// 9. Emit event after payload is fully verified and imported to fork choice, only for recent enough payloads
|
|
229
|
+
const currentSlot = this.clock.currentSlot;
|
|
230
|
+
if (currentSlot - payloadInput.slot < EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS) {
|
|
231
|
+
this.emitter.emit(routes.events.EventType.executionPayloadAvailable, {
|
|
232
|
+
slot: payloadInput.slot,
|
|
233
|
+
blockRoot: blockRootHex,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
@@ -126,7 +126,7 @@ export async function processBlocks(
|
|
|
126
126
|
const {state} = err.type;
|
|
127
127
|
const forkTypes = this.config.getForkTypes(blockSlot);
|
|
128
128
|
this.persistInvalidSszValue(forkTypes.SignedBeaconBlock, signedBlock, `${blockSlot}_invalid_signature`);
|
|
129
|
-
this.
|
|
129
|
+
this.persistInvalidSszBytes("BeaconState", state.serialize(), `${state.slot}_invalid_signature`);
|
|
130
130
|
} else if (err.type.code === BlockErrorCode.INVALID_STATE_ROOT) {
|
|
131
131
|
const {signedBlock} = err;
|
|
132
132
|
const blockSlot = signedBlock.message.slot;
|