@lodestar/beacon-node 1.42.0-dev.5f2fffc2ce → 1.42.0-dev.6fa48cb5f2
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 +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 +27 -11
- 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 +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 +2 -2
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +1 -0
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +2 -2
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +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 +13 -17
- 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/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/gossip/topic.d.ts +727 -0
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/interface.d.ts +4 -2
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -0
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +4 -2
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +11 -5
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +15 -5
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +39 -9
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/index.d.ts +12 -7
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +99 -78
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +10 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +11 -1
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +2 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +10 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
- package/lib/network/reqresp/rateLimit.js +8 -0
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.d.ts.map +1 -1
- package/lib/network/reqresp/score.js +2 -0
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +8 -2
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +7 -1
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/node/nodejs.d.ts +2 -2
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +1 -4
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.d.ts.map +1 -1
- package/lib/node/notifier.js +3 -3
- package/lib/node/notifier.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts +3 -3
- package/lib/sync/backfill/backfill.d.ts.map +1 -1
- package/lib/sync/backfill/backfill.js +3 -3
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/constants.d.ts +1 -1
- package/lib/sync/constants.js +1 -1
- package/lib/sync/unknownBlock.d.ts +3 -9
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +8 -41
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/util/sszBytes.d.ts +4 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +69 -12
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +2 -0
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -0
- package/lib/util/types.js.map +1 -1
- package/package.json +16 -16
- package/src/api/impl/beacon/blocks/index.ts +37 -18
- package/src/api/impl/beacon/pool/index.ts +1 -1
- package/src/api/impl/beacon/state/index.ts +29 -41
- package/src/api/impl/beacon/state/utils.ts +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 +47 -16
- 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 +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 +4 -4
- 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 +23 -50
- 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/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 -8
- package/src/chain/validatorMonitor.ts +23 -12
- package/src/execution/engine/interface.ts +2 -2
- package/src/metrics/metrics/lodestar.ts +100 -19
- package/src/network/gossip/encoding.ts +16 -0
- package/src/network/interface.ts +15 -2
- package/src/network/libp2p/index.ts +5 -0
- package/src/network/network.ts +34 -6
- package/src/network/processor/extractSlotRootFns.ts +19 -6
- package/src/network/processor/gossipHandlers.ts +45 -8
- package/src/network/processor/index.ts +110 -89
- package/src/network/reqresp/ReqRespBeaconNode.ts +14 -1
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
- package/src/network/reqresp/handlers/index.ts +12 -0
- package/src/network/reqresp/protocols.ts +12 -0
- package/src/network/reqresp/rateLimit.ts +18 -0
- package/src/network/reqresp/score.ts +2 -0
- package/src/network/reqresp/types.ts +13 -0
- package/src/node/nodejs.ts +3 -5
- package/src/node/notifier.ts +4 -10
- package/src/sync/backfill/backfill.ts +4 -4
- package/src/sync/constants.ts +1 -1
- package/src/sync/unknownBlock.ts +10 -50
- package/src/util/sszBytes.ts +90 -10
- package/src/util/types.ts +6 -0
- package/lib/chain/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
|
@@ -128,7 +128,7 @@ export interface IExecutionEngine {
|
|
|
128
128
|
* corresponding state, up to and including finalized_block_hash.
|
|
129
129
|
*
|
|
130
130
|
* The call of the notify_forkchoice_updated function maps on the POS_FORKCHOICE_UPDATED event defined in the EIP-3675.
|
|
131
|
-
* https://github.com/ethereum/consensus-specs/blob/
|
|
131
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.1.7/specs/merge/fork-choice.md#notify_forkchoice_updated
|
|
132
132
|
*
|
|
133
133
|
* Should be called in response to fork-choice head and finalized events
|
|
134
134
|
*/
|
|
@@ -145,7 +145,7 @@ export interface IExecutionEngine {
|
|
|
145
145
|
* since the corresponding call to prepare_payload method.
|
|
146
146
|
*
|
|
147
147
|
* Required for block producing
|
|
148
|
-
* https://github.com/ethereum/consensus-specs/blob/
|
|
148
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.1.7/specs/merge/validator.md#get_payload
|
|
149
149
|
*/
|
|
150
150
|
getPayload(
|
|
151
151
|
fork: ForkName,
|
|
@@ -3,6 +3,7 @@ import {NotReorgedReason} from "@lodestar/fork-choice";
|
|
|
3
3
|
import {ArchiveStoreTask} from "../../chain/archiveStore/archiveStore.js";
|
|
4
4
|
import {FrequencyStateArchiveStep} from "../../chain/archiveStore/strategies/frequencyStateArchiveStrategy.js";
|
|
5
5
|
import {BlockInputSource} from "../../chain/blocks/blockInput/index.js";
|
|
6
|
+
import {PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
|
|
6
7
|
import {JobQueueItemType} from "../../chain/bls/index.js";
|
|
7
8
|
import {AttestationErrorCode, BlockErrorCode} from "../../chain/errors/index.js";
|
|
8
9
|
import {
|
|
@@ -237,6 +238,56 @@ export function createLodestarMetrics(
|
|
|
237
238
|
}),
|
|
238
239
|
},
|
|
239
240
|
|
|
241
|
+
payloadEnvelopeProcessorQueue: {
|
|
242
|
+
length: register.gauge({
|
|
243
|
+
name: "lodestar_payload_envelope_processor_queue_length",
|
|
244
|
+
help: "Count of total payload envelope processor queue length",
|
|
245
|
+
}),
|
|
246
|
+
droppedJobs: register.gauge({
|
|
247
|
+
name: "lodestar_payload_envelope_processor_queue_dropped_jobs_total",
|
|
248
|
+
help: "Count of total payload envelope processor queue dropped jobs",
|
|
249
|
+
}),
|
|
250
|
+
jobTime: register.histogram({
|
|
251
|
+
name: "lodestar_payload_envelope_processor_queue_job_time_seconds",
|
|
252
|
+
help: "Time to process payload envelope processor queue job in seconds",
|
|
253
|
+
buckets: [0.01, 0.1, 1, 4, 12],
|
|
254
|
+
}),
|
|
255
|
+
jobWaitTime: register.histogram({
|
|
256
|
+
name: "lodestar_payload_envelope_processor_queue_job_wait_time_seconds",
|
|
257
|
+
help: "Time from job added to the payload envelope processor queue to starting in seconds",
|
|
258
|
+
buckets: [0.01, 0.1, 1, 4, 12],
|
|
259
|
+
}),
|
|
260
|
+
concurrency: register.gauge({
|
|
261
|
+
name: "lodestar_payload_envelope_processor_queue_concurrency",
|
|
262
|
+
help: "Current concurrency of payload envelope processor queue",
|
|
263
|
+
}),
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
unfinalizedPayloadEnvelopeWritesQueue: {
|
|
267
|
+
length: register.gauge({
|
|
268
|
+
name: "lodestar_unfinalized_payload_envelope_writes_queue_length",
|
|
269
|
+
help: "Count of total unfinalized payload envelope writes queue length",
|
|
270
|
+
}),
|
|
271
|
+
droppedJobs: register.gauge({
|
|
272
|
+
name: "lodestar_unfinalized_payload_envelope_writes_queue_dropped_jobs_total",
|
|
273
|
+
help: "Count of total unfinalized payload envelope writes queue dropped jobs",
|
|
274
|
+
}),
|
|
275
|
+
jobTime: register.histogram({
|
|
276
|
+
name: "lodestar_unfinalized_payload_envelope_writes_queue_job_time_seconds",
|
|
277
|
+
help: "Time to process unfinalized payload envelope writes queue job in seconds",
|
|
278
|
+
buckets: [0.01, 0.1, 1, 4, 12],
|
|
279
|
+
}),
|
|
280
|
+
jobWaitTime: register.histogram({
|
|
281
|
+
name: "lodestar_unfinalized_payload_envelope_writes_queue_job_wait_time_seconds",
|
|
282
|
+
help: "Time from job added to the unfinalized payload envelope writes queue to starting in seconds",
|
|
283
|
+
buckets: [0.01, 0.1, 1, 4, 12],
|
|
284
|
+
}),
|
|
285
|
+
concurrency: register.gauge({
|
|
286
|
+
name: "lodestar_unfinalized_payload_envelope_writes_queue_concurrency",
|
|
287
|
+
help: "Current concurrency of unfinalized payload envelope writes queue",
|
|
288
|
+
}),
|
|
289
|
+
},
|
|
290
|
+
|
|
240
291
|
engineHttpProcessorQueue: {
|
|
241
292
|
length: register.gauge({
|
|
242
293
|
name: "lodestar_engine_http_processor_queue_length",
|
|
@@ -925,6 +976,18 @@ export function createLodestarMetrics(
|
|
|
925
976
|
labelNames: ["reason"],
|
|
926
977
|
}),
|
|
927
978
|
},
|
|
979
|
+
importPayload: {
|
|
980
|
+
bySource: register.gauge<{source: PayloadEnvelopeInputSource}>({
|
|
981
|
+
name: "lodestar_import_payload_by_source_total",
|
|
982
|
+
help: "Total number of imported execution payload envelopes by source",
|
|
983
|
+
labelNames: ["source"],
|
|
984
|
+
}),
|
|
985
|
+
columnsBySource: register.gauge<{source: PayloadEnvelopeInputSource}>({
|
|
986
|
+
name: "lodestar_import_payload_columns_by_source_total",
|
|
987
|
+
help: "Total number of payload-attached columns (sampled columns for Gloas) by source",
|
|
988
|
+
labelNames: ["source"],
|
|
989
|
+
}),
|
|
990
|
+
},
|
|
928
991
|
engineNotifyNewPayloadResult: register.gauge<{result: ExecutionPayloadStatus}>({
|
|
929
992
|
name: "lodestar_execution_engine_notify_new_payload_result_total",
|
|
930
993
|
help: "The total result of calling notifyNewPayload execution engine api",
|
|
@@ -1495,6 +1558,20 @@ export function createLodestarMetrics(
|
|
|
1495
1558
|
help: "Number of BlockInputs created via a data column being seen first",
|
|
1496
1559
|
}),
|
|
1497
1560
|
},
|
|
1561
|
+
payloadEnvelopeInput: {
|
|
1562
|
+
count: register.gauge({
|
|
1563
|
+
name: "lodestar_seen_payload_envelope_input_cache_size",
|
|
1564
|
+
help: "Number of cached PayloadEnvelopeInputs",
|
|
1565
|
+
}),
|
|
1566
|
+
serializedObjectRefs: register.gauge({
|
|
1567
|
+
name: "lodestar_seen_payload_envelope_input_cache_serialized_object_refs",
|
|
1568
|
+
help: "Number of serialized-cache object refs retained by cached PayloadEnvelopeInputs",
|
|
1569
|
+
}),
|
|
1570
|
+
created: register.counter({
|
|
1571
|
+
name: "lodestar_seen_payload_envelope_input_cache_items_created_total",
|
|
1572
|
+
help: "Number of PayloadEnvelopeInputs created",
|
|
1573
|
+
}),
|
|
1574
|
+
},
|
|
1498
1575
|
},
|
|
1499
1576
|
|
|
1500
1577
|
processFinalizedCheckpoint: {
|
|
@@ -1635,33 +1712,37 @@ export function createLodestarMetrics(
|
|
|
1635
1712
|
}),
|
|
1636
1713
|
},
|
|
1637
1714
|
|
|
1638
|
-
//
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
name: "
|
|
1642
|
-
help: "Total number of gossip
|
|
1715
|
+
// some gossip messages need to wait for block to be processed before they can be processed
|
|
1716
|
+
awaitingBlockGossipMessages: {
|
|
1717
|
+
queue: register.gauge<{topic: GossipType}>({
|
|
1718
|
+
name: "lodestar_awaiting_block_gossip_messages_total",
|
|
1719
|
+
help: "Total number of gossip messages waiting for block to be processed",
|
|
1720
|
+
labelNames: ["topic"],
|
|
1643
1721
|
}),
|
|
1644
1722
|
countPerSlot: register.gauge({
|
|
1645
|
-
name: "
|
|
1646
|
-
help: "Total number of gossip
|
|
1723
|
+
name: "lodestar_awaiting_block_gossip_messages_per_slot_total",
|
|
1724
|
+
help: "Total number of gossip messages waiting for block to be processed per slot",
|
|
1647
1725
|
}),
|
|
1648
|
-
resolve: register.gauge({
|
|
1649
|
-
name: "
|
|
1650
|
-
help: "Total number of gossip
|
|
1726
|
+
resolve: register.gauge<{topic: GossipType}>({
|
|
1727
|
+
name: "lodestar_awaiting_block_gossip_messages_resolve_total",
|
|
1728
|
+
help: "Total number of gossip messages are reprocessed",
|
|
1729
|
+
labelNames: ["topic"],
|
|
1651
1730
|
}),
|
|
1652
|
-
waitSecBeforeResolve: register.gauge({
|
|
1653
|
-
name: "
|
|
1731
|
+
waitSecBeforeResolve: register.gauge<{topic: GossipType}>({
|
|
1732
|
+
name: "lodestar_awaiting_block_gossip_messages_wait_time_resolve_seconds",
|
|
1654
1733
|
help: "Time to wait for unknown block in seconds",
|
|
1734
|
+
labelNames: ["topic"],
|
|
1655
1735
|
}),
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1736
|
+
// having 2 labels here is not great for performance, however it's rarely happening and having the reason label is important for debugging
|
|
1737
|
+
reject: register.gauge<{reason: ReprocessRejectReason; topic: GossipType}>({
|
|
1738
|
+
name: "lodestar_awaiting_block_gossip_messages_reject_total",
|
|
1739
|
+
help: "Total number of gossip messages are rejected to reprocess",
|
|
1740
|
+
labelNames: ["reason", "topic"],
|
|
1660
1741
|
}),
|
|
1661
|
-
waitSecBeforeReject: register.gauge<{reason: ReprocessRejectReason}>({
|
|
1662
|
-
name: "
|
|
1742
|
+
waitSecBeforeReject: register.gauge<{reason: ReprocessRejectReason; topic: GossipType}>({
|
|
1743
|
+
name: "lodestar_awaiting_block_gossip_messages_wait_time_reject_seconds",
|
|
1663
1744
|
help: "Time to wait for unknown block before being rejected",
|
|
1664
|
-
labelNames: ["reason"],
|
|
1745
|
+
labelNames: ["reason", "topic"],
|
|
1665
1746
|
}),
|
|
1666
1747
|
},
|
|
1667
1748
|
|
|
@@ -24,12 +24,28 @@ const decoder = new snappyWasm.Decoder();
|
|
|
24
24
|
// Shared buffer to convert msgId to string
|
|
25
25
|
const sharedMsgIdBuf = Buffer.alloc(20);
|
|
26
26
|
|
|
27
|
+
// Cache topic -> seed to avoid per-message allocations on the hot path.
|
|
28
|
+
// Topics are a fixed set per fork (changes only at fork boundaries).
|
|
29
|
+
const topicSeedCache = new Map<string, bigint>();
|
|
30
|
+
|
|
27
31
|
/**
|
|
28
32
|
* The function used to generate a gossipsub message id
|
|
29
33
|
* We use the first 8 bytes of SHA256(data) for content addressing
|
|
30
34
|
*/
|
|
31
35
|
export function fastMsgIdFn(rpcMsg: RPC.Message): string {
|
|
32
36
|
if (rpcMsg.data) {
|
|
37
|
+
if (rpcMsg.topic) {
|
|
38
|
+
// Use topic-derived seed to prevent cross-topic deduplication of identical messages.
|
|
39
|
+
// SyncCommitteeMessages are published to multiple sync_committee_{subnet} topics with
|
|
40
|
+
// identical data, so hashing only the data incorrectly deduplicates across subnets.
|
|
41
|
+
// See https://github.com/ChainSafe/lodestar/issues/8294
|
|
42
|
+
let topicSeed = topicSeedCache.get(rpcMsg.topic);
|
|
43
|
+
if (topicSeed === undefined) {
|
|
44
|
+
topicSeed = xxhash.h64Raw(Buffer.from(rpcMsg.topic), h64Seed);
|
|
45
|
+
topicSeedCache.set(rpcMsg.topic, topicSeed);
|
|
46
|
+
}
|
|
47
|
+
return xxhash.h64Raw(rpcMsg.data, topicSeed).toString(16);
|
|
48
|
+
}
|
|
33
49
|
return xxhash.h64Raw(rpcMsg.data, h64Seed).toString(16);
|
|
34
50
|
}
|
|
35
51
|
return "0000000000000000";
|
package/src/network/interface.ts
CHANGED
|
@@ -38,7 +38,12 @@ import {
|
|
|
38
38
|
import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
|
|
39
39
|
import {CustodyConfig} from "../util/dataColumns.js";
|
|
40
40
|
import {PeerIdStr} from "../util/peerId.js";
|
|
41
|
-
import {
|
|
41
|
+
import {
|
|
42
|
+
BeaconBlocksByRootRequest,
|
|
43
|
+
BlobSidecarsByRootRequest,
|
|
44
|
+
DataColumnSidecarsByRootRequest,
|
|
45
|
+
ExecutionPayloadEnvelopesByRootRequest,
|
|
46
|
+
} from "../util/types.js";
|
|
42
47
|
import {INetworkCorePublic} from "./core/types.js";
|
|
43
48
|
import {INetworkEventBus} from "./events.js";
|
|
44
49
|
import {GossipType} from "./gossip/interface.js";
|
|
@@ -68,7 +73,7 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
68
73
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
|
|
69
74
|
shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
|
|
70
75
|
reStatusPeers(peers: PeerIdStr[]): Promise<void>;
|
|
71
|
-
|
|
76
|
+
searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
72
77
|
// ReqResp
|
|
73
78
|
sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<SignedBeaconBlock[]>;
|
|
74
79
|
sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<SignedBeaconBlock[]>;
|
|
@@ -82,6 +87,14 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
82
87
|
peerId: PeerIdStr,
|
|
83
88
|
request: DataColumnSidecarsByRootRequest
|
|
84
89
|
): Promise<fulu.DataColumnSidecar[]>;
|
|
90
|
+
sendExecutionPayloadEnvelopesByRange(
|
|
91
|
+
peerId: PeerIdStr,
|
|
92
|
+
request: gloas.ExecutionPayloadEnvelopesByRangeRequest
|
|
93
|
+
): Promise<gloas.SignedExecutionPayloadEnvelope[]>;
|
|
94
|
+
sendExecutionPayloadEnvelopesByRoot(
|
|
95
|
+
peerId: PeerIdStr,
|
|
96
|
+
request: ExecutionPayloadEnvelopesByRootRequest
|
|
97
|
+
): Promise<gloas.SignedExecutionPayloadEnvelope[]>;
|
|
85
98
|
|
|
86
99
|
// Gossip
|
|
87
100
|
publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
|
|
@@ -88,6 +88,9 @@ export async function createNodeJsLibp2p(
|
|
|
88
88
|
);
|
|
89
89
|
}
|
|
90
90
|
if (networkOpts.quic) {
|
|
91
|
+
const quicMultiaddrs = localMultiaddrs.filter((ma) => ma.includes("/quic-v1"));
|
|
92
|
+
const hasIpv4Quic = quicMultiaddrs.some((ma) => ma.includes("/ip4/"));
|
|
93
|
+
const hasIpv6Quic = quicMultiaddrs.some((ma) => ma.includes("/ip6/"));
|
|
91
94
|
transports.unshift(
|
|
92
95
|
quic({
|
|
93
96
|
handshakeTimeout: 5_000,
|
|
@@ -96,6 +99,8 @@ export async function createNodeJsLibp2p(
|
|
|
96
99
|
maxConcurrentStreamLimit: 256,
|
|
97
100
|
maxStreamData: 10_000_000,
|
|
98
101
|
maxConnectionData: 15_000_000,
|
|
102
|
+
ipv4: hasIpv4Quic,
|
|
103
|
+
ipv6: hasIpv6Quic,
|
|
99
104
|
})
|
|
100
105
|
);
|
|
101
106
|
}
|
package/src/network/network.ts
CHANGED
|
@@ -40,7 +40,12 @@ import {IClock} from "../util/clock.js";
|
|
|
40
40
|
import {CustodyConfig} from "../util/dataColumns.js";
|
|
41
41
|
import {PeerIdStr, peerIdToString} from "../util/peerId.js";
|
|
42
42
|
import {promiseAllMaybeAsync} from "../util/promises.js";
|
|
43
|
-
import {
|
|
43
|
+
import {
|
|
44
|
+
BeaconBlocksByRootRequest,
|
|
45
|
+
BlobSidecarsByRootRequest,
|
|
46
|
+
DataColumnSidecarsByRootRequest,
|
|
47
|
+
ExecutionPayloadEnvelopesByRootRequest,
|
|
48
|
+
} from "../util/types.js";
|
|
44
49
|
import {INetworkCore, NetworkCore, WorkerNetworkCore} from "./core/index.js";
|
|
45
50
|
import {INetworkEventBus, NetworkEvent, NetworkEventBus, NetworkEventData} from "./events.js";
|
|
46
51
|
import {getActiveForkBoundaries} from "./forks.js";
|
|
@@ -161,7 +166,7 @@ export class Network implements INetwork {
|
|
|
161
166
|
const events = new NetworkEventBus();
|
|
162
167
|
const aggregatorTracker = new AggregatorTracker();
|
|
163
168
|
|
|
164
|
-
const activeValidatorCount = chain.getHeadState().
|
|
169
|
+
const activeValidatorCount = chain.getHeadState().activeValidatorCount;
|
|
165
170
|
const initialStatus = chain.getStatus();
|
|
166
171
|
const initialCustodyGroupCount = chain.custodyConfig.targetCustodyGroupCount;
|
|
167
172
|
|
|
@@ -277,8 +282,8 @@ export class Network implements INetwork {
|
|
|
277
282
|
return this.core.reStatusPeers(peers);
|
|
278
283
|
}
|
|
279
284
|
|
|
280
|
-
|
|
281
|
-
this.networkProcessor.
|
|
285
|
+
searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
|
|
286
|
+
this.networkProcessor.searchUnknownBlock(slotRoot, source, peer);
|
|
282
287
|
}
|
|
283
288
|
|
|
284
289
|
async reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): Promise<void> {
|
|
@@ -636,6 +641,29 @@ export class Network implements INetwork {
|
|
|
636
641
|
);
|
|
637
642
|
}
|
|
638
643
|
|
|
644
|
+
async sendExecutionPayloadEnvelopesByRange(
|
|
645
|
+
peerId: PeerIdStr,
|
|
646
|
+
request: gloas.ExecutionPayloadEnvelopesByRangeRequest
|
|
647
|
+
): Promise<gloas.SignedExecutionPayloadEnvelope[]> {
|
|
648
|
+
return collectMaxResponseTyped(
|
|
649
|
+
this.sendReqRespRequest(peerId, ReqRespMethod.ExecutionPayloadEnvelopesByRange, [Version.V1], request),
|
|
650
|
+
request.count,
|
|
651
|
+
responseSszTypeByMethod[ReqRespMethod.ExecutionPayloadEnvelopesByRange]
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
async sendExecutionPayloadEnvelopesByRoot(
|
|
656
|
+
peerId: PeerIdStr,
|
|
657
|
+
request: ExecutionPayloadEnvelopesByRootRequest
|
|
658
|
+
): Promise<gloas.SignedExecutionPayloadEnvelope[]> {
|
|
659
|
+
return collectMaxResponseTyped(
|
|
660
|
+
this.sendReqRespRequest(peerId, ReqRespMethod.ExecutionPayloadEnvelopesByRoot, [Version.V1], request),
|
|
661
|
+
request.length,
|
|
662
|
+
responseSszTypeByMethod[ReqRespMethod.ExecutionPayloadEnvelopesByRoot],
|
|
663
|
+
this.chain.serializedCache
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
|
|
639
667
|
private sendReqRespRequest<Req>(
|
|
640
668
|
peerId: PeerIdStr,
|
|
641
669
|
method: ReqRespMethod,
|
|
@@ -721,7 +749,7 @@ export class Network implements INetwork {
|
|
|
721
749
|
|
|
722
750
|
try {
|
|
723
751
|
// messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
|
|
724
|
-
// https://github.com/ethereum/consensus-specs/blob/
|
|
752
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
|
|
725
753
|
await this.waitForSyncMessageCutoff(finalityUpdate.signatureSlot);
|
|
726
754
|
await this.publishLightClientFinalityUpdate(finalityUpdate);
|
|
727
755
|
} catch (e) {
|
|
@@ -738,7 +766,7 @@ export class Network implements INetwork {
|
|
|
738
766
|
|
|
739
767
|
try {
|
|
740
768
|
// messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
|
|
741
|
-
// https://github.com/ethereum/consensus-specs/blob/
|
|
769
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
|
|
742
770
|
await this.waitForSyncMessageCutoff(optimisticUpdate.signatureSlot);
|
|
743
771
|
await this.publishLightClientOptimisticUpdate(optimisticUpdate);
|
|
744
772
|
} catch (e) {
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import {ForkName} from "@lodestar/params";
|
|
1
|
+
import {ForkName, isForkPostGloas} from "@lodestar/params";
|
|
2
2
|
import {SlotOptionalRoot, SlotRootHex} from "@lodestar/types";
|
|
3
3
|
import {
|
|
4
|
+
getBeaconBlockRootFromDataColumnSidecarSerialized,
|
|
5
|
+
getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized,
|
|
4
6
|
getBlockRootFromBeaconAttestationSerialized,
|
|
5
7
|
getBlockRootFromSignedAggregateAndProofSerialized,
|
|
6
8
|
getSlotFromBeaconAttestationSerialized,
|
|
7
9
|
getSlotFromBlobSidecarSerialized,
|
|
8
10
|
getSlotFromDataColumnSidecarSerialized,
|
|
11
|
+
getSlotFromExecutionPayloadEnvelopeSerialized,
|
|
9
12
|
getSlotFromSignedAggregateAndProofSerialized,
|
|
10
13
|
getSlotFromSignedBeaconBlockSerialized,
|
|
11
14
|
} from "../../util/sszBytes.js";
|
|
@@ -14,7 +17,7 @@ import {ExtractSlotRootFns} from "./types.js";
|
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
19
|
* Extract the slot and block root of a gossip message form serialized data.
|
|
17
|
-
*
|
|
20
|
+
* Not applicable for all topics.
|
|
18
21
|
*/
|
|
19
22
|
export function createExtractBlockSlotRootFns(): ExtractSlotRootFns {
|
|
20
23
|
return {
|
|
@@ -52,13 +55,23 @@ export function createExtractBlockSlotRootFns(): ExtractSlotRootFns {
|
|
|
52
55
|
}
|
|
53
56
|
return {slot};
|
|
54
57
|
},
|
|
55
|
-
[GossipType.data_column_sidecar]: (data: Uint8Array): SlotOptionalRoot | null => {
|
|
56
|
-
const slot = getSlotFromDataColumnSidecarSerialized(data);
|
|
57
|
-
|
|
58
|
+
[GossipType.data_column_sidecar]: (data: Uint8Array, fork: ForkName): SlotOptionalRoot | null => {
|
|
59
|
+
const slot = getSlotFromDataColumnSidecarSerialized(data, fork);
|
|
58
60
|
if (slot === null) {
|
|
59
61
|
return null;
|
|
60
62
|
}
|
|
61
|
-
|
|
63
|
+
|
|
64
|
+
const root = isForkPostGloas(fork) ? getBeaconBlockRootFromDataColumnSidecarSerialized(data) : null;
|
|
65
|
+
return root !== null ? {slot, root} : {slot};
|
|
66
|
+
},
|
|
67
|
+
[GossipType.execution_payload]: (data: Uint8Array): SlotRootHex | null => {
|
|
68
|
+
const slot = getSlotFromExecutionPayloadEnvelopeSerialized(data);
|
|
69
|
+
const root = getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized(data);
|
|
70
|
+
|
|
71
|
+
if (slot === null || root === null) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return {slot, root};
|
|
62
75
|
},
|
|
63
76
|
};
|
|
64
77
|
}
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
IBlockInput,
|
|
31
31
|
isBlockInputColumns,
|
|
32
32
|
} from "../../chain/blocks/blockInput/index.js";
|
|
33
|
+
import {PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
|
|
33
34
|
import {BlobSidecarValidation} from "../../chain/blocks/types.js";
|
|
34
35
|
import {ChainEvent} from "../../chain/emitter.js";
|
|
35
36
|
import {
|
|
@@ -42,6 +43,8 @@ import {
|
|
|
42
43
|
BlockGossipError,
|
|
43
44
|
DataColumnSidecarErrorCode,
|
|
44
45
|
DataColumnSidecarGossipError,
|
|
46
|
+
ExecutionPayloadEnvelopeError,
|
|
47
|
+
ExecutionPayloadEnvelopeErrorCode,
|
|
45
48
|
GossipAction,
|
|
46
49
|
GossipActionError,
|
|
47
50
|
SyncCommitteeError,
|
|
@@ -616,6 +619,13 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
616
619
|
});
|
|
617
620
|
});
|
|
618
621
|
}
|
|
622
|
+
|
|
623
|
+
// TODO GLOAS: In Gloas, also add column to PayloadEnvelopeInput and notify the payload processor:
|
|
624
|
+
// const payloadInput = chain.seenPayloadEnvelopeInput.get(blockRootHex);
|
|
625
|
+
// if (payloadInput) {
|
|
626
|
+
// payloadInput.addColumn({columnSidecar, source: BlockInputSource.gossip, seenTimestampSec, peerIdStr});
|
|
627
|
+
// chain.processExecutionPayload(payloadInput, {validSignature: true});
|
|
628
|
+
// }
|
|
619
629
|
},
|
|
620
630
|
|
|
621
631
|
[GossipType.beacon_aggregate_and_proof]: async ({
|
|
@@ -767,9 +777,9 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
767
777
|
const {serializedData} = gossipData;
|
|
768
778
|
const syncCommittee = sszDeserialize(topic, serializedData);
|
|
769
779
|
const {subnet} = topic;
|
|
770
|
-
let
|
|
780
|
+
let indicesInSubcommittee: number[] = [0];
|
|
771
781
|
try {
|
|
772
|
-
|
|
782
|
+
indicesInSubcommittee = (await validateGossipSyncCommittee(chain, syncCommittee, subnet)).indicesInSubcommittee;
|
|
773
783
|
} catch (e) {
|
|
774
784
|
if (e instanceof SyncCommitteeError && e.action === GossipAction.REJECT) {
|
|
775
785
|
chain.persistInvalidSszValue(ssz.altair.SyncCommitteeMessage, syncCommittee, "gossip_reject");
|
|
@@ -777,11 +787,12 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
777
787
|
throw e;
|
|
778
788
|
}
|
|
779
789
|
|
|
780
|
-
// Handler
|
|
781
|
-
|
|
790
|
+
// Handler — add for ALL positions this validator holds in the subcommittee
|
|
782
791
|
try {
|
|
783
|
-
const
|
|
784
|
-
|
|
792
|
+
for (const indexInSubcommittee of indicesInSubcommittee) {
|
|
793
|
+
const insertOutcome = chain.syncCommitteeMessagePool.add(subnet, syncCommittee, indexInSubcommittee);
|
|
794
|
+
metrics?.opPool.syncCommitteeMessagePoolInsertOutcome.inc({insertOutcome});
|
|
795
|
+
}
|
|
785
796
|
} catch (e) {
|
|
786
797
|
logger.debug("Error adding to syncCommittee pool", {subnet}, e as Error);
|
|
787
798
|
}
|
|
@@ -826,17 +837,43 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
|
|
|
826
837
|
[GossipType.execution_payload]: async ({
|
|
827
838
|
gossipData,
|
|
828
839
|
topic,
|
|
840
|
+
peerIdStr,
|
|
829
841
|
seenTimestampSec,
|
|
830
842
|
}: GossipHandlerParamGeneric<GossipType.execution_payload>) => {
|
|
831
843
|
const {serializedData} = gossipData;
|
|
832
844
|
const executionPayloadEnvelope = sszDeserialize(topic, serializedData);
|
|
845
|
+
// TODO GLOAS: handle BLOCK_ROOT_UNKNOWN error to trigger sync
|
|
833
846
|
await validateGossipExecutionPayloadEnvelope(chain, executionPayloadEnvelope);
|
|
834
847
|
|
|
835
848
|
const slot = executionPayloadEnvelope.message.slot;
|
|
836
849
|
const delaySec = seenTimestampSec - computeTimeAtSlot(config, slot, chain.genesisTime);
|
|
837
850
|
metrics?.gossipExecutionPayloadEnvelope.elapsedTimeTillReceived.observe({source: OpSource.gossip}, delaySec);
|
|
851
|
+
chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, executionPayloadEnvelope);
|
|
852
|
+
|
|
853
|
+
const blockRootHex = toRootHex(executionPayloadEnvelope.message.beaconBlockRoot);
|
|
854
|
+
const payloadInput = chain.seenPayloadEnvelopeInputCache.get(blockRootHex);
|
|
855
|
+
|
|
856
|
+
if (!payloadInput) {
|
|
857
|
+
// This shouldn't happen because beacon block should have been imported and thus payload input should have been created.
|
|
858
|
+
throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
|
|
859
|
+
code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING,
|
|
860
|
+
blockRoot: blockRootHex,
|
|
861
|
+
});
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
chain.serializedCache.set(executionPayloadEnvelope, serializedData);
|
|
865
|
+
|
|
866
|
+
payloadInput.addPayloadEnvelope({
|
|
867
|
+
envelope: executionPayloadEnvelope,
|
|
868
|
+
source: PayloadEnvelopeInputSource.gossip,
|
|
869
|
+
seenTimestampSec,
|
|
870
|
+
peerIdStr,
|
|
871
|
+
});
|
|
838
872
|
|
|
839
|
-
// TODO GLOAS:
|
|
873
|
+
// TODO GLOAS: Emit execution_payload_gossip event for gossip receipt.
|
|
874
|
+
chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
|
|
875
|
+
chain.logger.debug("Error processing execution payload from gossip", {slot, root: blockRootHex}, e as Error);
|
|
876
|
+
});
|
|
840
877
|
},
|
|
841
878
|
[GossipType.payload_attestation_message]: async ({
|
|
842
879
|
gossipData,
|
|
@@ -1007,7 +1044,7 @@ export async function validateGossipFnRetryUnknownRoot<T>(
|
|
|
1007
1044
|
if (unknownBlockRootRetries === 0) {
|
|
1008
1045
|
// Trigger unknown block root search here
|
|
1009
1046
|
const rootHex = toRootHex(blockRoot);
|
|
1010
|
-
network.
|
|
1047
|
+
network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.gossip);
|
|
1011
1048
|
}
|
|
1012
1049
|
|
|
1013
1050
|
if (unknownBlockRootRetries++ < MAX_UNKNOWN_BLOCK_ROOT_RETRIES) {
|