@lodestar/beacon-node 1.42.0-dev.4411584fd8 → 1.42.0-dev.4e640bd2f7
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 +49 -18
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +1 -1
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/index.js +27 -32
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +4 -4
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +7 -10
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/lodestar/index.d.ts.map +1 -1
- package/lib/api/impl/lodestar/index.js +4 -6
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/proof/index.d.ts.map +1 -1
- package/lib/api/impl/proof/index.js +2 -6
- package/lib/api/impl/proof/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +27 -27
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +2 -2
- package/lib/api/impl/validator/utils.d.ts.map +1 -1
- package/lib/api/impl/validator/utils.js +3 -3
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
- package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
- package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/worker.js +1 -3
- package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +1 -0
- package/lib/chain/archiveStore/interface.d.ts.map +1 -1
- package/lib/chain/balancesCache.d.ts +2 -2
- package/lib/chain/balancesCache.d.ts.map +1 -1
- package/lib/chain/balancesCache.js +4 -4
- package/lib/chain/balancesCache.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +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 +39 -23
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +50 -0
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -0
- package/lib/chain/blocks/importExecutionPayload.js +186 -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 +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/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 +19 -14
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +75 -42
- 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 +17 -15
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/lightClient/index.d.ts +2 -2
- package/lib/chain/lightClient/index.d.ts.map +1 -1
- package/lib/chain/lightClient/index.js +4 -4
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +10 -13
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/opPool.d.ts +3 -3
- package/lib/chain/opPools/opPool.d.ts.map +1 -1
- package/lib/chain/opPools/opPool.js +7 -7
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +2 -2
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +1 -0
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +2 -2
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +3 -3
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +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 +12 -16
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +15 -13
- 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 +14 -14
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +6 -5
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +6 -6
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/seenCache/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/fifoBlockStateCache.d.ts +6 -6
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +14 -14
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +3 -3
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/blobSidecar.js +1 -1
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +3 -3
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/blsToExecutionChange.js +2 -2
- package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +1 -1
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +4 -4
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +29 -19
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +1 -2
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
- package/lib/chain/validation/syncCommittee.d.ts +4 -4
- package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/syncCommittee.js +13 -12
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +3 -3
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +5 -4
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +12 -7
- package/lib/chain/validatorMonitor.js.map +1 -1
- 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 +22 -11
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +4 -2
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +9 -3
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +7 -2
- package/lib/network/options.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +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 +49 -12
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/index.d.ts +12 -7
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +99 -78
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +9 -0
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +11 -1
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +2 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +10 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +8 -0
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +2 -0
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +8 -2
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +7 -1
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/node/nodejs.d.ts +2 -2
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +1 -4
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.d.ts.map +1 -1
- package/lib/node/notifier.js +3 -3
- package/lib/node/notifier.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts +2 -2
- package/lib/sync/backfill/backfill.d.ts.map +1 -1
- package/lib/sync/backfill/backfill.js +2 -2
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +3 -9
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +8 -41
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/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 +52 -19
- package/src/api/impl/beacon/pool/index.ts +1 -1
- package/src/api/impl/beacon/state/index.ts +29 -41
- package/src/api/impl/beacon/state/utils.ts +11 -25
- package/src/api/impl/lodestar/index.ts +4 -8
- package/src/api/impl/proof/index.ts +2 -9
- package/src/api/impl/validator/index.ts +29 -41
- package/src/api/impl/validator/utils.ts +4 -7
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
- package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
- package/src/chain/archiveStore/historicalState/types.ts +2 -0
- package/src/chain/archiveStore/historicalState/worker.ts +1 -4
- package/src/chain/archiveStore/interface.ts +1 -0
- package/src/chain/balancesCache.ts +5 -11
- package/src/chain/blocks/blockInput/types.ts +4 -3
- package/src/chain/blocks/importBlock.ts +59 -27
- package/src/chain/blocks/importExecutionPayload.ts +267 -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 +3 -3
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
- package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +55 -0
- package/src/chain/chain.ts +112 -70
- 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 +18 -16
- package/src/chain/lightClient/index.ts +9 -22
- package/src/chain/opPools/aggregatedAttestationPool.ts +15 -21
- package/src/chain/opPools/opPool.ts +13 -14
- package/src/chain/opPools/utils.ts +3 -3
- package/src/chain/options.ts +2 -0
- package/src/chain/prepareNextSlot.ts +6 -8
- package/src/chain/produceBlock/computeNewStateRoot.ts +11 -10
- package/src/chain/produceBlock/produceBlockBody.ts +22 -49
- package/src/chain/regen/interface.ts +15 -17
- package/src/chain/regen/queued.ts +16 -20
- package/src/chain/regen/regen.ts +16 -17
- 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/fifoBlockStateCache.ts +7 -7
- package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
- package/src/chain/stateCache/types.ts +14 -18
- package/src/chain/validation/attesterSlashing.ts +3 -3
- package/src/chain/validation/blobSidecar.ts +1 -1
- package/src/chain/validation/block.ts +2 -4
- package/src/chain/validation/blsToExecutionChange.ts +2 -2
- package/src/chain/validation/dataColumnSidecar.ts +1 -1
- package/src/chain/validation/executionPayloadBid.ts +3 -7
- package/src/chain/validation/executionPayloadEnvelope.ts +36 -29
- package/src/chain/validation/payloadAttestationMessage.ts +2 -4
- package/src/chain/validation/proposerSlashing.ts +1 -1
- package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
- package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
- package/src/chain/validation/syncCommittee.ts +21 -20
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -10
- package/src/chain/validation/voluntaryExit.ts +3 -8
- package/src/chain/validatorMonitor.ts +22 -11
- 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 +24 -13
- package/src/network/network.ts +32 -4
- package/src/network/options.ts +7 -2
- package/src/network/processor/extractSlotRootFns.ts +19 -6
- package/src/network/processor/gossipHandlers.ts +56 -11
- package/src/network/processor/index.ts +110 -89
- package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
- package/src/network/reqresp/handlers/index.ts +12 -0
- package/src/network/reqresp/protocols.ts +12 -0
- package/src/network/reqresp/rateLimit.ts +18 -0
- package/src/network/reqresp/score.ts +2 -0
- package/src/network/reqresp/types.ts +13 -0
- package/src/node/nodejs.ts +3 -5
- package/src/node/notifier.ts +4 -10
- package/src/sync/backfill/backfill.ts +3 -3
- package/src/sync/unknownBlock.ts +10 -50
- package/src/util/sszBytes.ts +90 -10
- package/src/util/types.ts +6 -0
- 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/seenCache/seenExecutionPayloadEnvelope.ts +0 -34
|
@@ -3,25 +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,
|
|
10
11
|
isGloasBlock,
|
|
11
12
|
} from "@lodestar/fork-choice";
|
|
12
|
-
import {ForkPostAltair, ForkPostElectra, ForkSeq, MAX_SEED_LOOKAHEAD, SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
13
13
|
import {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
ForkPostAltair,
|
|
15
|
+
ForkPostElectra,
|
|
16
|
+
ForkPostGloas,
|
|
17
|
+
ForkSeq,
|
|
18
|
+
MAX_SEED_LOOKAHEAD,
|
|
19
|
+
SLOTS_PER_EPOCH,
|
|
20
|
+
} from "@lodestar/params";
|
|
21
|
+
import {
|
|
22
|
+
IBeaconStateView,
|
|
16
23
|
RootCache,
|
|
17
24
|
computeEpochAtSlot,
|
|
18
25
|
computeStartSlotAtEpoch,
|
|
19
26
|
computeTimeAtSlot,
|
|
20
|
-
isExecutionStateType,
|
|
21
27
|
isStartSlotOfEpoch,
|
|
22
|
-
isStateValidatorsNodesPopulated,
|
|
23
28
|
} from "@lodestar/state-transition";
|
|
24
|
-
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";
|
|
25
40
|
import {isErrorAborted, toRootHex} from "@lodestar/utils";
|
|
26
41
|
import {ZERO_HASH_HEX} from "../../constants/index.js";
|
|
27
42
|
import {callInNextEventLoop} from "../../util/eventLoop.js";
|
|
@@ -70,7 +85,7 @@ export async function importBlock(
|
|
|
70
85
|
fullyVerifiedBlock: FullyVerifiedBlock,
|
|
71
86
|
opts: ImportBlockOpts
|
|
72
87
|
): Promise<void> {
|
|
73
|
-
const {blockInput,
|
|
88
|
+
const {blockInput, postBlockState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
|
|
74
89
|
fullyVerifiedBlock;
|
|
75
90
|
const block = blockInput.getBlock();
|
|
76
91
|
const source = blockInput.getBlockSource();
|
|
@@ -82,7 +97,7 @@ export async function importBlock(
|
|
|
82
97
|
const blockEpoch = computeEpochAtSlot(blockSlot);
|
|
83
98
|
const prevFinalizedEpoch = this.forkChoice.getFinalizedCheckpoint().epoch;
|
|
84
99
|
const blockDelaySec =
|
|
85
|
-
fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot,
|
|
100
|
+
fullyVerifiedBlock.seenTimestampSec - computeTimeAtSlot(this.config, blockSlot, postBlockState.genesisTime);
|
|
86
101
|
const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
|
|
87
102
|
const fork = this.config.getForkSeq(blockSlot);
|
|
88
103
|
|
|
@@ -105,13 +120,13 @@ export async function importBlock(
|
|
|
105
120
|
// 2. Import block to fork choice
|
|
106
121
|
|
|
107
122
|
// Should compute checkpoint balances before forkchoice.onBlock
|
|
108
|
-
this.checkpointBalancesCache.processState(blockRootHex,
|
|
123
|
+
this.checkpointBalancesCache.processState(blockRootHex, postBlockState);
|
|
109
124
|
const blockSummary = this.forkChoice.onBlock(
|
|
110
125
|
block.message,
|
|
111
|
-
|
|
126
|
+
postBlockState,
|
|
112
127
|
blockDelaySec,
|
|
113
128
|
currentSlot,
|
|
114
|
-
executionStatus,
|
|
129
|
+
fork >= ForkSeq.gloas ? ExecutionStatus.PayloadSeparated : executionStatus,
|
|
115
130
|
dataAvailabilityStatus
|
|
116
131
|
);
|
|
117
132
|
|
|
@@ -121,7 +136,24 @@ export async function importBlock(
|
|
|
121
136
|
// Post-Gloas: blockSummary.payloadStatus is always PENDING, so payloadPresent = false (block state only, no payload processing yet)
|
|
122
137
|
const payloadPresent = !isGloasBlock(blockSummary);
|
|
123
138
|
// processState manages both block state and payload state variants together for memory/disk management
|
|
124
|
-
this.regen.processBlockState(blockRootHex,
|
|
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
|
+
}
|
|
125
157
|
|
|
126
158
|
this.metrics?.importBlock.bySource.inc({source: source.source});
|
|
127
159
|
this.logger.verbose("Added block to forkchoice and state cache", {slot: blockSlot, root: blockRootHex});
|
|
@@ -140,7 +172,7 @@ export async function importBlock(
|
|
|
140
172
|
(opts.importAttestations !== AttestationImportOpt.Skip && blockEpoch >= currentEpoch - FORK_CHOICE_ATT_EPOCH_LIMIT)
|
|
141
173
|
) {
|
|
142
174
|
const attestations = block.message.body.attestations;
|
|
143
|
-
const rootCache = new RootCache(
|
|
175
|
+
const rootCache = new RootCache(postBlockState);
|
|
144
176
|
const invalidAttestationErrorsByCode = new Map<string, {error: Error; count: number}>();
|
|
145
177
|
|
|
146
178
|
const addAttestation = fork >= ForkSeq.electra ? addAttestationPostElectra : addAttestationPreElectra;
|
|
@@ -154,7 +186,7 @@ export async function importBlock(
|
|
|
154
186
|
const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
|
|
155
187
|
addAttestation.call(
|
|
156
188
|
this,
|
|
157
|
-
|
|
189
|
+
postBlockState,
|
|
158
190
|
target,
|
|
159
191
|
attDataRoot,
|
|
160
192
|
attestation as Attestation<ForkPostElectra>,
|
|
@@ -269,7 +301,7 @@ export async function importBlock(
|
|
|
269
301
|
|
|
270
302
|
if (newHead.blockRoot !== oldHead.blockRoot) {
|
|
271
303
|
// Set head state as strong reference
|
|
272
|
-
this.regen.updateHeadState(newHead,
|
|
304
|
+
this.regen.updateHeadState(newHead, postBlockState);
|
|
273
305
|
|
|
274
306
|
try {
|
|
275
307
|
this.emitter.emit(routes.events.EventType.head, {
|
|
@@ -341,7 +373,7 @@ export async function importBlock(
|
|
|
341
373
|
try {
|
|
342
374
|
this.lightClientServer?.onImportBlockHead(
|
|
343
375
|
block.message as BeaconBlock<ForkPostAltair>,
|
|
344
|
-
|
|
376
|
+
postBlockState,
|
|
345
377
|
parentBlockSlot
|
|
346
378
|
);
|
|
347
379
|
} catch (e) {
|
|
@@ -362,11 +394,11 @@ export async function importBlock(
|
|
|
362
394
|
// and the block is weak and can potentially be reorged out.
|
|
363
395
|
let shouldOverrideFcu = false;
|
|
364
396
|
|
|
365
|
-
if (blockSlot >= currentSlot && isExecutionStateType
|
|
397
|
+
if (blockSlot >= currentSlot && postBlockState.isExecutionStateType) {
|
|
366
398
|
let notOverrideFcuReason = NotReorgedReason.Unknown;
|
|
367
399
|
const proposalSlot = blockSlot + 1;
|
|
368
400
|
try {
|
|
369
|
-
const proposerIndex =
|
|
401
|
+
const proposerIndex = postBlockState.getBeaconProposer(proposalSlot);
|
|
370
402
|
const feeRecipient = this.beaconProposerCache.get(proposerIndex);
|
|
371
403
|
|
|
372
404
|
if (feeRecipient) {
|
|
@@ -446,20 +478,20 @@ export async function importBlock(
|
|
|
446
478
|
}
|
|
447
479
|
}
|
|
448
480
|
|
|
449
|
-
if (!isStateValidatorsNodesPopulated(
|
|
450
|
-
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});
|
|
451
483
|
}
|
|
452
484
|
|
|
453
485
|
// Cache shufflings when crossing an epoch boundary
|
|
454
486
|
const parentEpoch = computeEpochAtSlot(parentBlockSlot);
|
|
455
487
|
if (parentEpoch < blockEpoch) {
|
|
456
|
-
this.shufflingCache.processState(
|
|
488
|
+
this.shufflingCache.processState(postBlockState);
|
|
457
489
|
this.logger.verbose("Processed shuffling for next epoch", {parentEpoch, blockEpoch, slot: blockSlot});
|
|
458
490
|
}
|
|
459
491
|
|
|
460
492
|
if (blockSlot % SLOTS_PER_EPOCH === 0) {
|
|
461
493
|
// Cache state to preserve epoch transition work
|
|
462
|
-
const checkpointState =
|
|
494
|
+
const checkpointState = postBlockState;
|
|
463
495
|
const cp = getCheckpointFromState(checkpointState);
|
|
464
496
|
this.regen.addCheckpointState(cp, checkpointState, payloadPresent);
|
|
465
497
|
// consumers should not mutate state ever
|
|
@@ -468,7 +500,7 @@ export async function importBlock(
|
|
|
468
500
|
// Note: in-lined code from previos handler of ChainEvent.checkpoint
|
|
469
501
|
this.logger.verbose("Checkpoint processed", toCheckpointHexPayload(cp, payloadPresent));
|
|
470
502
|
|
|
471
|
-
const activeValidatorsCount = checkpointState.
|
|
503
|
+
const activeValidatorsCount = checkpointState.activeValidatorCount;
|
|
472
504
|
this.metrics?.currentActiveValidators.set(activeValidatorsCount);
|
|
473
505
|
this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
|
|
474
506
|
|
|
@@ -553,7 +585,7 @@ export async function importBlock(
|
|
|
553
585
|
this.validatorMonitor?.registerSyncAggregateInBlock(
|
|
554
586
|
blockEpoch,
|
|
555
587
|
(block as altair.SignedBeaconBlock).message.body.syncAggregate,
|
|
556
|
-
fullyVerifiedBlock.
|
|
588
|
+
fullyVerifiedBlock.postBlockState.currentSyncCommitteeIndexed.validatorIndices
|
|
557
589
|
);
|
|
558
590
|
}
|
|
559
591
|
|
|
@@ -595,7 +627,7 @@ export async function importBlock(
|
|
|
595
627
|
export function addAttestationPreElectra(
|
|
596
628
|
this: BeaconChain,
|
|
597
629
|
// added to have the same signature as addAttestationPostElectra
|
|
598
|
-
_:
|
|
630
|
+
_: IBeaconStateView,
|
|
599
631
|
target: phase0.Checkpoint,
|
|
600
632
|
attDataRoot: string,
|
|
601
633
|
attestation: Attestation,
|
|
@@ -612,7 +644,7 @@ export function addAttestationPreElectra(
|
|
|
612
644
|
|
|
613
645
|
export function addAttestationPostElectra(
|
|
614
646
|
this: BeaconChain,
|
|
615
|
-
|
|
647
|
+
state: IBeaconStateView,
|
|
616
648
|
target: phase0.Checkpoint,
|
|
617
649
|
attDataRoot: string,
|
|
618
650
|
attestation: Attestation<ForkPostElectra>,
|
|
@@ -630,7 +662,7 @@ export function addAttestationPostElectra(
|
|
|
630
662
|
} else {
|
|
631
663
|
const attSlot = attestation.data.slot;
|
|
632
664
|
const attEpoch = computeEpochAtSlot(attSlot);
|
|
633
|
-
const decisionRoot =
|
|
665
|
+
const decisionRoot = state.getShufflingDecisionRoot(attEpoch);
|
|
634
666
|
const committees = this.shufflingCache.getBeaconCommittees(attEpoch, decisionRoot, attSlot, committeeIndices);
|
|
635
667
|
const aggregationBools = attestation.aggregationBits.toBoolArray();
|
|
636
668
|
let offset = 0;
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import {routes} from "@lodestar/api";
|
|
2
|
+
import {ExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
|
|
3
|
+
import {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. Emits `execution_payload_available` if payload is for current slot
|
|
73
|
+
* 2. Gets the ProtoBlock from fork choice
|
|
74
|
+
* 3. Applies write-queue backpressure (waitForSpace) early, before verification
|
|
75
|
+
* 4. Regenerates the block state
|
|
76
|
+
* 5. Runs EL verification (notifyNewPayload) in parallel with signature verification and processExecutionPayloadEnvelope
|
|
77
|
+
* 6. Persists verified payload envelope to hot DB
|
|
78
|
+
* 7. Updates fork choice
|
|
79
|
+
* 8. Caches the post-execution payload state
|
|
80
|
+
* 9. Records metrics for column sources
|
|
81
|
+
* 10. Emits `execution_payload` for recent enough payloads after successful import
|
|
82
|
+
*
|
|
83
|
+
*/
|
|
84
|
+
export async function importExecutionPayload(
|
|
85
|
+
this: BeaconChain,
|
|
86
|
+
payloadInput: PayloadEnvelopeInput,
|
|
87
|
+
opts: ImportPayloadOpts = {}
|
|
88
|
+
): Promise<void> {
|
|
89
|
+
const signedEnvelope = payloadInput.getPayloadEnvelope();
|
|
90
|
+
const envelope = signedEnvelope.message;
|
|
91
|
+
const blockRootHex = payloadInput.blockRootHex;
|
|
92
|
+
const blockHashHex = payloadInput.getBlockHashHex();
|
|
93
|
+
const fork = this.config.getForkName(envelope.slot);
|
|
94
|
+
|
|
95
|
+
// 1. Emit `execution_payload_available` event at the start of import. At this point the payload input
|
|
96
|
+
// is already complete, so the payload and required data are available for payload attestation.
|
|
97
|
+
// This event is only about availability, not validity of the execution payload, hence we can emit
|
|
98
|
+
// it before getting a response from the execution client on whether the payload is valid or not.
|
|
99
|
+
if (this.clock.currentSlot === envelope.slot) {
|
|
100
|
+
this.emitter.emit(routes.events.EventType.executionPayloadAvailable, {
|
|
101
|
+
slot: envelope.slot,
|
|
102
|
+
blockRoot: blockRootHex,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 2. Get ProtoBlock for parent root lookup
|
|
107
|
+
const protoBlock = this.forkChoice.getBlockHexDefaultStatus(blockRootHex);
|
|
108
|
+
if (!protoBlock) {
|
|
109
|
+
throw new PayloadError({
|
|
110
|
+
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE,
|
|
111
|
+
blockRootHex,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 3. Apply backpressure from the write queue early, before doing verification work.
|
|
116
|
+
// The actual DB write is deferred until after verification succeeds.
|
|
117
|
+
await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
|
|
118
|
+
|
|
119
|
+
// 4. Get pre-state for processExecutionPayloadEnvelope
|
|
120
|
+
// We need the block state (post-block, pre-payload) to process the envelope
|
|
121
|
+
const blockState = await this.regen.getBlockSlotState(
|
|
122
|
+
protoBlock,
|
|
123
|
+
protoBlock.slot,
|
|
124
|
+
{dontTransferCache: true},
|
|
125
|
+
RegenCaller.processBlock
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// 5. Run verification steps in parallel
|
|
129
|
+
// Note: No data availability check needed here - importExecutionPayload is only
|
|
130
|
+
// called when payloadInput.isComplete() is true, so all data is already available.
|
|
131
|
+
const [execResult, signatureValid, postPayloadResult] = await Promise.all([
|
|
132
|
+
this.executionEngine.notifyNewPayload(
|
|
133
|
+
fork,
|
|
134
|
+
envelope.payload,
|
|
135
|
+
payloadInput.getVersionedHashes(),
|
|
136
|
+
fromHex(protoBlock.parentRoot),
|
|
137
|
+
envelope.executionRequests
|
|
138
|
+
),
|
|
139
|
+
|
|
140
|
+
opts.validSignature === true
|
|
141
|
+
? Promise.resolve(true)
|
|
142
|
+
: (async () => {
|
|
143
|
+
const signatureSet = getExecutionPayloadEnvelopeSignatureSet(
|
|
144
|
+
this.config,
|
|
145
|
+
this.pubkeyCache,
|
|
146
|
+
blockState,
|
|
147
|
+
signedEnvelope,
|
|
148
|
+
payloadInput.proposerIndex
|
|
149
|
+
);
|
|
150
|
+
return this.bls.verifySignatureSets([signatureSet]);
|
|
151
|
+
})(),
|
|
152
|
+
|
|
153
|
+
// Signature verified separately above.
|
|
154
|
+
// State root check is done separately below with better error typing (matching block pipeline pattern).
|
|
155
|
+
(async () => {
|
|
156
|
+
try {
|
|
157
|
+
return {
|
|
158
|
+
postPayloadState: blockState.processExecutionPayloadEnvelope(signedEnvelope, {
|
|
159
|
+
verifySignature: false,
|
|
160
|
+
verifyStateRoot: false,
|
|
161
|
+
}),
|
|
162
|
+
};
|
|
163
|
+
} catch (e) {
|
|
164
|
+
throw new PayloadError(
|
|
165
|
+
{
|
|
166
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
167
|
+
message: (e as Error).message,
|
|
168
|
+
},
|
|
169
|
+
`State transition error: ${(e as Error).message}`
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
})(),
|
|
173
|
+
]);
|
|
174
|
+
|
|
175
|
+
// 5a. Check signature verification result
|
|
176
|
+
if (!signatureValid) {
|
|
177
|
+
throw new PayloadError({code: PayloadErrorCode.INVALID_SIGNATURE});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// 5b. Handle EL response
|
|
181
|
+
switch (execResult.status) {
|
|
182
|
+
case ExecutionPayloadStatus.VALID:
|
|
183
|
+
break;
|
|
184
|
+
|
|
185
|
+
case ExecutionPayloadStatus.INVALID:
|
|
186
|
+
throw new PayloadError({
|
|
187
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_INVALID,
|
|
188
|
+
execStatus: execResult.status,
|
|
189
|
+
errorMessage: execResult.validationError ?? "",
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
case ExecutionPayloadStatus.ACCEPTED:
|
|
193
|
+
case ExecutionPayloadStatus.SYNCING:
|
|
194
|
+
break;
|
|
195
|
+
|
|
196
|
+
case ExecutionPayloadStatus.INVALID_BLOCK_HASH:
|
|
197
|
+
case ExecutionPayloadStatus.ELERROR:
|
|
198
|
+
case ExecutionPayloadStatus.UNAVAILABLE:
|
|
199
|
+
throw new PayloadError({
|
|
200
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
|
|
201
|
+
execStatus: execResult.status,
|
|
202
|
+
errorMessage: execResult.validationError ?? "",
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 5c. Verify envelope state root matches post-state
|
|
207
|
+
const postPayloadState = postPayloadResult.postPayloadState;
|
|
208
|
+
const postPayloadStateRoot = postPayloadState.hashTreeRoot();
|
|
209
|
+
if (!byteArrayEquals(envelope.stateRoot, postPayloadStateRoot)) {
|
|
210
|
+
throw new PayloadError({
|
|
211
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
212
|
+
message: `Envelope state root mismatch expected=${toRootHex(envelope.stateRoot)} actual=${toRootHex(postPayloadStateRoot)}`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// 6. Persist payload envelope to hot DB (performed asynchronously to avoid blocking)
|
|
217
|
+
this.unfinalizedPayloadEnvelopeWrites.push(payloadInput).catch((e) => {
|
|
218
|
+
if (!isQueueErrorAborted(e)) {
|
|
219
|
+
this.logger.error(
|
|
220
|
+
"Error pushing payload envelope to unfinalized write queue",
|
|
221
|
+
{slot: envelope.slot, root: blockRootHex},
|
|
222
|
+
e as Error
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// 7. Update fork choice
|
|
228
|
+
this.forkChoice.onExecutionPayload(
|
|
229
|
+
blockRootHex,
|
|
230
|
+
blockHashHex,
|
|
231
|
+
envelope.payload.blockNumber,
|
|
232
|
+
toRootHex(postPayloadStateRoot),
|
|
233
|
+
toForkChoiceExecutionStatus(execResult.status)
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
// 8. Cache payload state
|
|
237
|
+
this.regen.processPayloadState(postPayloadState);
|
|
238
|
+
if (postPayloadState.slot % SLOTS_PER_EPOCH === 0) {
|
|
239
|
+
const {checkpoint} = postPayloadState.computeAnchorCheckpoint();
|
|
240
|
+
this.regen.addCheckpointState(checkpoint, postPayloadState, true);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 9. Record metrics for payload envelope and column sources
|
|
244
|
+
this.metrics?.importPayload.bySource.inc({source: payloadInput.getPayloadEnvelopeSource().source});
|
|
245
|
+
for (const {source} of payloadInput.getSampledColumnsWithSource()) {
|
|
246
|
+
this.metrics?.importPayload.columnsBySource.inc({source});
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// 10. Emit event after payload is fully verified and imported to fork choice, only for recent enough payloads
|
|
250
|
+
if (this.clock.currentSlot - envelope.slot < EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS) {
|
|
251
|
+
this.emitter.emit(routes.events.EventType.executionPayload, {
|
|
252
|
+
slot: envelope.slot,
|
|
253
|
+
builderIndex: envelope.builderIndex,
|
|
254
|
+
blockHash: blockHashHex,
|
|
255
|
+
blockRoot: blockRootHex,
|
|
256
|
+
stateRoot: toRootHex(envelope.stateRoot),
|
|
257
|
+
// TODO GLOAS: revisit once we support optimistic import
|
|
258
|
+
executionOptimistic: false,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
this.logger.verbose("Execution payload imported", {
|
|
263
|
+
slot: envelope.slot,
|
|
264
|
+
root: blockRootHex,
|
|
265
|
+
blockHash: blockHashHex,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
@@ -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;
|