@lodestar/beacon-node 1.51.0-dev.e521668760 → 1.51.0-dev.e757bec248
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/api.js +1 -1
- package/lib/api/impl/api.js.map +1 -1
- package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +29 -34
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/index.d.ts +2 -1
- package/lib/api/impl/beacon/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/index.js +2 -2
- package/lib/api/impl/beacon/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 +5 -2
- 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 +8 -2
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +3 -2
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +17 -9
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +3 -0
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +105 -10
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/options.d.ts +2 -0
- package/lib/api/options.d.ts.map +1 -1
- package/lib/api/options.js +1 -0
- package/lib/api/options.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +11 -0
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +85 -27
- package/lib/chain/GetBlobsTracker.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/utils/archiveBlocks.d.ts +4 -0
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +9 -7
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +6 -11
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +58 -17
- package/lib/chain/blocks/importExecutionPayload.js.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 +12 -9
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -0
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/types.js +5 -0
- 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 +1 -1
- 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 +8 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +5 -5
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +1 -1
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/worker.js +1 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.js +1 -1
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.js +1 -1
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +3 -2
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +8 -5
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +1 -1
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +1 -1
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadBid.js +2 -0
- package/lib/chain/errors/executionPayloadBid.js.map +1 -1
- package/lib/chain/errors/inclusionList.d.ts +60 -0
- package/lib/chain/errors/inclusionList.d.ts.map +1 -0
- package/lib/chain/errors/inclusionList.js +19 -0
- package/lib/chain/errors/inclusionList.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +1 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/interface.d.ts +4 -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.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +23 -10
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +15 -4
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
- package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
- package/lib/chain/opPools/inclusionListStore.js +171 -0
- package/lib/chain/opPools/inclusionListStore.js.map +1 -0
- 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 +17 -7
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
- 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 +11 -3
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- 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 +0 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +30 -10
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +1 -1
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +1 -1
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +37 -158
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/inclusionList.d.ts +14 -0
- package/lib/chain/validation/inclusionList.d.ts.map +1 -0
- package/lib/chain/validation/inclusionList.js +150 -0
- package/lib/chain/validation/inclusionList.js.map +1 -0
- package/lib/chain/validation/index.d.ts +1 -0
- package/lib/chain/validation/index.d.ts.map +1 -1
- package/lib/chain/validation/index.js +1 -0
- package/lib/chain/validation/index.js.map +1 -1
- package/lib/db/beacon.d.ts +7 -0
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +34 -0
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/dataColumnStore.d.ts +1 -1
- package/lib/db/dataColumnStore.d.ts.map +1 -1
- package/lib/db/dataColumnStore.js +1 -4
- package/lib/db/dataColumnStore.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/interface.d.ts +1 -0
- package/lib/db/interface.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
- package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
- package/lib/execution/builder/validateBid.d.ts.map +1 -1
- package/lib/execution/builder/validateBid.js +14 -1
- package/lib/execution/builder/validateBid.js.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
- package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
- package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
- package/lib/execution/engine/disabled.d.ts +1 -0
- package/lib/execution/engine/disabled.d.ts.map +1 -1
- package/lib/execution/engine/disabled.js +3 -0
- package/lib/execution/engine/disabled.js.map +1 -1
- package/lib/execution/engine/http.d.ts +8 -2
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +27 -4
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +12 -3
- 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 +3 -2
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +33 -9
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +31 -7
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +5 -3
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/payloadIdCache.js +15 -4
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +2 -1
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js +3 -0
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/sszTypes.d.ts +38 -38
- package/lib/execution/engine/transport.d.ts +5 -2
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +25 -1
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +19 -6
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +16 -0
- package/lib/metrics/metrics/beacon.d.ts.map +1 -1
- package/lib/metrics/metrics/beacon.js +35 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +15 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +30 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +2 -0
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +3 -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 -0
- 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 +2 -0
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -2
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +1 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -5
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +13 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +4 -1
- 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 +4 -1
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +11 -1
- 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.map +1 -1
- package/lib/network/peers/peerManager.d.ts +2 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
- package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
- package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +76 -27
- 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 +6 -0
- 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 +5 -1
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +5 -0
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +37 -26
- 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 +6 -0
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
- package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
- package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/index.js +5 -0
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +1 -0
- package/lib/network/reqresp/protocols.d.ts.map +1 -1
- package/lib/network/reqresp/protocols.js +5 -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 +4 -0
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +5 -2
- package/lib/network/reqresp/types.d.ts.map +1 -1
- package/lib/network/reqresp/types.js +3 -0
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/node/nodejs.d.ts +1 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +10 -2
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/options.d.ts +1 -1
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +1 -1
- package/lib/node/options.js.map +1 -1
- package/lib/sync/interface.d.ts.map +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/sync.d.ts +7 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +61 -3
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +42 -18
- package/lib/sync/unknownBlock.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/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.js +2 -2
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +31 -32
- package/src/api/impl/api.ts +1 -1
- package/src/api/impl/beacon/blocks/index.ts +57 -62
- package/src/api/impl/beacon/index.ts +3 -1
- package/src/api/impl/beacon/pool/index.ts +5 -1
- package/src/api/impl/beacon/state/index.ts +10 -1
- package/src/api/impl/beacon/state/utils.ts +20 -10
- package/src/api/impl/debug/index.ts +4 -0
- package/src/api/impl/validator/index.ts +135 -10
- package/src/api/options.ts +3 -0
- package/src/chain/GetBlobsTracker.ts +97 -38
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
- package/src/chain/blocks/importBlock.ts +11 -14
- package/src/chain/blocks/importExecutionPayload.ts +81 -23
- package/src/chain/blocks/index.ts +6 -2
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
- package/src/chain/blocks/types.ts +5 -0
- package/src/chain/blocks/verifyBlock.ts +1 -0
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +10 -1
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
- package/src/chain/bls/multithread/index.ts +5 -5
- package/src/chain/bls/multithread/types.ts +1 -1
- package/src/chain/bls/multithread/worker.ts +1 -5
- package/src/chain/bls/singleThread.ts +1 -1
- package/src/chain/bls/utils.ts +1 -1
- package/src/chain/chain.ts +9 -5
- package/src/chain/errors/blockError.ts +1 -1
- package/src/chain/errors/executionPayloadBid.ts +12 -0
- package/src/chain/errors/inclusionList.ts +38 -0
- package/src/chain/errors/index.ts +1 -0
- package/src/chain/interface.ts +4 -3
- package/src/chain/opPools/aggregatedAttestationPool.ts +25 -9
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/inclusionListStore.ts +208 -0
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
- package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/options.ts +0 -2
- package/src/chain/produceBlock/produceBlockBody.ts +60 -19
- package/src/chain/regen/interface.ts +1 -1
- package/src/chain/validation/executionPayloadBid.ts +54 -183
- package/src/chain/validation/inclusionList.ts +192 -0
- package/src/chain/validation/index.ts +1 -0
- package/src/db/beacon.ts +44 -0
- package/src/db/dataColumnStore.ts +2 -4
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/db/interface.ts +2 -0
- package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
- package/src/execution/builder/validateBid.ts +23 -2
- package/src/execution/engine/blobVersionedHashes.ts +1 -1
- package/src/execution/engine/disabled.ts +4 -0
- package/src/execution/engine/http.ts +40 -5
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +28 -4
- package/src/execution/engine/jsonRpcTransport.ts +46 -9
- package/src/execution/engine/mock.ts +32 -7
- package/src/execution/engine/payloadIdCache.ts +24 -6
- package/src/execution/engine/restTransport.ts +15 -1
- package/src/execution/engine/transport.ts +7 -2
- package/src/execution/engine/types.ts +44 -7
- package/src/index.ts +2 -0
- package/src/metrics/metrics/beacon.ts +37 -0
- package/src/metrics/metrics/lodestar.ts +31 -0
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +5 -0
- package/src/network/core/networkCoreWorker.ts +1 -0
- package/src/network/core/networkCoreWorkerHandler.ts +4 -0
- package/src/network/core/types.ts +2 -0
- package/src/network/gossip/interface.ts +5 -0
- package/src/network/gossip/topic.ts +14 -0
- package/src/network/interface.ts +4 -0
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +19 -1
- package/src/network/options.ts +2 -0
- package/src/network/peers/peerManager.ts +1 -1
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
- package/src/network/processor/gossipHandlers.ts +96 -29
- package/src/network/processor/gossipQueues/index.ts +6 -0
- package/src/network/processor/gossipValidatorFn.ts +5 -0
- package/src/network/processor/index.ts +33 -24
- package/src/network/processor/types.ts +1 -1
- package/src/network/reqresp/ReqRespBeaconNode.ts +7 -0
- package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
- package/src/network/reqresp/handlers/index.ts +5 -0
- package/src/network/reqresp/protocols.ts +6 -0
- package/src/network/reqresp/rateLimit.ts +4 -0
- package/src/network/reqresp/types.ts +6 -0
- package/src/node/nodejs.ts +24 -7
- package/src/node/options.ts +4 -5
- package/src/sync/interface.ts +1 -0
- package/src/sync/sync.ts +65 -4
- package/src/sync/unknownBlock.ts +47 -28
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +2 -2
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {DataAvailabilityStatus} from "@lodestar/state-transition";
|
|
2
|
+
import {TimeoutError} from "@lodestar/utils";
|
|
3
|
+
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
2
4
|
import {DAData, DAType, IBlockInput} from "./blockInput/index.js";
|
|
3
5
|
|
|
4
6
|
// we can now wait for full 12 seconds because unavailable block sync will try pulling
|
|
@@ -22,7 +24,14 @@ export async function verifyBlocksDataAvailability(
|
|
|
22
24
|
for (const blockInput of blocks) {
|
|
23
25
|
// block verification is triggered on a verified gossip block so we only need to wait for all data
|
|
24
26
|
if (!blockInput.hasAllData()) {
|
|
25
|
-
promises.push(
|
|
27
|
+
promises.push(
|
|
28
|
+
blockInput.waitForAllData(BLOB_AVAILABILITY_TIMEOUT, signal).catch((e) => {
|
|
29
|
+
if (e instanceof TimeoutError) {
|
|
30
|
+
throw new BlockError(blockInput.getBlock(), {code: BlockErrorCode.DATA_UNAVAILABLE});
|
|
31
|
+
}
|
|
32
|
+
throw e;
|
|
33
|
+
})
|
|
34
|
+
);
|
|
26
35
|
}
|
|
27
36
|
}
|
|
28
37
|
await Promise.all(promises);
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
+
import {ChainForkConfig} from "@lodestar/config";
|
|
1
2
|
import {DataAvailabilityStatus} from "@lodestar/state-transition";
|
|
2
3
|
import {gloas} from "@lodestar/types";
|
|
4
|
+
import {TimeoutError} from "@lodestar/utils";
|
|
3
5
|
import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
|
|
4
|
-
|
|
5
|
-
// we can now wait for full 12 seconds because sync and reconstruction will try pulling
|
|
6
|
-
// the data columns from the network anyway while the envelope is being processed
|
|
7
|
-
export const PAYLOAD_DATA_AVAILABILITY_TIMEOUT = 12_000;
|
|
6
|
+
import {PayloadError, PayloadErrorCode} from "./importExecutionPayload.js";
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* Verifies that all payload envelope inputs have their data columns available.
|
|
11
|
-
* - Waits a max of
|
|
10
|
+
* - Waits a max of one slot duration of the payload's fork for all data to be available
|
|
12
11
|
* - Returns the time at which all data was available
|
|
13
12
|
* - Returns the data availability status for each payload input
|
|
14
13
|
*/
|
|
15
14
|
export async function verifyPayloadsDataAvailability(
|
|
15
|
+
config: ChainForkConfig,
|
|
16
16
|
payloadInputs: PayloadEnvelopeInput[],
|
|
17
17
|
signal: AbortSignal
|
|
18
18
|
): Promise<{
|
|
@@ -22,7 +22,15 @@ export async function verifyPayloadsDataAvailability(
|
|
|
22
22
|
const promises: Promise<gloas.DataColumnSidecar[]>[] = [];
|
|
23
23
|
for (const payloadInput of payloadInputs) {
|
|
24
24
|
if (!payloadInput.hasAllData()) {
|
|
25
|
-
|
|
25
|
+
// Sync and reconstruction keep pulling the data columns from the network while we wait
|
|
26
|
+
promises.push(
|
|
27
|
+
payloadInput.waitForAllData(config.getSlotDurationMs(payloadInput.forkName), signal).catch((e) => {
|
|
28
|
+
if (e instanceof TimeoutError) {
|
|
29
|
+
throw new PayloadError(payloadInput, {code: PayloadErrorCode.DATA_UNAVAILABLE});
|
|
30
|
+
}
|
|
31
|
+
throw e;
|
|
32
|
+
})
|
|
33
|
+
);
|
|
26
34
|
}
|
|
27
35
|
}
|
|
28
36
|
await Promise.all(promises);
|
|
@@ -342,7 +342,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
342
342
|
} else {
|
|
343
343
|
this.jobs.push(job);
|
|
344
344
|
}
|
|
345
|
-
callInNextEventLoop(this.runJob);
|
|
345
|
+
callInNextEventLoop(() => void this.runJob());
|
|
346
346
|
}
|
|
347
347
|
}
|
|
348
348
|
|
|
@@ -377,7 +377,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
377
377
|
let completedJobsCount = 0;
|
|
378
378
|
|
|
379
379
|
if (this.jobs.length > 0) {
|
|
380
|
-
callInNextEventLoop(this.runJob);
|
|
380
|
+
callInNextEventLoop(() => void this.runJob());
|
|
381
381
|
}
|
|
382
382
|
|
|
383
383
|
try {
|
|
@@ -423,7 +423,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
423
423
|
if (workReqs.length === 0) {
|
|
424
424
|
worker.status = {code: WorkerStatusCode.idle, workerApi};
|
|
425
425
|
this.workersBusy--;
|
|
426
|
-
callInNextEventLoop(this.runJob);
|
|
426
|
+
callInNextEventLoop(() => void this.runJob());
|
|
427
427
|
return;
|
|
428
428
|
}
|
|
429
429
|
|
|
@@ -499,7 +499,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
499
499
|
this.workersBusy--;
|
|
500
500
|
|
|
501
501
|
// Potentially run a new job
|
|
502
|
-
callInNextEventLoop(this.runJob);
|
|
502
|
+
callInNextEventLoop(() => void this.runJob());
|
|
503
503
|
};
|
|
504
504
|
|
|
505
505
|
/**
|
|
@@ -542,7 +542,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
542
542
|
this.jobs.unshift(job);
|
|
543
543
|
}
|
|
544
544
|
this.bufferedJobs = null;
|
|
545
|
-
callInNextEventLoop(this.runJob);
|
|
545
|
+
callInNextEventLoop(() => void this.runJob());
|
|
546
546
|
}
|
|
547
547
|
};
|
|
548
548
|
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import worker from "node:worker_threads";
|
|
2
|
-
import {
|
|
3
|
-
type BlsSignatureSet,
|
|
4
|
-
verifySignatureSets,
|
|
5
|
-
verifySignatureSetsSameMessage,
|
|
6
|
-
} from "@chainsafe/lodestar-z/bls-verifier";
|
|
7
2
|
import {expose} from "@chainsafe/threads/worker";
|
|
3
|
+
import {type BlsSignatureSet, verifySignatureSets, verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
8
4
|
import {
|
|
9
5
|
BlsWorkReq,
|
|
10
6
|
BlsWorkResult,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {verifySignatureSetsSameMessage} from "@
|
|
1
|
+
import {verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
2
2
|
import {ISignatureSet} from "@lodestar/state-transition";
|
|
3
3
|
import {Metrics} from "../../metrics/index.js";
|
|
4
4
|
import {IBlsVerifier, SameMessageSignatureSet} from "./interface.js";
|
package/src/chain/bls/utils.ts
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
BLS_VERIFIER_MAX_BATCH_SIZE,
|
|
3
3
|
BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE,
|
|
4
4
|
verifySignatureSets,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@lodestar/native/bls-verifier";
|
|
6
6
|
import {ISignatureSet, SignatureSetType, toBlsSignatureSet} from "@lodestar/state-transition";
|
|
7
7
|
import {SameMessageSignatureSet} from "./interface.js";
|
|
8
8
|
|
package/src/chain/chain.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import {PrivateKey} from "@libp2p/interface";
|
|
3
|
-
import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
4
3
|
import {Type} from "@chainsafe/ssz";
|
|
5
4
|
import {routes} from "@lodestar/api";
|
|
6
5
|
import {BeaconConfig} from "@lodestar/config";
|
|
@@ -14,6 +13,7 @@ import {
|
|
|
14
13
|
UpdateHeadOpt,
|
|
15
14
|
} from "@lodestar/fork-choice";
|
|
16
15
|
import {LoggerNode} from "@lodestar/logger/node";
|
|
16
|
+
import {type PubkeyCache} from "@lodestar/native/pubkeys";
|
|
17
17
|
import {
|
|
18
18
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
19
19
|
type ForkPostFulu,
|
|
@@ -100,6 +100,7 @@ import {
|
|
|
100
100
|
AttestationPool,
|
|
101
101
|
DeferredVoluntaryExitPool,
|
|
102
102
|
ExecutionPayloadBidPool,
|
|
103
|
+
InclusionListStore,
|
|
103
104
|
OpPool,
|
|
104
105
|
PayloadAttestationPool,
|
|
105
106
|
ProposerPreferencesPool,
|
|
@@ -198,6 +199,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
198
199
|
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
199
200
|
readonly payloadAttestationPool: PayloadAttestationPool;
|
|
200
201
|
readonly proposerPreferencesPool = new ProposerPreferencesPool();
|
|
202
|
+
readonly inclusionListStore: InclusionListStore;
|
|
201
203
|
readonly opPool: OpPool;
|
|
202
204
|
readonly deferredVoluntaryExitPool: DeferredVoluntaryExitPool;
|
|
203
205
|
|
|
@@ -335,6 +337,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
335
337
|
this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
|
|
336
338
|
this.opPool = new OpPool(config);
|
|
337
339
|
this.deferredVoluntaryExitPool = new DeferredVoluntaryExitPool(logger);
|
|
340
|
+
this.inclusionListStore = new InclusionListStore(config);
|
|
338
341
|
|
|
339
342
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
340
343
|
this.seenContributionAndProof = new SeenContributionAndProof(metrics);
|
|
@@ -1483,10 +1486,10 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1483
1486
|
this.metrics?.forkChoice.requests.inc();
|
|
1484
1487
|
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.predictProposerHead});
|
|
1485
1488
|
const slot = this.clock.currentSlot;
|
|
1486
|
-
const
|
|
1489
|
+
const msFromSlot = this.clock.msFromSlot(slot);
|
|
1487
1490
|
|
|
1488
1491
|
try {
|
|
1489
|
-
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead,
|
|
1492
|
+
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, msFromSlot, slot}).head;
|
|
1490
1493
|
} catch (e) {
|
|
1491
1494
|
this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetPredictedProposerHead});
|
|
1492
1495
|
throw e;
|
|
@@ -1498,13 +1501,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1498
1501
|
getProposerHead(slot: Slot): ProtoBlock {
|
|
1499
1502
|
this.metrics?.forkChoice.requests.inc();
|
|
1500
1503
|
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.getProposerHead});
|
|
1501
|
-
const
|
|
1504
|
+
const msFromSlot = this.clock.msFromSlot(slot);
|
|
1502
1505
|
|
|
1503
1506
|
try {
|
|
1504
1507
|
// Do not emit head event here, when proposing we rely on the one emitted when importing our own block
|
|
1505
1508
|
const {head, isHeadTimely, notReorgedReason} = this.forkChoice.updateAndGetHead({
|
|
1506
1509
|
mode: UpdateHeadOpt.GetProposerHead,
|
|
1507
|
-
|
|
1510
|
+
msFromSlot,
|
|
1508
1511
|
slot,
|
|
1509
1512
|
});
|
|
1510
1513
|
|
|
@@ -1832,6 +1835,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1832
1835
|
this.executionPayloadBidPool.prune(slot);
|
|
1833
1836
|
this.seenExecutionPayloadBids.prune(slot);
|
|
1834
1837
|
this.proposerPreferencesPool.prune(slot);
|
|
1838
|
+
this.inclusionListStore.prune(slot);
|
|
1835
1839
|
this.seenAttestationDatas.onSlot(slot);
|
|
1836
1840
|
this.reprocessController.onSlot(slot);
|
|
1837
1841
|
|
|
@@ -72,7 +72,7 @@ export enum BlockErrorCode {
|
|
|
72
72
|
* whoever served the block MAY be downscored. Mirrors PayloadErrorCode.EXECUTION_ENGINE_INVALID.
|
|
73
73
|
*/
|
|
74
74
|
EXECUTION_ENGINE_INVALID = "BLOCK_ERROR_EXECUTION_INVALID",
|
|
75
|
-
/** The
|
|
75
|
+
/** The blob or column data did not arrive within the availability wait */
|
|
76
76
|
DATA_UNAVAILABLE = "BLOCK_ERROR_DATA_UNAVAILABLE",
|
|
77
77
|
/** Block contains too many kzg commitments */
|
|
78
78
|
TOO_MANY_KZG_COMMITMENTS = "BLOCK_ERROR_TOO_MANY_KZG_COMMITMENTS",
|
|
@@ -21,6 +21,8 @@ export enum ExecutionPayloadBidErrorCode {
|
|
|
21
21
|
NO_MATCHING_PROPOSER_PREFERENCES = "EXECUTION_PAYLOAD_BID_ERROR_NO_MATCHING_PROPOSER_PREFERENCES",
|
|
22
22
|
PROPOSER_PREFERENCES_FEE_RECIPIENT_MISMATCH = "EXECUTION_PAYLOAD_BID_ERROR_PROPOSER_PREFERENCES_FEE_RECIPIENT_MISMATCH",
|
|
23
23
|
PROPOSER_PREFERENCES_GAS_LIMIT_MISMATCH = "EXECUTION_PAYLOAD_BID_ERROR_PROPOSER_PREFERENCES_GAS_LIMIT_MISMATCH",
|
|
24
|
+
INCLUSION_LIST_BITS_NOT_INCLUSIVE = "EXECUTION_PAYLOAD_BID_ERROR_INCLUSION_LIST_BITS_NOT_INCLUSIVE",
|
|
25
|
+
BEFORE_INCLUSION_LIST_DEADLINE = "EXECUTION_PAYLOAD_BID_ERROR_BEFORE_INCLUSION_LIST_DEADLINE",
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
export type ExecutionPayloadBidErrorType =
|
|
@@ -86,6 +88,16 @@ export type ExecutionPayloadBidErrorType =
|
|
|
86
88
|
bidFeeRecipient: string;
|
|
87
89
|
expectedFeeRecipient: string;
|
|
88
90
|
}
|
|
91
|
+
| {
|
|
92
|
+
code: ExecutionPayloadBidErrorCode.INCLUSION_LIST_BITS_NOT_INCLUSIVE;
|
|
93
|
+
builderIndex: BuilderIndex;
|
|
94
|
+
slot: Slot;
|
|
95
|
+
}
|
|
96
|
+
| {
|
|
97
|
+
code: ExecutionPayloadBidErrorCode.BEFORE_INCLUSION_LIST_DEADLINE;
|
|
98
|
+
builderIndex: BuilderIndex;
|
|
99
|
+
slot: Slot;
|
|
100
|
+
}
|
|
89
101
|
| {
|
|
90
102
|
code: ExecutionPayloadBidErrorCode.PROPOSER_PREFERENCES_GAS_LIMIT_MISMATCH;
|
|
91
103
|
builderIndex: BuilderIndex;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import {Epoch, RootHex, Slot, ValidatorIndex} from "@lodestar/types";
|
|
2
|
+
import {GossipActionError} from "./gossipValidation.js";
|
|
3
|
+
|
|
4
|
+
export enum InclusionListErrorCode {
|
|
5
|
+
EMPTY_TRANSACTIONS = "INCLUSION_LIST_ERROR_EMPTY_TRANSACTIONS",
|
|
6
|
+
MAXIMUM_SIZE_EXCEEDED = "INCLUSION_LIST_ERROR_MAXIMUM_SIZE_EXCEEDED",
|
|
7
|
+
EMPTY_TRANSACTION = "INCLUSION_LIST_ERROR_EMPTY_TRANSACTION",
|
|
8
|
+
INVALID_SLOT = "INCLUSION_LIST_ERROR_INVALID_SLOT",
|
|
9
|
+
MORE_THAN_TWO = "INCLUSION_LIST_ERROR_MORE_THAN_TWO",
|
|
10
|
+
VALIDATOR_NOT_IN_COMMITTEE = "INCLUSION_LIST_ERROR_VALIDATOR_NOT_IN_COMMITTEE",
|
|
11
|
+
UNKNOWN_DEPENDENT_ROOT = "INCLUSION_LIST_ERROR_UNKNOWN_DEPENDENT_ROOT",
|
|
12
|
+
INVALID_DEPENDENT_ROOT_SLOT = "INCLUSION_LIST_ERROR_INVALID_DEPENDENT_ROOT_SLOT",
|
|
13
|
+
INVALID_DEPENDENT_ROOT = "INCLUSION_LIST_ERROR_INVALID_DEPENDENT_ROOT",
|
|
14
|
+
MISSING_SHUFFLING = "INCLUSION_LIST_ERROR_MISSING_SHUFFLING",
|
|
15
|
+
INVALID_SIGNATURE = "INCLUSION_LIST_ERROR_INVALID_SIGNATURE",
|
|
16
|
+
PRE_HEZE_SLOT = "INCLUSION_LIST_ERROR_PRE_HEZE_SLOT",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type InclusionListErrorType =
|
|
20
|
+
| {code: InclusionListErrorCode.EMPTY_TRANSACTIONS}
|
|
21
|
+
| {code: InclusionListErrorCode.MAXIMUM_SIZE_EXCEEDED; totalBytes: number; maxBytes: number}
|
|
22
|
+
| {code: InclusionListErrorCode.EMPTY_TRANSACTION; transactionIndex: number}
|
|
23
|
+
| {code: InclusionListErrorCode.INVALID_SLOT; inclusionListSlot: Slot; currentSlot: Slot}
|
|
24
|
+
| {code: InclusionListErrorCode.MORE_THAN_TWO; validatorIndex: ValidatorIndex}
|
|
25
|
+
| {code: InclusionListErrorCode.VALIDATOR_NOT_IN_COMMITTEE; validatorIndex: ValidatorIndex}
|
|
26
|
+
| {code: InclusionListErrorCode.UNKNOWN_DEPENDENT_ROOT; dependentRoot: RootHex}
|
|
27
|
+
| {
|
|
28
|
+
code: InclusionListErrorCode.INVALID_DEPENDENT_ROOT_SLOT;
|
|
29
|
+
dependentRoot: RootHex;
|
|
30
|
+
dependentSlot: Slot;
|
|
31
|
+
maxSlot: Slot;
|
|
32
|
+
}
|
|
33
|
+
| {code: InclusionListErrorCode.INVALID_DEPENDENT_ROOT; dependentRoot: RootHex; epoch: Epoch}
|
|
34
|
+
| {code: InclusionListErrorCode.MISSING_SHUFFLING; dependentRoot: RootHex; epoch: Epoch}
|
|
35
|
+
| {code: InclusionListErrorCode.INVALID_SIGNATURE}
|
|
36
|
+
| {code: InclusionListErrorCode.PRE_HEZE_SLOT; inclusionListSlot: Slot};
|
|
37
|
+
|
|
38
|
+
export class InclusionListError extends GossipActionError<InclusionListErrorType> {}
|
|
@@ -8,6 +8,7 @@ export * from "./envelopeReconstructionError.js";
|
|
|
8
8
|
export * from "./executionPayloadBid.js";
|
|
9
9
|
export * from "./executionPayloadEnvelope.js";
|
|
10
10
|
export * from "./gossipValidation.js";
|
|
11
|
+
export * from "./inclusionList.js";
|
|
11
12
|
export * from "./payloadAttestation.js";
|
|
12
13
|
export * from "./proposerPreferences.js";
|
|
13
14
|
export * from "./proposerSlashingError.js";
|
package/src/chain/interface.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
2
1
|
import {Type} from "@chainsafe/ssz";
|
|
3
2
|
import {BeaconConfig} from "@lodestar/config";
|
|
4
3
|
import {CheckpointWithHex, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
|
|
4
|
+
import {type PubkeyCache} from "@lodestar/native/pubkeys";
|
|
5
5
|
import {EpochShuffling, IBeaconStateView} from "@lodestar/state-transition";
|
|
6
6
|
import {
|
|
7
7
|
BeaconBlock,
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
AttestationPool,
|
|
50
50
|
DeferredVoluntaryExitPool,
|
|
51
51
|
ExecutionPayloadBidPool,
|
|
52
|
+
InclusionListStore,
|
|
52
53
|
OpPool,
|
|
53
54
|
PayloadAttestationPool,
|
|
54
55
|
ProposerPreferencesPool,
|
|
@@ -76,8 +77,7 @@ import {PayloadEnvelopeInput, SeenPayloadEnvelopeInput} from "./seenCache/seenPa
|
|
|
76
77
|
import {ShufflingCache} from "./shufflingCache.js";
|
|
77
78
|
import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
78
79
|
|
|
79
|
-
export {BlockType, type
|
|
80
|
-
export {type ProposerPreparationData};
|
|
80
|
+
export {type AssembledBlockType, BlockType, type ProposerPreparationData};
|
|
81
81
|
export type BlockHash = RootHex;
|
|
82
82
|
|
|
83
83
|
export type StateGetOpts = {
|
|
@@ -131,6 +131,7 @@ export interface IBeaconChain {
|
|
|
131
131
|
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
132
132
|
readonly payloadAttestationPool: PayloadAttestationPool;
|
|
133
133
|
readonly proposerPreferencesPool: ProposerPreferencesPool;
|
|
134
|
+
readonly inclusionListStore: InclusionListStore;
|
|
134
135
|
readonly opPool: OpPool;
|
|
135
136
|
readonly deferredVoluntaryExitPool: DeferredVoluntaryExitPool;
|
|
136
137
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {Signature, aggregateSignatures} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
2
|
import {BeaconConfig} from "@lodestar/config";
|
|
4
3
|
import {IForkChoice} from "@lodestar/fork-choice";
|
|
4
|
+
import {Signature, aggregateSignatures} from "@lodestar/native/blst";
|
|
5
5
|
import {
|
|
6
6
|
ForkName,
|
|
7
7
|
ForkSeq,
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from "@lodestar/params";
|
|
21
21
|
import {
|
|
22
22
|
EffectiveBalanceIncrements,
|
|
23
|
+
G2_POINT_AT_INFINITY,
|
|
23
24
|
IBeaconStateView,
|
|
24
25
|
RootCache,
|
|
25
26
|
computeEpochAtSlot,
|
|
@@ -30,7 +31,7 @@ import {
|
|
|
30
31
|
isStatePostGloas,
|
|
31
32
|
} from "@lodestar/state-transition";
|
|
32
33
|
import {Attestation, Epoch, RootHex, Slot, electra, isElectraAttestation, phase0, ssz} from "@lodestar/types";
|
|
33
|
-
import {Logger, MapDef, assert, toRootHex} from "@lodestar/utils";
|
|
34
|
+
import {Logger, MapDef, assert, byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
34
35
|
import {Metrics} from "../../metrics/metrics.js";
|
|
35
36
|
import {IntersectResult, intersectUint8Arrays} from "../../util/bitArray.js";
|
|
36
37
|
import {getShufflingDependentRoot} from "../../util/dependentRoot.js";
|
|
@@ -409,20 +410,34 @@ export class AggregatedAttestationPool {
|
|
|
409
410
|
|
|
410
411
|
const sortedConsolidationsByScore = Array.from(consolidations.entries())
|
|
411
412
|
.sort((a, b) => b[1] - a[1])
|
|
412
|
-
.map(([consolidation, _]) => consolidation)
|
|
413
|
-
.slice(0, MAX_ATTESTATIONS_ELECTRA);
|
|
413
|
+
.map(([consolidation, _]) => consolidation);
|
|
414
414
|
|
|
415
415
|
// on chain aggregation is expensive, only do it after all
|
|
416
416
|
const packedAttestationsMetrics = this.metrics?.opPool.aggregatedAttestationPool.packedAttestations;
|
|
417
|
-
const packedAttestations: electra.Attestation[] =
|
|
418
|
-
for (const
|
|
419
|
-
packedAttestations
|
|
417
|
+
const packedAttestations: electra.Attestation[] = [];
|
|
418
|
+
for (const consolidation of sortedConsolidationsByScore) {
|
|
419
|
+
if (packedAttestations.length >= MAX_ATTESTATIONS_ELECTRA) {
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
const attestation = aggregateConsolidation(consolidation);
|
|
424
|
+
// The point at infinity is not a valid aggregate signature, exclude it from the block
|
|
425
|
+
if (byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY)) {
|
|
426
|
+
this.logger?.debug("Excluding aggregate with infinity signature", {
|
|
427
|
+
slot: stateSlot,
|
|
428
|
+
attestationSlot: attestation.data.slot,
|
|
429
|
+
committees: consolidation.byCommittee.size,
|
|
430
|
+
});
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const i = packedAttestations.push(attestation) - 1;
|
|
420
435
|
|
|
421
436
|
// record metrics of packed attestations
|
|
422
437
|
packedAttestationsMetrics?.committeeCount.set({index: i}, consolidation.byCommittee.size);
|
|
423
438
|
packedAttestationsMetrics?.totalAttesters.set({index: i}, consolidation.totalAttesters);
|
|
424
439
|
packedAttestationsMetrics?.nonParticipation.set({index: i}, consolidation.notSeenAttesters);
|
|
425
|
-
packedAttestationsMetrics?.inclusionDistance.set({index: i}, stateSlot -
|
|
440
|
+
packedAttestationsMetrics?.inclusionDistance.set({index: i}, stateSlot - attestation.data.slot);
|
|
426
441
|
packedAttestationsMetrics?.newSeenAttesters.set({index: i}, consolidation.newSeenAttesters);
|
|
427
442
|
packedAttestationsMetrics?.totalEffectiveBalance.set({index: i}, consolidation.totalNewSeenEffectiveBalance);
|
|
428
443
|
}
|
|
@@ -462,7 +477,8 @@ export class AggregatedAttestationPool {
|
|
|
462
477
|
attestations.push(...attestationGroup.getAttestations());
|
|
463
478
|
}
|
|
464
479
|
}
|
|
465
|
-
|
|
480
|
+
// The point at infinity is not a valid aggregate signature, do not serve such an aggregate
|
|
481
|
+
return attestations.filter((attestation) => !byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY));
|
|
466
482
|
}
|
|
467
483
|
|
|
468
484
|
private onScrapeMetrics(metrics: Metrics): void {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {Signature, aggregateSignatures} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
2
|
import {ChainForkConfig} from "@lodestar/config";
|
|
3
|
+
import {Signature, aggregateSignatures} from "@lodestar/native/blst";
|
|
4
4
|
import {MAX_COMMITTEES_PER_SLOT, isForkPostElectra} from "@lodestar/params";
|
|
5
|
+
import {G2_POINT_AT_INFINITY} from "@lodestar/state-transition";
|
|
5
6
|
import {Attestation, RootHex, SingleAttestation, Slot, isElectraSingleAttestation} from "@lodestar/types";
|
|
6
|
-
import {MapDef, assert} from "@lodestar/utils";
|
|
7
|
+
import {MapDef, assert, byteArrayEquals} from "@lodestar/utils";
|
|
7
8
|
import {Metrics} from "../../metrics/metrics.js";
|
|
8
9
|
import {IClock} from "../../util/clock.js";
|
|
9
10
|
import {InsertOutcome, OpPoolError, OpPoolErrorCode} from "./types.js";
|
|
@@ -180,7 +181,13 @@ export class AttestationPool {
|
|
|
180
181
|
assert.true(!isElectraAggregate(aggregate), "Aggregate should be type AggregateFastPhase0");
|
|
181
182
|
}
|
|
182
183
|
|
|
183
|
-
|
|
184
|
+
const attestation = fastToAttestation(aggregate);
|
|
185
|
+
// The point at infinity is not a valid aggregate signature, do not serve such an aggregate
|
|
186
|
+
if (byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY)) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return attestation;
|
|
184
191
|
}
|
|
185
192
|
|
|
186
193
|
/**
|
|
@@ -209,7 +216,12 @@ export class AttestationPool {
|
|
|
209
216
|
if (aggregateByRoot) {
|
|
210
217
|
for (const aggFastByIndex of aggregateByRoot.values()) {
|
|
211
218
|
for (const aggFast of aggFastByIndex.values()) {
|
|
212
|
-
|
|
219
|
+
const attestation = fastToAttestation(aggFast);
|
|
220
|
+
// The point at infinity is not a valid aggregate signature, do not serve such an aggregate
|
|
221
|
+
if (byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
attestations.push(attestation);
|
|
213
225
|
}
|
|
214
226
|
}
|
|
215
227
|
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import {BitArray, SerializedList} from "@chainsafe/ssz";
|
|
2
|
+
import {BeaconConfig} from "@lodestar/config";
|
|
3
|
+
import {INCLUSION_LIST_COMMITTEE_SIZE} from "@lodestar/params";
|
|
4
|
+
import {RootHex, Slot, ValidatorIndex, bellatrix, heze, ssz} from "@lodestar/types";
|
|
5
|
+
import {MapDef, toHex, toRootHex} from "@lodestar/utils";
|
|
6
|
+
|
|
7
|
+
export enum InclusionListInsertOutcome {
|
|
8
|
+
/** Stored as a new entry. */
|
|
9
|
+
New = "New",
|
|
10
|
+
/** Slot is older than the prune horizon. */
|
|
11
|
+
Old = "Old",
|
|
12
|
+
/** Identical inclusion list already stored. */
|
|
13
|
+
Seen = "Seen",
|
|
14
|
+
/** New equivocation evidence: this validator already has a different inclusion list stored. */
|
|
15
|
+
Equivocating = "Equivocating",
|
|
16
|
+
/** Validator was already marked as an equivocator for this `(slot, dependent_root)`. */
|
|
17
|
+
SubsequentEquivocation = "SubsequentEquivocation",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
type InclusionListEntry = {
|
|
21
|
+
signedInclusionList: heze.SignedInclusionList;
|
|
22
|
+
/** Positions of the validator in `get_inclusion_list_committee(state, slot)`, several when the committee cycles */
|
|
23
|
+
committeeIndices: number[];
|
|
24
|
+
/** Received before the inclusion list deadline of its slot. */
|
|
25
|
+
timely: boolean;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Spec `InclusionListStore`: inclusion lists keyed by `(slot, dependent_root)`, one per validator index.
|
|
30
|
+
* The committee position is recorded at insert time (gossip validation resolves it) so the bit-oriented
|
|
31
|
+
* reads need no shuffling lookup. Signed lists are kept so InclusionListsByIndices can serve them.
|
|
32
|
+
* A validator's first list stays stored and an equivocation marks the validator so reads skip it.
|
|
33
|
+
*/
|
|
34
|
+
export class InclusionListStore {
|
|
35
|
+
/** slot -> dependent_root -> validator index -> entry */
|
|
36
|
+
private readonly inclusionLists = new MapDef<Slot, MapDef<RootHex, Map<ValidatorIndex, InclusionListEntry>>>(
|
|
37
|
+
() => new MapDef<RootHex, Map<ValidatorIndex, InclusionListEntry>>(() => new Map())
|
|
38
|
+
);
|
|
39
|
+
/** slot -> dependent_root -> equivocating validator indices */
|
|
40
|
+
private readonly equivocators = new MapDef<Slot, MapDef<RootHex, Set<ValidatorIndex>>>(
|
|
41
|
+
() => new MapDef<RootHex, Set<ValidatorIndex>>(() => new Set())
|
|
42
|
+
);
|
|
43
|
+
/** slot -> dependent_root -> validator index -> count, for the p2p "first or second message" rule */
|
|
44
|
+
private readonly seenCounts = new MapDef<Slot, MapDef<RootHex, Map<ValidatorIndex, number>>>(
|
|
45
|
+
() => new MapDef<RootHex, Map<ValidatorIndex, number>>(() => new Map())
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
private lowestPermissibleSlot = 0;
|
|
49
|
+
|
|
50
|
+
constructor(private readonly config: BeaconConfig) {}
|
|
51
|
+
|
|
52
|
+
get size(): number {
|
|
53
|
+
let count = 0;
|
|
54
|
+
for (const byDependentRoot of this.inclusionLists.values()) {
|
|
55
|
+
for (const entries of byDependentRoot.values()) {
|
|
56
|
+
count += entries.size;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return count;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Late lists are stored with `timely=false` rather than dropped: they still count toward the
|
|
64
|
+
* non-timely view used to validate another node's `inclusion_list_bits`.
|
|
65
|
+
*/
|
|
66
|
+
process(
|
|
67
|
+
signedInclusionList: heze.SignedInclusionList,
|
|
68
|
+
committeeIndices: number[],
|
|
69
|
+
timely: boolean
|
|
70
|
+
): InclusionListInsertOutcome {
|
|
71
|
+
const inclusionList = signedInclusionList.message;
|
|
72
|
+
const {slot, validatorIndex} = inclusionList;
|
|
73
|
+
|
|
74
|
+
if (slot < this.lowestPermissibleSlot) {
|
|
75
|
+
return InclusionListInsertOutcome.Old;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const dependentRoot = toRootHex(inclusionList.dependentRoot);
|
|
79
|
+
const stored = this.inclusionLists.getOrDefault(slot).getOrDefault(dependentRoot);
|
|
80
|
+
|
|
81
|
+
const entry = stored.get(validatorIndex);
|
|
82
|
+
if (entry !== undefined) {
|
|
83
|
+
if (ssz.heze.InclusionList.equals(entry.signedInclusionList.message, inclusionList)) {
|
|
84
|
+
return InclusionListInsertOutcome.Seen;
|
|
85
|
+
}
|
|
86
|
+
const equivocators = this.equivocators.getOrDefault(slot).getOrDefault(dependentRoot);
|
|
87
|
+
if (equivocators.has(validatorIndex)) {
|
|
88
|
+
return InclusionListInsertOutcome.SubsequentEquivocation;
|
|
89
|
+
}
|
|
90
|
+
equivocators.add(validatorIndex);
|
|
91
|
+
return InclusionListInsertOutcome.Equivocating;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
stored.set(validatorIndex, {signedInclusionList, committeeIndices, timely});
|
|
95
|
+
return InclusionListInsertOutcome.New;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Count a valid message of `validatorIndex` for the first-or-second message gossip rule */
|
|
99
|
+
markSeen(slot: Slot, dependentRoot: RootHex, validatorIndex: ValidatorIndex): void {
|
|
100
|
+
const counts = this.seenCounts.getOrDefault(slot).getOrDefault(dependentRoot);
|
|
101
|
+
counts.set(validatorIndex, (counts.get(validatorIndex) ?? 0) + 1);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Gossip rule: at most two valid messages per validator for a `(slot, dependent_root)` */
|
|
105
|
+
seenTwice(slot: Slot, dependentRoot: RootHex, validatorIndex: ValidatorIndex): boolean {
|
|
106
|
+
return (this.seenCounts.get(slot)?.get(dependentRoot)?.get(validatorIndex) ?? 0) >= 2;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Deduplicated transactions from valid, non-equivocating inclusion lists at `(slot, dependentRoot)`. */
|
|
110
|
+
getInclusionListTransactions(slot: Slot, dependentRoot: RootHex, onlyTimely = true): bellatrix.Transactions {
|
|
111
|
+
const transactions: Uint8Array[] = [];
|
|
112
|
+
const seen = new Set<string>();
|
|
113
|
+
|
|
114
|
+
for (const {signedInclusionList} of this.getEligible(slot, dependentRoot, onlyTimely)) {
|
|
115
|
+
for (const transaction of signedInclusionList.message.transactions) {
|
|
116
|
+
const key = toHex(transaction);
|
|
117
|
+
if (!seen.has(key)) {
|
|
118
|
+
seen.add(key);
|
|
119
|
+
transactions.push(transaction);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return SerializedList.fromArray(transactions);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Bit `i` is set when committee member `i` submitted a valid, non-equivocating inclusion list */
|
|
128
|
+
getInclusionListBits(slot: Slot, dependentRoot: RootHex, onlyTimely = true): BitArray {
|
|
129
|
+
const bits = BitArray.fromBitLen(INCLUSION_LIST_COMMITTEE_SIZE);
|
|
130
|
+
for (const {committeeIndices} of this.getEligible(slot, dependentRoot, onlyTimely)) {
|
|
131
|
+
for (const committeeIndex of committeeIndices) {
|
|
132
|
+
bits.set(committeeIndex, true);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return bits;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* True if `bits` has a bit set for every bit set in the local inclusion list bits.
|
|
140
|
+
*
|
|
141
|
+
* Intentionally deviates from the spec by only checking against timely lists, where the proposer would check
|
|
142
|
+
* against every list it observed (only_timely=False in
|
|
143
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.7.0-beta.4/specs/heze/validator.md#signed-execution-payload-bid).
|
|
144
|
+
* A bid that passed gossip must stay eligible, otherwise a list released after the deadline voids every bid and
|
|
145
|
+
* a high early bid with empty bits crowds out the rest without ever paying.
|
|
146
|
+
*/
|
|
147
|
+
isInclusionListBitsInclusive(slot: Slot, dependentRoot: RootHex, bits: BitArray): boolean {
|
|
148
|
+
for (const {committeeIndices} of this.getEligible(slot, dependentRoot, true)) {
|
|
149
|
+
if (committeeIndices.some((committeeIndex) => !bits.get(committeeIndex))) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Inclusion lists for the given committee positions, to serve InclusionListsByIndices. */
|
|
157
|
+
getByIndices(slot: Slot, dependentRoot: RootHex, indices: BitArray): heze.SignedInclusionList[] {
|
|
158
|
+
const out: heze.SignedInclusionList[] = [];
|
|
159
|
+
for (const {signedInclusionList, committeeIndices} of this.getEligible(slot, dependentRoot, false)) {
|
|
160
|
+
if (committeeIndices.some((committeeIndex) => indices.get(committeeIndex))) {
|
|
161
|
+
out.push(signedInclusionList);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Lists are retained for MIN_SLOTS_FOR_INCLUSION_LISTS_REQUESTS slots so InclusionListsByIndices can serve them */
|
|
168
|
+
prune(clockSlot: Slot): void {
|
|
169
|
+
const horizon = clockSlot - this.config.MIN_SLOTS_FOR_INCLUSION_LISTS_REQUESTS;
|
|
170
|
+
|
|
171
|
+
for (const slot of this.inclusionLists.keys()) {
|
|
172
|
+
if (slot < horizon) {
|
|
173
|
+
this.inclusionLists.delete(slot);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
for (const slot of this.equivocators.keys()) {
|
|
177
|
+
if (slot < horizon) {
|
|
178
|
+
this.equivocators.delete(slot);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
for (const slot of this.seenCounts.keys()) {
|
|
182
|
+
if (slot < horizon) {
|
|
183
|
+
this.seenCounts.delete(slot);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
this.lowestPermissibleSlot = Math.max(horizon, 0);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Entries at `(slot, dependentRoot)` from non-equivocating validators, timely when required. */
|
|
191
|
+
private *getEligible(slot: Slot, dependentRoot: RootHex, onlyTimely: boolean): Generator<InclusionListEntry> {
|
|
192
|
+
const stored = this.inclusionLists.get(slot)?.get(dependentRoot);
|
|
193
|
+
if (!stored || stored.size === 0) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const equivocators = this.equivocators.get(slot)?.get(dependentRoot);
|
|
197
|
+
|
|
198
|
+
for (const [validatorIndex, entry] of stored) {
|
|
199
|
+
if (equivocators?.has(validatorIndex)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (onlyTimely && !entry.timely) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
yield entry;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|