@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,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>;
|
|
@@ -44,6 +44,8 @@ export async function createNodeJsLibp2p(
|
|
|
44
44
|
): Promise<Libp2p> {
|
|
45
45
|
const localMultiaddrs = networkOpts.localMultiaddrs || defaultNetworkOptions.localMultiaddrs;
|
|
46
46
|
const disconnectThreshold = networkOpts.disconnectThreshold ?? defaultNetworkOptions.disconnectThreshold;
|
|
47
|
+
const tcpEnabled = networkOpts.tcp ?? defaultNetworkOptions.tcp;
|
|
48
|
+
const quicEnabled = networkOpts.quic ?? defaultNetworkOptions.quic;
|
|
47
49
|
const {peerStoreDir, disablePeerDiscovery} = nodeJsLibp2pOpts;
|
|
48
50
|
|
|
49
51
|
let datastore: undefined | Eth2PeerDataStore = undefined;
|
|
@@ -58,7 +60,7 @@ export async function createNodeJsLibp2p(
|
|
|
58
60
|
...(networkOpts.bootMultiaddrs ?? defaultNetworkOptions.bootMultiaddrs ?? []),
|
|
59
61
|
// Append discv5.bootEnrs to bootMultiaddrs if requested
|
|
60
62
|
...(networkOpts.connectToDiscv5Bootnodes
|
|
61
|
-
? await getDiscv5Multiaddrs(networkOpts.discv5?.bootEnrs ?? [],
|
|
63
|
+
? await getDiscv5Multiaddrs(networkOpts.discv5?.bootEnrs ?? [], quicEnabled)
|
|
62
64
|
: []),
|
|
63
65
|
];
|
|
64
66
|
|
|
@@ -71,7 +73,7 @@ export async function createNodeJsLibp2p(
|
|
|
71
73
|
}
|
|
72
74
|
}
|
|
73
75
|
const transports: Libp2pInit["transports"] = [];
|
|
74
|
-
if (
|
|
76
|
+
if (tcpEnabled) {
|
|
75
77
|
transports.unshift(
|
|
76
78
|
tcp({
|
|
77
79
|
// Reject connections when the server's connection count gets high
|
|
@@ -87,17 +89,26 @@ export async function createNodeJsLibp2p(
|
|
|
87
89
|
})
|
|
88
90
|
);
|
|
89
91
|
}
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
92
|
+
if (quicEnabled) {
|
|
93
|
+
const quicMultiaddrs = localMultiaddrs.filter((ma) => ma.includes("/quic-v1"));
|
|
94
|
+
const hasIpv4Quic = quicMultiaddrs.some((ma) => ma.includes("/ip4/"));
|
|
95
|
+
const hasIpv6Quic = quicMultiaddrs.some((ma) => ma.includes("/ip6/"));
|
|
96
|
+
// Only add QUIC transport if at least one QUIC listen address is configured,
|
|
97
|
+
// otherwise the transport constructor will throw
|
|
98
|
+
if (hasIpv4Quic || hasIpv6Quic) {
|
|
99
|
+
transports.unshift(
|
|
100
|
+
quic({
|
|
101
|
+
handshakeTimeout: 5_000,
|
|
102
|
+
maxIdleTimeout: 10_000,
|
|
103
|
+
keepAliveInterval: 5_000,
|
|
104
|
+
maxConcurrentStreamLimit: 256,
|
|
105
|
+
maxStreamData: 10_000_000,
|
|
106
|
+
maxConnectionData: 15_000_000,
|
|
107
|
+
ipv4: hasIpv4Quic,
|
|
108
|
+
ipv6: hasIpv6Quic,
|
|
109
|
+
})
|
|
110
|
+
);
|
|
111
|
+
}
|
|
101
112
|
}
|
|
102
113
|
|
|
103
114
|
const noiseCrypto = {
|
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,
|
package/src/network/options.ts
CHANGED
|
@@ -55,7 +55,12 @@ export const defaultNetworkOptions: NetworkOptions = {
|
|
|
55
55
|
maxPeers: 210, // Allow some room above targetPeers for new inbound peers
|
|
56
56
|
targetPeers: 200,
|
|
57
57
|
// In CLI usage this is typically overridden; when unset it serves as a fallback default (e.g. programmatic usage/tests)
|
|
58
|
-
localMultiaddrs: [
|
|
58
|
+
localMultiaddrs: [
|
|
59
|
+
"/ip4/0.0.0.0/udp/9001/quic-v1",
|
|
60
|
+
"/ip6/::/udp/9001/quic-v1",
|
|
61
|
+
"/ip4/0.0.0.0/tcp/9000",
|
|
62
|
+
"/ip6/::/tcp/9000",
|
|
63
|
+
],
|
|
59
64
|
bootMultiaddrs: [],
|
|
60
65
|
/** disabled by default */
|
|
61
66
|
discv5: null,
|
|
@@ -69,7 +74,7 @@ export const defaultNetworkOptions: NetworkOptions = {
|
|
|
69
74
|
slotsToSubscribeBeforeAggregatorDuty: 2,
|
|
70
75
|
// This will enable the light client server by default
|
|
71
76
|
disableLightClientServer: false,
|
|
72
|
-
quic:
|
|
77
|
+
quic: true,
|
|
73
78
|
tcp: true,
|
|
74
79
|
// specific option for fulu
|
|
75
80
|
// - this is the same to TARGET_SUBNET_PEERS
|
|
@@ -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,51 @@ 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
|
-
const
|
|
833
|
-
|
|
844
|
+
const signedEnvelope = sszDeserialize(topic, serializedData);
|
|
845
|
+
const envelope = signedEnvelope.message;
|
|
846
|
+
// TODO GLOAS: handle BLOCK_ROOT_UNKNOWN error to trigger sync
|
|
847
|
+
await validateGossipExecutionPayloadEnvelope(chain, signedEnvelope);
|
|
834
848
|
|
|
835
|
-
const slot =
|
|
849
|
+
const slot = envelope.slot;
|
|
836
850
|
const delaySec = seenTimestampSec - computeTimeAtSlot(config, slot, chain.genesisTime);
|
|
837
851
|
metrics?.gossipExecutionPayloadEnvelope.elapsedTimeTillReceived.observe({source: OpSource.gossip}, delaySec);
|
|
852
|
+
chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, signedEnvelope);
|
|
853
|
+
|
|
854
|
+
const blockRootHex = toRootHex(envelope.beaconBlockRoot);
|
|
855
|
+
const payloadInput = chain.seenPayloadEnvelopeInputCache.get(blockRootHex);
|
|
856
|
+
|
|
857
|
+
if (!payloadInput) {
|
|
858
|
+
// This shouldn't happen because beacon block should have been imported and thus payload input should have been created.
|
|
859
|
+
throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
|
|
860
|
+
code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING,
|
|
861
|
+
blockRoot: blockRootHex,
|
|
862
|
+
});
|
|
863
|
+
}
|
|
838
864
|
|
|
839
|
-
|
|
865
|
+
chain.serializedCache.set(signedEnvelope, serializedData);
|
|
866
|
+
|
|
867
|
+
payloadInput.addPayloadEnvelope({
|
|
868
|
+
envelope: signedEnvelope,
|
|
869
|
+
source: PayloadEnvelopeInputSource.gossip,
|
|
870
|
+
seenTimestampSec,
|
|
871
|
+
peerIdStr,
|
|
872
|
+
});
|
|
873
|
+
|
|
874
|
+
chain.emitter.emit(routes.events.EventType.executionPayloadGossip, {
|
|
875
|
+
slot,
|
|
876
|
+
builderIndex: envelope.builderIndex,
|
|
877
|
+
blockHash: toRootHex(envelope.payload.blockHash),
|
|
878
|
+
blockRoot: blockRootHex,
|
|
879
|
+
stateRoot: toRootHex(envelope.stateRoot),
|
|
880
|
+
});
|
|
881
|
+
|
|
882
|
+
chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
|
|
883
|
+
chain.logger.debug("Error processing execution payload from gossip", {slot, root: blockRootHex}, e as Error);
|
|
884
|
+
});
|
|
840
885
|
},
|
|
841
886
|
[GossipType.payload_attestation_message]: async ({
|
|
842
887
|
gossipData,
|
|
@@ -1007,7 +1052,7 @@ export async function validateGossipFnRetryUnknownRoot<T>(
|
|
|
1007
1052
|
if (unknownBlockRootRetries === 0) {
|
|
1008
1053
|
// Trigger unknown block root search here
|
|
1009
1054
|
const rootHex = toRootHex(blockRoot);
|
|
1010
|
-
network.
|
|
1055
|
+
network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.gossip);
|
|
1011
1056
|
}
|
|
1012
1057
|
|
|
1013
1058
|
if (unknownBlockRootRetries++ < MAX_UNKNOWN_BLOCK_ROOT_RETRIES) {
|