@lodestar/beacon-node 1.51.0-dev.fac22802f6 → 1.51.0-dev.fb216e169a
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 +19 -61
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +17 -0
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts +6 -0
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +38 -25
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +2 -2
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +7 -31
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +5 -241
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
- package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/errors.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +2 -18
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/types.js +0 -1
- package/lib/chain/blocks/blockInput/types.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +36 -53
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +6 -10
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +26 -17
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +2 -2
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +10 -7
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +21 -16
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -20
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +0 -24
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +17 -6
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +6 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +1 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/interface.d.ts +2 -0
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +1 -1
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +45 -17
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/chain.d.ts +24 -3
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +120 -39
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +7 -7
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -5
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
- package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/errors/index.d.ts +0 -1
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +0 -1
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts +11 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +11 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
- package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
- package/lib/chain/forkChoiceExecutionEngine.js +117 -0
- package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
- package/lib/chain/interface.d.ts +7 -4
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +198 -45
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +14 -3
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/index.d.ts +1 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +1 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +16 -6
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
- package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/singleAttestationPool.js +209 -0
- package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +8 -2
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +10 -2
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/options.d.ts +5 -2
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +3 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/proposerTracker.d.ts +31 -0
- package/lib/chain/proposerTracker.d.ts.map +1 -0
- package/lib/chain/proposerTracker.js +75 -0
- package/lib/chain/proposerTracker.js.map +1 -0
- package/lib/chain/regen/interface.d.ts +1 -1
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/queued.d.ts +1 -1
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +5 -3
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -13
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +1 -2
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +0 -3
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/flatFileStore/flatFileStore.js +5 -5
- package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
- package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
- package/lib/db/flatFileStore/slotIndex.js +2 -2
- package/lib/db/flatFileStore/slotIndex.js.map +1 -1
- package/lib/db/repositories/blobSidecars.d.ts +0 -1
- package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
- package/lib/db/repositories/blobSidecars.js +0 -1
- package/lib/db/repositories/blobSidecars.js.map +1 -1
- package/lib/execution/builder/apiClient.d.ts +14 -8
- package/lib/execution/builder/apiClient.d.ts.map +1 -1
- package/lib/execution/builder/apiClient.js +12 -10
- package/lib/execution/builder/apiClient.js.map +1 -1
- package/lib/execution/builder/http.d.ts +2 -0
- package/lib/execution/builder/http.d.ts.map +1 -1
- package/lib/execution/builder/http.js +2 -0
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/engine/http.d.ts +4 -6
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +8 -10
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +17 -5
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +2 -12
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +0 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +0 -4
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +2 -4
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +1 -15
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +0 -9
- package/lib/execution/engine/sszTypes.d.ts.map +1 -1
- package/lib/execution/engine/sszTypes.js +0 -5
- package/lib/execution/engine/sszTypes.js.map +1 -1
- package/lib/execution/engine/transport.d.ts +1 -14
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +0 -8
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +0 -8
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.d.ts.map +1 -1
- package/lib/execution/engine/utils.js +3 -2
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +0 -9
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +0 -30
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +27 -8
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +74 -18
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/metrics/server/http.js +5 -5
- package/lib/metrics/server/http.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +2 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +4 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +1 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +3 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +4 -1
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +1 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +10 -0
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +1 -8
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +0 -1
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +0 -16
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +0 -23
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +2 -5
- 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 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +6 -7
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +50 -37
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js +2 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js +28 -1
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.js +8 -16
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/peers/utils/subnetMap.d.ts +5 -2
- package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
- package/lib/network/peers/utils/subnetMap.js +6 -3
- package/lib/network/peers/utils/subnetMap.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +1 -8
- 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 +46 -126
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +0 -6
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +1 -5
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +6 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +29 -4
- 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 +0 -3
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +1 -12
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +0 -2
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +0 -10
- 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 +1 -17
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +2 -8
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +1 -7
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/subnets/attnetsService.d.ts +35 -5
- package/lib/network/subnets/attnetsService.d.ts.map +1 -1
- package/lib/network/subnets/attnetsService.js +84 -6
- package/lib/network/subnets/attnetsService.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +7 -0
- package/lib/network/subnets/interface.d.ts.map +1 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/node/nodejs.d.ts +2 -0
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +37 -19
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/options.d.ts +3 -1
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +4 -2
- package/lib/node/options.js.map +1 -1
- package/lib/sync/range/batch.d.ts +2 -3
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +9 -22
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +2 -15
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/sync.d.ts +8 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +42 -22
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +1 -7
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +6 -34
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +24 -128
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts +2 -18
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +14 -99
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/blobs.d.ts +1 -7
- package/lib/util/blobs.d.ts.map +1 -1
- package/lib/util/blobs.js +0 -19
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/execution.d.ts +3 -4
- package/lib/util/execution.d.ts.map +1 -1
- package/lib/util/execution.js +1 -73
- package/lib/util/execution.js.map +1 -1
- package/lib/util/file.d.ts.map +1 -1
- package/lib/util/file.js +8 -9
- package/lib/util/file.js.map +1 -1
- package/lib/util/sszBytes.d.ts +5 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +34 -17
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +0 -5
- package/lib/util/types.d.ts.map +1 -1
- package/lib/util/types.js +1 -2
- package/lib/util/types.js.map +1 -1
- package/package.json +16 -17
- package/src/api/impl/beacon/blocks/index.ts +24 -64
- package/src/api/impl/beacon/pool/index.ts +26 -0
- package/src/api/impl/validator/index.ts +43 -29
- package/src/chain/GetBlobsTracker.ts +10 -39
- package/src/chain/blocks/blockInput/blockInput.ts +11 -343
- package/src/chain/blocks/blockInput/errors.ts +1 -2
- package/src/chain/blocks/blockInput/types.ts +2 -20
- package/src/chain/blocks/importBlock.ts +56 -72
- package/src/chain/blocks/importExecutionPayload.ts +44 -33
- package/src/chain/blocks/index.ts +5 -2
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +32 -21
- package/src/chain/blocks/types.ts +5 -31
- package/src/chain/blocks/verifyBlock.ts +30 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +6 -1
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +1 -3
- package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +43 -19
- package/src/chain/chain.ts +135 -37
- package/src/chain/emitter.ts +8 -8
- package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
- package/src/chain/errors/index.ts +0 -1
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +183 -0
- package/src/chain/interface.ts +7 -3
- package/src/chain/opPools/aggregatedAttestationPool.ts +245 -42
- package/src/chain/opPools/attestationPool.ts +15 -3
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +17 -6
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- package/src/chain/opPools/syncCommitteeMessagePool.ts +9 -2
- package/src/chain/opPools/syncContributionAndProofPool.ts +12 -2
- package/src/chain/options.ts +5 -2
- package/src/chain/produceBlock/produceBlockBody.ts +7 -3
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +1 -1
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
- package/src/chain/validation/executionPayloadBid.ts +14 -13
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- package/src/chain/validatorMonitor.ts +0 -6
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/repositories/blobSidecars.ts +0 -1
- package/src/execution/builder/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/engine/http.ts +19 -42
- package/src/execution/engine/interface.ts +18 -9
- package/src/execution/engine/jsonRpcTransport.ts +10 -22
- package/src/execution/engine/mock.ts +0 -7
- package/src/execution/engine/restTransport.ts +3 -22
- package/src/execution/engine/sszTypes.ts +0 -9
- package/src/execution/engine/transport.ts +8 -17
- package/src/execution/engine/types.ts +0 -17
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +1 -1
- package/src/metrics/metrics/beacon.ts +0 -30
- package/src/metrics/metrics/lodestar.ts +75 -18
- package/src/metrics/server/http.ts +5 -5
- package/src/network/core/networkCore.ts +6 -1
- package/src/network/core/networkCoreWorker.ts +1 -0
- package/src/network/core/networkCoreWorkerHandler.ts +4 -1
- package/src/network/core/types.ts +4 -1
- package/src/network/gossip/gossipsub.ts +11 -0
- package/src/network/gossip/interface.ts +0 -5
- package/src/network/gossip/topic.ts +0 -25
- package/src/network/interface.ts +0 -5
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +50 -60
- package/src/network/options.ts +4 -0
- package/src/network/peers/peerManager.ts +27 -2
- package/src/network/peers/utils/prioritizePeers.ts +14 -22
- package/src/network/peers/utils/subnetMap.ts +6 -3
- package/src/network/processor/extractSlotRootFns.ts +0 -9
- package/src/network/processor/gossipHandlers.ts +59 -159
- package/src/network/processor/gossipQueues/index.ts +0 -6
- package/src/network/processor/gossipValidatorFn.ts +0 -5
- package/src/network/processor/index.ts +25 -4
- package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
- package/src/network/reqresp/handlers/index.ts +0 -17
- package/src/network/reqresp/protocols.ts +0 -12
- package/src/network/reqresp/rateLimit.ts +1 -17
- package/src/network/reqresp/types.ts +0 -13
- package/src/network/subnets/attnetsService.ts +94 -6
- package/src/network/subnets/interface.ts +7 -0
- package/src/node/nodejs.ts +34 -15
- package/src/node/options.ts +5 -1
- package/src/sync/range/batch.ts +9 -21
- package/src/sync/range/chain.ts +2 -14
- package/src/sync/sync.ts +43 -22
- package/src/sync/unknownBlock.ts +1 -8
- package/src/sync/utils/downloadByRange.ts +31 -230
- package/src/sync/utils/downloadByRoot.ts +15 -142
- package/src/util/blobs.ts +0 -34
- package/src/util/execution.ts +8 -102
- package/src/util/file.ts +8 -9
- package/src/util/sszBytes.ts +40 -22
- package/src/util/types.ts +1 -8
- package/lib/chain/errors/blobSidecarError.d.ts +0 -108
- package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
- package/lib/chain/errors/blobSidecarError.js +0 -38
- package/lib/chain/errors/blobSidecarError.js.map +0 -1
- package/lib/chain/validation/blobSidecar.d.ts +0 -16
- package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
- package/lib/chain/validation/blobSidecar.js +0 -276
- package/lib/chain/validation/blobSidecar.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
- package/src/chain/errors/blobSidecarError.ts +0 -70
- package/src/chain/validation/blobSidecar.ts +0 -357
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
|
@@ -4,12 +4,8 @@ import {Logger, pruneSetToMax} from "@lodestar/utils";
|
|
|
4
4
|
import {BLOB_AND_PROOF_V2_RPC_BYTES} from "../execution/engine/types.js";
|
|
5
5
|
import {IExecutionEngine} from "../execution/index.js";
|
|
6
6
|
import {Metrics} from "../metrics/metrics.js";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
getBlobSidecarsFromExecution,
|
|
10
|
-
getDataColumnSidecarsFromExecution,
|
|
11
|
-
} from "../util/execution.js";
|
|
12
|
-
import {IBlockInput, isBlockInputBlobs} from "./blocks/blockInput/index.js";
|
|
7
|
+
import {DataColumnEngineResult, getDataColumnSidecarsFromExecution} from "../util/execution.js";
|
|
8
|
+
import {IBlockInput, isBlockInputColumns} from "./blocks/blockInput/index.js";
|
|
13
9
|
import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/index.js";
|
|
14
10
|
import {ChainEventEmitter} from "./emitter.js";
|
|
15
11
|
|
|
@@ -20,7 +16,7 @@ const MAX_TRACKED_BLOCK_ROOTS = 64;
|
|
|
20
16
|
|
|
21
17
|
export type GetBlobsTrackerInit = {
|
|
22
18
|
logger: Logger;
|
|
23
|
-
executionEngine: IExecutionEngine
|
|
19
|
+
executionEngine: Pick<IExecutionEngine, "getBlobs">;
|
|
24
20
|
emitter: ChainEventEmitter;
|
|
25
21
|
metrics: Metrics | null;
|
|
26
22
|
config: ChainForkConfig;
|
|
@@ -31,7 +27,7 @@ export type GetBlobsTrackerInit = {
|
|
|
31
27
|
*/
|
|
32
28
|
export class GetBlobsTracker {
|
|
33
29
|
logger: Logger;
|
|
34
|
-
executionEngine: IExecutionEngine
|
|
30
|
+
executionEngine: Pick<IExecutionEngine, "getBlobs">;
|
|
35
31
|
emitter: ChainEventEmitter;
|
|
36
32
|
metrics: Metrics | null;
|
|
37
33
|
config: ChainForkConfig;
|
|
@@ -51,6 +47,10 @@ export class GetBlobsTracker {
|
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
triggerGetBlobs(input: IBlockInput | PayloadEnvelopeInput): void {
|
|
50
|
+
if (!(input instanceof PayloadEnvelopeInput) && !isBlockInputColumns(input)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
54
|
if (this.activeReconstructions.has(input.blockRootHex)) {
|
|
55
55
|
this.pendingTriggers.add(input.blockRootHex);
|
|
56
56
|
return;
|
|
@@ -74,37 +74,6 @@ export class GetBlobsTracker {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
// The request is sent right away, before block processing issues newPayload: ELs that drop a
|
|
78
|
-
// transaction's blobs once the payload is validated can only answer a request that gets there first
|
|
79
|
-
if (!(input instanceof PayloadEnvelopeInput) && isBlockInputBlobs(input)) {
|
|
80
|
-
// there is not preallocation for blob sidecars like there is for columns sidecars so no need to
|
|
81
|
-
// store the index for the preallocated buffers
|
|
82
|
-
this.activeReconstructions.add(input.blockRootHex);
|
|
83
|
-
const logCtx = {slot: input.slot, root: input.blockRootHex};
|
|
84
|
-
this.logger.verbose("Trigger getBlobsV1 for block", logCtx);
|
|
85
|
-
let requestFailed = false;
|
|
86
|
-
getBlobSidecarsFromExecution(this.config, this.executionEngine, this.metrics, this.emitter, input)
|
|
87
|
-
.then(() => {
|
|
88
|
-
// EL errors and misses are handled inside the helper, blobs still missing means the attempt failed
|
|
89
|
-
if (!input.hasAllData()) {
|
|
90
|
-
requestFailed = true;
|
|
91
|
-
this.recordFailedAttempt(input.blockRootHex);
|
|
92
|
-
}
|
|
93
|
-
})
|
|
94
|
-
.catch((error) => {
|
|
95
|
-
this.logger.debug("Error during getBlobsV1 for block", logCtx, error as Error);
|
|
96
|
-
requestFailed = true;
|
|
97
|
-
this.recordFailedAttempt(input.blockRootHex);
|
|
98
|
-
})
|
|
99
|
-
.finally(() => {
|
|
100
|
-
this.logger.verbose("Completed getBlobsV1 for block", logCtx);
|
|
101
|
-
this.activeReconstructions.delete(input.blockRootHex);
|
|
102
|
-
this.retryPendingTrigger(input, requestFailed);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
77
|
let freeIndex = this.blobsAndProofsBuffers.findIndex(({inUse}) => !inUse);
|
|
109
78
|
if (freeIndex === -1) {
|
|
110
79
|
freeIndex = this.blobsAndProofsBuffers.length;
|
|
@@ -126,6 +95,8 @@ export class GetBlobsTracker {
|
|
|
126
95
|
const logCtx = {slot: input.slot, root: input.blockRootHex};
|
|
127
96
|
this.logger.verbose("Trigger getBlobsV2 for block", logCtx);
|
|
128
97
|
let requestFailed = false;
|
|
98
|
+
// The request is sent right away, before block processing issues newPayload: ELs that drop a
|
|
99
|
+
// transaction's blobs once the payload is validated can only answer a request that gets there first
|
|
129
100
|
getDataColumnSidecarsFromExecution(
|
|
130
101
|
this.config,
|
|
131
102
|
this.executionEngine,
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import {ForkName, ForkPostFulu, ForkPostGloas,
|
|
2
|
-
import {BeaconBlockBody,
|
|
3
|
-
import {
|
|
1
|
+
import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreFulu, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
|
|
2
|
+
import {BeaconBlockBody, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
|
|
3
|
+
import {prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
|
|
4
4
|
import {VersionedHashes} from "../../../execution/index.js";
|
|
5
5
|
import {kzgCommitmentToVersionedHash} from "../../../util/blobs.js";
|
|
6
6
|
import {BlockInputError, BlockInputErrorCode} from "./errors.js";
|
|
7
7
|
import {
|
|
8
|
-
AddBlob,
|
|
9
8
|
AddBlock,
|
|
10
9
|
AddColumn,
|
|
11
|
-
BlobMeta,
|
|
12
|
-
BlobWithSource,
|
|
13
10
|
BlockInputInit,
|
|
14
11
|
ColumnWithSource,
|
|
15
12
|
CreateBlockInputMeta,
|
|
@@ -17,22 +14,17 @@ import {
|
|
|
17
14
|
DAType,
|
|
18
15
|
IBlockInput,
|
|
19
16
|
LogMetaBasic,
|
|
20
|
-
LogMetaBlobs,
|
|
21
17
|
LogMetaColumns,
|
|
22
18
|
MissingColumnMeta,
|
|
23
19
|
PromiseParts,
|
|
24
20
|
SourceMeta,
|
|
25
21
|
} from "./types.js";
|
|
26
22
|
|
|
27
|
-
export type BlockInput = BlockInputPreData |
|
|
23
|
+
export type BlockInput = BlockInputPreData | BlockInputColumns | BlockInputNoData;
|
|
28
24
|
|
|
29
|
-
export function
|
|
25
|
+
export function isBlockInputPreData(blockInput: IBlockInput): blockInput is BlockInputPreData {
|
|
30
26
|
return blockInput.type === DAType.PreData;
|
|
31
27
|
}
|
|
32
|
-
export function isBlockInputBlobs(blockInput: IBlockInput): blockInput is BlockInputBlobs {
|
|
33
|
-
return blockInput.type === DAType.Blobs;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
28
|
export function isBlockInputColumns(blockInput: IBlockInput): blockInput is BlockInputColumns {
|
|
37
29
|
return blockInput.type === DAType.Columns;
|
|
38
30
|
}
|
|
@@ -189,16 +181,18 @@ abstract class AbstractBlockInput<F extends ForkName = ForkName, TData extends D
|
|
|
189
181
|
type BlockInputPreDataState = {
|
|
190
182
|
hasBlock: true;
|
|
191
183
|
hasAllData: true;
|
|
192
|
-
block: SignedBeaconBlock<
|
|
184
|
+
block: SignedBeaconBlock<ForkPreFulu>;
|
|
193
185
|
source: SourceMeta;
|
|
194
186
|
timeCompleteSec: number;
|
|
195
187
|
};
|
|
196
188
|
|
|
197
189
|
/**
|
|
198
|
-
* Pre-
|
|
190
|
+
* Pre-fulu BlockInput, it only has a single state.
|
|
199
191
|
* - the block simply exists
|
|
192
|
+
*
|
|
193
|
+
* Legacy deneb..electra blob sidecars are not tracked.
|
|
200
194
|
*/
|
|
201
|
-
export class BlockInputPreData extends AbstractBlockInput<
|
|
195
|
+
export class BlockInputPreData extends AbstractBlockInput<ForkPreFulu, null> {
|
|
202
196
|
type = DAType.PreData as const;
|
|
203
197
|
|
|
204
198
|
state: BlockInputPreDataState;
|
|
@@ -210,7 +204,7 @@ export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
|
|
|
210
204
|
this.blockPromise.resolve(state.block);
|
|
211
205
|
}
|
|
212
206
|
|
|
213
|
-
static createFromBlock(props: AddBlock<
|
|
207
|
+
static createFromBlock(props: AddBlock<ForkPreFulu> & CreateBlockInputMeta): BlockInputPreData {
|
|
214
208
|
const init: BlockInputInit = {
|
|
215
209
|
daOutOfRange: props.daOutOfRange,
|
|
216
210
|
timeCreated: props.seenTimestampSec,
|
|
@@ -250,332 +244,6 @@ export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
|
|
|
250
244
|
}
|
|
251
245
|
}
|
|
252
246
|
|
|
253
|
-
// Blobs DA
|
|
254
|
-
|
|
255
|
-
export type ForkBlobsDA = ForkName.deneb | ForkName.electra;
|
|
256
|
-
|
|
257
|
-
type BlockInputBlobsState =
|
|
258
|
-
| {
|
|
259
|
-
hasBlock: true;
|
|
260
|
-
hasAllData: true;
|
|
261
|
-
versionedHashes: VersionedHashes;
|
|
262
|
-
block: SignedBeaconBlock<ForkBlobsDA>;
|
|
263
|
-
source: SourceMeta;
|
|
264
|
-
timeCompleteSec: number;
|
|
265
|
-
}
|
|
266
|
-
| {
|
|
267
|
-
hasBlock: true;
|
|
268
|
-
hasAllData: false;
|
|
269
|
-
versionedHashes: VersionedHashes;
|
|
270
|
-
block: SignedBeaconBlock<ForkBlobsDA>;
|
|
271
|
-
source: SourceMeta;
|
|
272
|
-
}
|
|
273
|
-
| {
|
|
274
|
-
hasBlock: false;
|
|
275
|
-
hasAllData: false;
|
|
276
|
-
};
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* With blobs, BlockInput has several states:
|
|
280
|
-
* - The block is seen and all blobs are seen
|
|
281
|
-
* - The block is seen and all blobs are not yet seen
|
|
282
|
-
* - The block is yet not seen and its unknown if all blobs are seen
|
|
283
|
-
*/
|
|
284
|
-
export class BlockInputBlobs extends AbstractBlockInput<ForkBlobsDA, deneb.BlobSidecars> {
|
|
285
|
-
type = DAType.Blobs as const;
|
|
286
|
-
|
|
287
|
-
state: BlockInputBlobsState;
|
|
288
|
-
private blobsCache = new Map<BlobIndex, BlobWithSource>();
|
|
289
|
-
|
|
290
|
-
private constructor(init: BlockInputInit, state: BlockInputBlobsState) {
|
|
291
|
-
super(init);
|
|
292
|
-
this.state = state;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
static createFromBlock(props: AddBlock<ForkBlobsDA> & CreateBlockInputMeta): BlockInputBlobs {
|
|
296
|
-
const hasAllData = props.daOutOfRange || props.block.message.body.blobKzgCommitments.length === 0;
|
|
297
|
-
|
|
298
|
-
const state = {
|
|
299
|
-
hasBlock: true,
|
|
300
|
-
hasAllData,
|
|
301
|
-
versionedHashes: props.block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
|
|
302
|
-
block: props.block,
|
|
303
|
-
source: {
|
|
304
|
-
source: props.source,
|
|
305
|
-
seenTimestampSec: props.seenTimestampSec,
|
|
306
|
-
peerIdStr: props.peerIdStr,
|
|
307
|
-
},
|
|
308
|
-
timeCompleteSec: hasAllData ? props.seenTimestampSec : undefined,
|
|
309
|
-
} as BlockInputBlobsState;
|
|
310
|
-
const init: BlockInputInit = {
|
|
311
|
-
daOutOfRange: props.daOutOfRange,
|
|
312
|
-
timeCreated: props.seenTimestampSec,
|
|
313
|
-
forkName: props.forkName,
|
|
314
|
-
slot: props.block.message.slot,
|
|
315
|
-
blockRootHex: props.blockRootHex,
|
|
316
|
-
parentRootHex: toRootHex(props.block.message.parentRoot),
|
|
317
|
-
};
|
|
318
|
-
const blockInput = new BlockInputBlobs(init, state);
|
|
319
|
-
blockInput.blockPromise.resolve(props.block);
|
|
320
|
-
if (hasAllData) {
|
|
321
|
-
blockInput.dataPromise.resolve([]);
|
|
322
|
-
}
|
|
323
|
-
return blockInput;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
static createFromBlob(props: AddBlob & CreateBlockInputMeta): BlockInputBlobs {
|
|
327
|
-
const state: BlockInputBlobsState = {
|
|
328
|
-
hasBlock: false,
|
|
329
|
-
hasAllData: false,
|
|
330
|
-
};
|
|
331
|
-
const init: BlockInputInit = {
|
|
332
|
-
daOutOfRange: props.daOutOfRange,
|
|
333
|
-
timeCreated: props.seenTimestampSec,
|
|
334
|
-
forkName: props.forkName,
|
|
335
|
-
blockRootHex: props.blockRootHex,
|
|
336
|
-
parentRootHex: toRootHex(props.blobSidecar.signedBlockHeader.message.parentRoot),
|
|
337
|
-
slot: props.blobSidecar.signedBlockHeader.message.slot,
|
|
338
|
-
};
|
|
339
|
-
const blockInput = new BlockInputBlobs(init, state);
|
|
340
|
-
blockInput.blobsCache.set(props.blobSidecar.index, {
|
|
341
|
-
blobSidecar: props.blobSidecar,
|
|
342
|
-
source: props.source,
|
|
343
|
-
seenTimestampSec: props.seenTimestampSec,
|
|
344
|
-
peerIdStr: props.peerIdStr,
|
|
345
|
-
});
|
|
346
|
-
return blockInput;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
getLogMeta(): LogMetaBlobs {
|
|
350
|
-
return {
|
|
351
|
-
slot: this.slot,
|
|
352
|
-
blockRoot: prettyBytes(this.blockRootHex),
|
|
353
|
-
timeCreatedSec: this.timeCreatedSec,
|
|
354
|
-
expectedBlobs: this.state.hasBlock ? this.state.block.message.body.blobKzgCommitments.length : "unknown",
|
|
355
|
-
receivedBlobs: this.blobsCache.size,
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
addBlock(
|
|
360
|
-
{blockRootHex, block, source, seenTimestampSec, peerIdStr}: AddBlock<ForkBlobsDA>,
|
|
361
|
-
opts = {throwOnDuplicateAdd: true}
|
|
362
|
-
): void {
|
|
363
|
-
// this check suffices for checking slot, parentRoot, and forkName
|
|
364
|
-
if (blockRootHex !== this.blockRootHex) {
|
|
365
|
-
throw new BlockInputError(
|
|
366
|
-
{
|
|
367
|
-
code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
|
|
368
|
-
blockInputRoot: this.blockRootHex,
|
|
369
|
-
mismatchedRoot: blockRootHex,
|
|
370
|
-
source,
|
|
371
|
-
peerId: `${peerIdStr}`,
|
|
372
|
-
},
|
|
373
|
-
"addBlock blockRootHex does not match BlockInput.blockRootHex"
|
|
374
|
-
);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
if (!opts.throwOnDuplicateAdd) {
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
if (this.state.hasBlock) {
|
|
382
|
-
throw new BlockInputError(
|
|
383
|
-
{
|
|
384
|
-
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
385
|
-
blockRoot: this.blockRootHex,
|
|
386
|
-
},
|
|
387
|
-
"Cannot addBlock to BlockInputBlobs after it already has a block"
|
|
388
|
-
);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
for (const {blobSidecar} of this.blobsCache.values()) {
|
|
392
|
-
if (!blockAndBlobArePaired(block, blobSidecar)) {
|
|
393
|
-
this.blobsCache.delete(blobSidecar.index);
|
|
394
|
-
// TODO: (@matthewkeil) spec says to ignore invalid blobs but should we downscore the peer maybe?
|
|
395
|
-
// this.logger?.error(`Removing blobIndex=${blobSidecar.index} from BlockInput`, {}, err);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
const hasAllData = this.blobsCache.size === block.message.body.blobKzgCommitments.length;
|
|
400
|
-
|
|
401
|
-
this.state = {
|
|
402
|
-
...this.state,
|
|
403
|
-
hasBlock: true,
|
|
404
|
-
hasAllData,
|
|
405
|
-
block,
|
|
406
|
-
versionedHashes: block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
|
|
407
|
-
source: {
|
|
408
|
-
source,
|
|
409
|
-
seenTimestampSec,
|
|
410
|
-
peerIdStr,
|
|
411
|
-
},
|
|
412
|
-
timeCompleteSec: hasAllData ? seenTimestampSec : undefined,
|
|
413
|
-
} as BlockInputBlobsState;
|
|
414
|
-
this.blockPromise.resolve(block);
|
|
415
|
-
if (hasAllData) {
|
|
416
|
-
this.dataPromise.resolve(this.getBlobs());
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
hasBlob(blobIndex: BlobIndex): boolean {
|
|
421
|
-
return this.blobsCache.has(blobIndex);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
getBlob(blobIndex: BlobIndex): deneb.BlobSidecar | undefined {
|
|
425
|
-
return this.blobsCache.get(blobIndex)?.blobSidecar;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
addBlob(
|
|
429
|
-
{blockRootHex, blobSidecar, source, peerIdStr, seenTimestampSec}: AddBlob,
|
|
430
|
-
opts = {throwOnDuplicateAdd: true}
|
|
431
|
-
): void {
|
|
432
|
-
// this check suffices for checking slot, parentRoot, and forkName
|
|
433
|
-
if (blockRootHex !== this.blockRootHex) {
|
|
434
|
-
throw new BlockInputError(
|
|
435
|
-
{
|
|
436
|
-
code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
|
|
437
|
-
blockInputRoot: this.blockRootHex,
|
|
438
|
-
mismatchedRoot: blockRootHex,
|
|
439
|
-
source: source,
|
|
440
|
-
peerId: `${peerIdStr}`,
|
|
441
|
-
},
|
|
442
|
-
"Blob BeaconBlockHeader blockRootHex does not match BlockInput.blockRootHex"
|
|
443
|
-
);
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
const isDuplicate = this.blobsCache.has(blobSidecar.index);
|
|
447
|
-
if (isDuplicate && opts.throwOnDuplicateAdd) {
|
|
448
|
-
throw new BlockInputError(
|
|
449
|
-
{
|
|
450
|
-
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
451
|
-
blockRoot: this.blockRootHex,
|
|
452
|
-
},
|
|
453
|
-
"Cannot addBlob to BlockInputBlobs with duplicate blobIndex"
|
|
454
|
-
);
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
if (this.state.hasBlock) {
|
|
458
|
-
assertBlockAndBlobArePaired(this.blockRootHex, this.state.block, blobSidecar);
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
if (isDuplicate) {
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
this.blobsCache.set(blobSidecar.index, {blobSidecar, source, seenTimestampSec, peerIdStr});
|
|
466
|
-
|
|
467
|
-
if (this.state.hasBlock && this.blobsCache.size === this.state.block.message.body.blobKzgCommitments.length) {
|
|
468
|
-
this.state = {
|
|
469
|
-
...this.state,
|
|
470
|
-
hasAllData: true,
|
|
471
|
-
timeCompleteSec: seenTimestampSec,
|
|
472
|
-
};
|
|
473
|
-
this.dataPromise.resolve([...this.blobsCache.values()].map(({blobSidecar}) => blobSidecar));
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
getVersionedHashes(): VersionedHashes {
|
|
478
|
-
if (!this.state.hasBlock) {
|
|
479
|
-
throw new BlockInputError(
|
|
480
|
-
{
|
|
481
|
-
code: BlockInputErrorCode.INCOMPLETE_DATA,
|
|
482
|
-
...this.getLogMeta(),
|
|
483
|
-
},
|
|
484
|
-
"Cannot get versioned hashes. Block is unknown"
|
|
485
|
-
);
|
|
486
|
-
}
|
|
487
|
-
return this.state.versionedHashes;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
getMissingBlobMeta(): BlobMeta[] {
|
|
491
|
-
if (!this.state.hasBlock) {
|
|
492
|
-
throw new BlockInputError(
|
|
493
|
-
{
|
|
494
|
-
code: BlockInputErrorCode.INCOMPLETE_DATA,
|
|
495
|
-
...this.getLogMeta(),
|
|
496
|
-
},
|
|
497
|
-
"Cannot get missing blobs. Block is unknown"
|
|
498
|
-
);
|
|
499
|
-
}
|
|
500
|
-
if (this.state.hasAllData) {
|
|
501
|
-
return [];
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
const blobMeta: BlobMeta[] = [];
|
|
505
|
-
const versionedHashes = this.state.versionedHashes;
|
|
506
|
-
for (let index = 0; index < versionedHashes.length; index++) {
|
|
507
|
-
if (!this.blobsCache.has(index)) {
|
|
508
|
-
blobMeta.push({
|
|
509
|
-
index,
|
|
510
|
-
blockRoot: fromHex(this.blockRootHex),
|
|
511
|
-
versionedHash: versionedHashes[index],
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
return blobMeta;
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
getAllBlobsWithSource(): BlobWithSource[] {
|
|
519
|
-
if (!this.state.hasAllData) {
|
|
520
|
-
throw new BlockInputError(
|
|
521
|
-
{
|
|
522
|
-
code: BlockInputErrorCode.INCOMPLETE_DATA,
|
|
523
|
-
...this.getLogMeta(),
|
|
524
|
-
},
|
|
525
|
-
"Cannot get all blobs. DA status is not complete"
|
|
526
|
-
);
|
|
527
|
-
}
|
|
528
|
-
return [...this.blobsCache.values()];
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
getBlobs(): deneb.BlobSidecars {
|
|
532
|
-
return this.getAllBlobsWithSource().map(({blobSidecar}) => blobSidecar);
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
getSerializedCacheKeys(): object[] {
|
|
536
|
-
const objects: object[] = [];
|
|
537
|
-
|
|
538
|
-
if (this.state.hasBlock) {
|
|
539
|
-
objects.push(this.state.block);
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
for (const {blobSidecar} of this.blobsCache.values()) {
|
|
543
|
-
objects.push(blobSidecar);
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
return objects;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
function blockAndBlobArePaired(block: SignedBeaconBlock<ForkBlobsDA>, blobSidecar: deneb.BlobSidecar): boolean {
|
|
551
|
-
const blockCommitment = block.message.body.blobKzgCommitments[blobSidecar.index];
|
|
552
|
-
if (!blockCommitment || !blobSidecar.kzgCommitment) {
|
|
553
|
-
return false;
|
|
554
|
-
}
|
|
555
|
-
return byteArrayEquals(blockCommitment, blobSidecar.kzgCommitment);
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
function assertBlockAndBlobArePaired(
|
|
559
|
-
blockRootHex: string,
|
|
560
|
-
block: SignedBeaconBlock<ForkBlobsDA>,
|
|
561
|
-
blobSidecar: deneb.BlobSidecar
|
|
562
|
-
): void {
|
|
563
|
-
if (!blockAndBlobArePaired(block, blobSidecar)) {
|
|
564
|
-
// TODO: (@matthewkeil) should this eject the bad blob instead? No way to tell if the blob or the block
|
|
565
|
-
// has the invalid commitment. Guessing it would be the blob though because we match via block
|
|
566
|
-
// hashTreeRoot and we do not take a hashTreeRoot of the BlobSidecar
|
|
567
|
-
throw new BlockInputError(
|
|
568
|
-
{
|
|
569
|
-
code: BlockInputErrorCode.MISMATCHED_KZG_COMMITMENT,
|
|
570
|
-
blockRoot: blockRootHex,
|
|
571
|
-
slot: block.message.slot,
|
|
572
|
-
sidecarIndex: blobSidecar.index,
|
|
573
|
-
},
|
|
574
|
-
"BlobSidecar commitment does not match block commitment"
|
|
575
|
-
);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
|
|
579
247
|
// Columns DA
|
|
580
248
|
|
|
581
249
|
export type ForkColumnsDA = ForkName.fulu;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {Slot} from "@lodestar/types";
|
|
2
2
|
import {LodestarError} from "@lodestar/utils";
|
|
3
3
|
import {PeerIdStr} from "../../../util/peerId.js";
|
|
4
|
-
import {BlockInputSource,
|
|
4
|
+
import {BlockInputSource, LogMetaColumns} from "./types.js";
|
|
5
5
|
|
|
6
6
|
export enum BlockInputErrorCode {
|
|
7
7
|
// Bad Arguments
|
|
@@ -42,7 +42,6 @@ export type BlockInputErrorType =
|
|
|
42
42
|
sidecarIndex: number;
|
|
43
43
|
commitmentIndex?: number;
|
|
44
44
|
}
|
|
45
|
-
| (LogMetaBlobs & {code: BlockInputErrorCode.INCOMPLETE_DATA})
|
|
46
45
|
| (LogMetaColumns & {code: BlockInputErrorCode.INCOMPLETE_DATA});
|
|
47
46
|
|
|
48
47
|
export class BlockInputError extends LodestarError<BlockInputErrorType> {}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import {ForkName} from "@lodestar/params";
|
|
2
|
-
import {ColumnIndex, DataColumnSidecar, RootHex, SignedBeaconBlock, Slot,
|
|
2
|
+
import {ColumnIndex, DataColumnSidecar, RootHex, SignedBeaconBlock, Slot, fulu} from "@lodestar/types";
|
|
3
3
|
import {VersionedHashes} from "../../../execution/index.js";
|
|
4
4
|
|
|
5
5
|
export enum DAType {
|
|
6
6
|
PreData = "pre-data",
|
|
7
|
-
Blobs = "blobs",
|
|
8
7
|
Columns = "columns",
|
|
9
8
|
NoData = "no-data",
|
|
10
9
|
}
|
|
11
10
|
|
|
12
|
-
export type DAData = null |
|
|
11
|
+
export type DAData = null | fulu.DataColumnSidecar[];
|
|
13
12
|
|
|
14
13
|
/**
|
|
15
14
|
* Represents were input originated. Blocks and Data can come from different
|
|
@@ -37,11 +36,6 @@ export type LogMetaBasic = {
|
|
|
37
36
|
timeCreatedSec: number;
|
|
38
37
|
};
|
|
39
38
|
|
|
40
|
-
export type LogMetaBlobs = LogMetaBasic & {
|
|
41
|
-
expectedBlobs: number | string;
|
|
42
|
-
receivedBlobs: number;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
39
|
export type LogMetaColumns = LogMetaBasic & {
|
|
46
40
|
expectedColumns: number;
|
|
47
41
|
receivedColumns: number;
|
|
@@ -55,8 +49,6 @@ export type SourceMeta = {
|
|
|
55
49
|
|
|
56
50
|
export type BlockWithSource = SourceMeta & {block: SignedBeaconBlock; blockRootHex: RootHex};
|
|
57
51
|
|
|
58
|
-
export type BlobWithSource = SourceMeta & {blobSidecar: deneb.BlobSidecar};
|
|
59
|
-
|
|
60
52
|
export type ColumnWithSource = SourceMeta & {columnSidecar: fulu.DataColumnSidecar};
|
|
61
53
|
|
|
62
54
|
export type BlockHeaderMeta = {
|
|
@@ -82,20 +74,10 @@ export type AddBlock<F extends ForkName = ForkName> = SourceMeta & {
|
|
|
82
74
|
blockRootHex: string;
|
|
83
75
|
};
|
|
84
76
|
|
|
85
|
-
export type AddBlob = BlobWithSource & {
|
|
86
|
-
blockRootHex: RootHex;
|
|
87
|
-
};
|
|
88
|
-
|
|
89
77
|
export type AddColumn = ColumnWithSource & {
|
|
90
78
|
blockRootHex: RootHex;
|
|
91
79
|
};
|
|
92
80
|
|
|
93
|
-
export type BlobMeta = {
|
|
94
|
-
index: number;
|
|
95
|
-
blockRoot: Uint8Array;
|
|
96
|
-
versionedHash: Uint8Array;
|
|
97
|
-
};
|
|
98
|
-
|
|
99
81
|
export type MissingColumnMeta = {
|
|
100
82
|
missing: ColumnIndex[];
|
|
101
83
|
versionedHashes: VersionedHashes;
|