@lodestar/beacon-node 1.51.0-dev.ab56d90f0c → 1.51.0-dev.ab8f3f6381
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 +22 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts.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 +42 -26
- 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 +13 -2
- 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 +39 -50
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +32 -18
- 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 +4 -4
- 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 -1
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +18 -7
- 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/verifyBlocksExecutionPayloads.d.ts +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.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 +7 -5
- package/lib/chain/blocks/verifyBlocksSignatures.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/interface.d.ts +2 -0
- package/lib/chain/bls/interface.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +13 -11
- 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 +25 -3
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +123 -10
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +6 -0
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -0
- package/lib/chain/emitter.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/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/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 +53 -0
- package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
- package/lib/chain/forkChoiceExecutionEngine.js +121 -0
- package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
- package/lib/chain/interface.d.ts +9 -6
- 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 +199 -46
- 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/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/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 +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 +5 -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 -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 -2
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +0 -1
- package/lib/chain/regen/interface.js.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/validation/executionPayloadBid.d.ts +0 -15
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -166
- 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/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/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 +2 -2
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +5 -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 +17 -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 +2 -2
- package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
- package/lib/execution/engine/jsonRpcTransport.js +1 -1
- package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
- package/lib/execution/engine/restTransport.d.ts +2 -2
- package/lib/execution/engine/restTransport.d.ts.map +1 -1
- package/lib/execution/engine/restTransport.js.map +1 -1
- package/lib/execution/engine/transport.d.ts +1 -12
- package/lib/execution/engine/transport.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +2 -2
- 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 -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/lodestar.d.ts +33 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +84 -0
- 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/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +4 -1
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +7 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +6 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +6 -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/interface.d.ts +2 -0
- 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 -1
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +53 -15
- 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 +2 -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/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/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/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +77 -37
- package/lib/network/processor/gossipHandlers.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 -3
- package/lib/network/processor/index.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 +3 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +47 -21
- 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/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/execution.d.ts +4 -4
- package/lib/util/execution.d.ts.map +1 -1
- 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/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.d.ts +5 -0
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +35 -2
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +16 -17
- 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 +31 -1
- package/src/api/impl/beacon/state/utils.ts +1 -1
- package/src/api/impl/validator/index.ts +47 -30
- package/src/api/options.ts +3 -0
- package/src/chain/GetBlobsTracker.ts +99 -40
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
- package/src/chain/blocks/importBlock.ts +60 -71
- package/src/chain/blocks/importExecutionPayload.ts +55 -34
- package/src/chain/blocks/index.ts +11 -4
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
- package/src/chain/blocks/types.ts +4 -1
- package/src/chain/blocks/verifyBlock.ts +31 -16
- package/src/chain/blocks/verifyBlocksDataAvailability.ts +10 -1
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +1 -1
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
- package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
- package/src/chain/bls/interface.ts +2 -0
- package/src/chain/bls/multithread/index.ts +14 -10
- 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 +139 -8
- package/src/chain/emitter.ts +7 -0
- package/src/chain/errors/blockError.ts +1 -1
- package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
- package/src/chain/forkChoice/index.ts +11 -0
- package/src/chain/forkChoiceExecutionEngine.ts +197 -0
- package/src/chain/interface.ts +9 -5
- package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/index.ts +1 -0
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/singleAttestationPool.ts +287 -0
- 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 +5 -2
- package/src/chain/produceBlock/produceBlockBody.ts +7 -3
- package/src/chain/proposerTracker.ts +94 -0
- package/src/chain/regen/interface.ts +1 -2
- package/src/chain/regen/queued.ts +6 -4
- package/src/chain/validation/executionPayloadBid.ts +14 -193
- package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
- 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/apiClient.ts +16 -13
- package/src/execution/builder/http.ts +4 -0
- package/src/execution/engine/http.ts +12 -13
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +19 -3
- package/src/execution/engine/jsonRpcTransport.ts +10 -2
- package/src/execution/engine/restTransport.ts +3 -1
- package/src/execution/engine/transport.ts +8 -14
- package/src/execution/engine/types.ts +3 -1
- package/src/execution/engine/utils.ts +4 -2
- package/src/index.ts +2 -0
- package/src/metrics/metrics/lodestar.ts +85 -0
- package/src/metrics/server/http.ts +5 -5
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +11 -1
- package/src/network/core/networkCoreWorker.ts +2 -0
- package/src/network/core/networkCoreWorkerHandler.ts +8 -1
- package/src/network/core/types.ts +6 -1
- package/src/network/gossip/gossipsub.ts +11 -0
- package/src/network/interface.ts +2 -0
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +55 -19
- package/src/network/options.ts +4 -0
- package/src/network/peers/peerManager.ts +28 -3
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/peers/utils/prioritizePeers.ts +14 -22
- package/src/network/peers/utils/subnetMap.ts +6 -3
- package/src/network/processor/gossipHandlers.ts +98 -40
- package/src/network/processor/index.ts +25 -3
- package/src/network/subnets/attnetsService.ts +94 -6
- package/src/network/subnets/interface.ts +7 -0
- package/src/node/nodejs.ts +58 -22
- package/src/node/options.ts +9 -6
- package/src/sync/interface.ts +1 -0
- package/src/sync/sync.ts +65 -4
- package/src/sync/unknownBlock.ts +47 -28
- package/src/util/execution.ts +6 -6
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +42 -2
|
@@ -36,10 +36,9 @@ export async function verifyBlocksSignatures(
|
|
|
36
36
|
? preState0.currentSyncCommitteeIndexed
|
|
37
37
|
: new SyncCommitteeCacheEmpty();
|
|
38
38
|
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
// so the attester and proposer shufflings are correct.
|
|
39
|
+
// Runs concurrently with the state transition. Signature sets are built from preState0, which
|
|
40
|
+
// verifyBlocksInEpoch() guarantees is in the same epoch as every block, so the proposer and attester shufflings
|
|
41
|
+
// and the sync committee are the ones the blocks were signed under.
|
|
43
42
|
for (const [i, block] of blocks.entries()) {
|
|
44
43
|
// Use [i] to make clear that the index has to be correct to blame the right block below on BlockError()
|
|
45
44
|
isValidPromises[i] = opts.validSignatures
|
|
@@ -50,7 +49,10 @@ export async function verifyBlocksSignatures(
|
|
|
50
49
|
bls.verifySignatureSets(
|
|
51
50
|
getBlockSignatureSets(config, currentSyncCommitteeIndexed, preState0, block, indexedAttestationsByBlock[i], {
|
|
52
51
|
skipProposerSignature: opts.validProposerSignature,
|
|
53
|
-
})
|
|
52
|
+
}),
|
|
53
|
+
// Prioritize block verification over attestations, since
|
|
54
|
+
// attestations already buffer up to `MAX_BUFFER_WAIT_MS`
|
|
55
|
+
{priority: true}
|
|
54
56
|
);
|
|
55
57
|
|
|
56
58
|
// getBlockSignatureSets() takes 45ms in benchmarks for 2022Q2 mainnet blocks (100 sigs). When syncing a 32 blocks
|
|
@@ -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);
|
|
@@ -22,6 +22,8 @@ export type VerifySignatureOpts = {
|
|
|
22
22
|
verifyOnMainThread?: boolean;
|
|
23
23
|
/**
|
|
24
24
|
* Some signature sets are more important than others, and should be verified first.
|
|
25
|
+
* Non-batchable priority jobs are posted to an idle worker before this call returns, so the caller
|
|
26
|
+
* can run synchronous work right after without delaying the verification.
|
|
25
27
|
*/
|
|
26
28
|
priority?: boolean;
|
|
27
29
|
};
|
|
@@ -333,16 +333,20 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
+
// First hand work to an idle worker before returning to the caller.
|
|
337
|
+
// Deferring the post to the next macrotask would make the worker
|
|
338
|
+
// sit idle while waiting for the next synchronous work
|
|
339
|
+
else if (job.opts.priority) {
|
|
340
|
+
this.jobs.unshift(job);
|
|
341
|
+
void this.runJob();
|
|
342
|
+
}
|
|
343
|
+
|
|
336
344
|
// Push job and schedule to call `runJob` in the next macro event loop cycle.
|
|
337
345
|
// This is useful to allow batching job submitted from a synchronous for loop,
|
|
338
346
|
// and to prevent large stacks since runJob may be called recursively.
|
|
339
347
|
else {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
} else {
|
|
343
|
-
this.jobs.push(job);
|
|
344
|
-
}
|
|
345
|
-
callInNextEventLoop(this.runJob);
|
|
348
|
+
this.jobs.push(job);
|
|
349
|
+
callInNextEventLoop(() => void this.runJob());
|
|
346
350
|
}
|
|
347
351
|
}
|
|
348
352
|
|
|
@@ -377,7 +381,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
377
381
|
let completedJobsCount = 0;
|
|
378
382
|
|
|
379
383
|
if (this.jobs.length > 0) {
|
|
380
|
-
callInNextEventLoop(this.runJob);
|
|
384
|
+
callInNextEventLoop(() => void this.runJob());
|
|
381
385
|
}
|
|
382
386
|
|
|
383
387
|
try {
|
|
@@ -423,7 +427,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
423
427
|
if (workReqs.length === 0) {
|
|
424
428
|
worker.status = {code: WorkerStatusCode.idle, workerApi};
|
|
425
429
|
this.workersBusy--;
|
|
426
|
-
callInNextEventLoop(this.runJob);
|
|
430
|
+
callInNextEventLoop(() => void this.runJob());
|
|
427
431
|
return;
|
|
428
432
|
}
|
|
429
433
|
|
|
@@ -499,7 +503,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
499
503
|
this.workersBusy--;
|
|
500
504
|
|
|
501
505
|
// Potentially run a new job
|
|
502
|
-
callInNextEventLoop(this.runJob);
|
|
506
|
+
callInNextEventLoop(() => void this.runJob());
|
|
503
507
|
};
|
|
504
508
|
|
|
505
509
|
/**
|
|
@@ -542,7 +546,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
542
546
|
this.jobs.unshift(job);
|
|
543
547
|
}
|
|
544
548
|
this.bufferedJobs = null;
|
|
545
|
-
callInNextEventLoop(this.runJob);
|
|
549
|
+
callInNextEventLoop(() => void this.runJob());
|
|
546
550
|
}
|
|
547
551
|
};
|
|
548
552
|
|
|
@@ -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,10 +1,10 @@
|
|
|
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";
|
|
7
6
|
import {
|
|
7
|
+
AncestorStatus,
|
|
8
8
|
CheckpointWithHex,
|
|
9
9
|
EpochDifference,
|
|
10
10
|
ForkChoiceStateGetter,
|
|
@@ -14,12 +14,14 @@ import {
|
|
|
14
14
|
UpdateHeadOpt,
|
|
15
15
|
} from "@lodestar/fork-choice";
|
|
16
16
|
import {LoggerNode} from "@lodestar/logger/node";
|
|
17
|
+
import {type PubkeyCache} from "@lodestar/native/pubkeys";
|
|
17
18
|
import {
|
|
18
19
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
19
20
|
type ForkPostFulu,
|
|
20
21
|
type ForkPostGloas,
|
|
21
22
|
GENESIS_SLOT,
|
|
22
23
|
SLOTS_PER_EPOCH,
|
|
24
|
+
isForkPostFulu,
|
|
23
25
|
isForkPostGloas,
|
|
24
26
|
} from "@lodestar/params";
|
|
25
27
|
import {
|
|
@@ -33,6 +35,7 @@ import {
|
|
|
33
35
|
isStatePostAltair,
|
|
34
36
|
isStatePostElectra,
|
|
35
37
|
isStatePostGloas,
|
|
38
|
+
proposerShufflingDecisionRoot,
|
|
36
39
|
} from "@lodestar/state-transition";
|
|
37
40
|
import {
|
|
38
41
|
BeaconBlock,
|
|
@@ -90,8 +93,9 @@ import {persistPayloadEnvelopeInput} from "./blocks/writePayloadEnvelopeInputToD
|
|
|
90
93
|
import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
|
|
91
94
|
import {BuilderCircuitBreaker} from "./builderCircuitBreaker.js";
|
|
92
95
|
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
93
|
-
import {ChainEvent, ChainEventEmitter} from "./emitter.js";
|
|
96
|
+
import {ChainEvent, ChainEventEmitter, ReorgEventData} from "./emitter.js";
|
|
94
97
|
import {ForkchoiceCaller, initializeForkChoice} from "./forkChoice/index.js";
|
|
98
|
+
import {ForkChoiceExecutionEngine} from "./forkChoiceExecutionEngine.js";
|
|
95
99
|
import {GetBlobsTracker} from "./GetBlobsTracker.js";
|
|
96
100
|
import {CommonBlockBody, FindHeadFnName, IBeaconChain, ProposerPreparationData, StateGetOpts} from "./interface.js";
|
|
97
101
|
import {LightClientServer} from "./lightClient/index.js";
|
|
@@ -104,6 +108,7 @@ import {
|
|
|
104
108
|
OpPool,
|
|
105
109
|
PayloadAttestationPool,
|
|
106
110
|
ProposerPreferencesPool,
|
|
111
|
+
SingleAttestationPool,
|
|
107
112
|
SyncCommitteeMessagePool,
|
|
108
113
|
SyncContributionAndProofPool,
|
|
109
114
|
} from "./opPools/index.js";
|
|
@@ -112,6 +117,7 @@ import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
|
|
|
112
117
|
import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
|
|
113
118
|
import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
|
|
114
119
|
import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
|
|
120
|
+
import {ProposerTracker} from "./proposerTracker.js";
|
|
115
121
|
import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
|
|
116
122
|
import {ReprocessController} from "./reprocess.js";
|
|
117
123
|
import {
|
|
@@ -166,7 +172,7 @@ const DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES = 16;
|
|
|
166
172
|
export class BeaconChain implements IBeaconChain {
|
|
167
173
|
readonly genesisTime: UintNum64;
|
|
168
174
|
readonly genesisValidatorsRoot: Root;
|
|
169
|
-
readonly executionEngine:
|
|
175
|
+
readonly executionEngine: ForkChoiceExecutionEngine;
|
|
170
176
|
readonly executionBuilder?: IExecutionBuilder;
|
|
171
177
|
readonly builderCircuitBreaker: BuilderCircuitBreaker;
|
|
172
178
|
readonly builderApiClient: BuilderApiClient;
|
|
@@ -194,6 +200,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
194
200
|
// Ops pool
|
|
195
201
|
readonly attestationPool: AttestationPool;
|
|
196
202
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
203
|
+
readonly singleAttestationPool: SingleAttestationPool;
|
|
204
|
+
readonly proposerTracker: ProposerTracker;
|
|
205
|
+
/**
|
|
206
|
+
* Head state epoch and decision root of its next epoch proposers when local proposals were last refreshed. The root
|
|
207
|
+
* alone is not enough: a reorg onto a branch without blocks in a whole epoch keeps the root but moves the epoch
|
|
208
|
+
*/
|
|
209
|
+
private localProposalsKey: string | null = null;
|
|
197
210
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
198
211
|
readonly syncContributionAndProofPool;
|
|
199
212
|
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
@@ -317,7 +330,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
317
330
|
this.genesisTime = anchorState.genesisTime;
|
|
318
331
|
this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
|
|
319
332
|
this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
|
|
320
|
-
this.executionEngine = executionEngine;
|
|
321
333
|
this.executionBuilder = executionBuilder;
|
|
322
334
|
const signal = this.abortController.signal;
|
|
323
335
|
const emitter = new ChainEventEmitter();
|
|
@@ -331,6 +343,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
331
343
|
this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
|
|
332
344
|
this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
|
|
333
345
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics, logger);
|
|
346
|
+
this.singleAttestationPool = new SingleAttestationPool(metrics);
|
|
347
|
+
this.proposerTracker = new ProposerTracker(this.opts.singleAttestationIgnoreProposalDuty ?? false, metrics);
|
|
334
348
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
335
349
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
336
350
|
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
@@ -457,6 +471,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
457
471
|
this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
|
|
458
472
|
|
|
459
473
|
this.forkChoice = forkChoice;
|
|
474
|
+
this.executionEngine = new ForkChoiceExecutionEngine(executionEngine, {
|
|
475
|
+
forkChoice,
|
|
476
|
+
recomputeHeadAfterELInvalidResponse: () => this.recomputeHeadAfterELInvalidResponse(),
|
|
477
|
+
logger,
|
|
478
|
+
metrics,
|
|
479
|
+
});
|
|
460
480
|
|
|
461
481
|
this.builderCircuitBreaker = new BuilderCircuitBreaker(
|
|
462
482
|
{faultInspectionWindow: opts.faultInspectionWindow, allowedFaults: opts.allowedFaults},
|
|
@@ -1430,6 +1450,58 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1430
1450
|
}
|
|
1431
1451
|
}
|
|
1432
1452
|
|
|
1453
|
+
/**
|
|
1454
|
+
* Apply chain side effects of a fork choice head change: head state, head metrics, and reorg detection
|
|
1455
|
+
*/
|
|
1456
|
+
onHeadChanged(oldHead: ProtoBlock, newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void {
|
|
1457
|
+
// Set head state as strong reference
|
|
1458
|
+
this.regen.updateHeadState(newHead, maybeHeadState);
|
|
1459
|
+
|
|
1460
|
+
const delaySec = this.clock.secFromSlot(newHead.slot);
|
|
1461
|
+
this.logger.verbose("New chain head", {
|
|
1462
|
+
slot: newHead.slot,
|
|
1463
|
+
root: newHead.blockRoot,
|
|
1464
|
+
payloadStatus: newHead.payloadStatus,
|
|
1465
|
+
delaySec,
|
|
1466
|
+
});
|
|
1467
|
+
this.metrics?.headSlot.set(newHead.slot);
|
|
1468
|
+
|
|
1469
|
+
this.onNewHead(newHead);
|
|
1470
|
+
this.metrics?.forkChoice.changedHead.inc();
|
|
1471
|
+
|
|
1472
|
+
const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
|
|
1473
|
+
if (ancestorResult.code === AncestorStatus.CommonAncestor) {
|
|
1474
|
+
// CommonAncestor = chain reorg, old head and new head not direct descendants
|
|
1475
|
+
|
|
1476
|
+
const forkChoiceReorgEventData: ReorgEventData = {
|
|
1477
|
+
depth: ancestorResult.depth,
|
|
1478
|
+
epoch: computeEpochAtSlot(newHead.slot),
|
|
1479
|
+
slot: newHead.slot,
|
|
1480
|
+
newHeadBlock: newHead.blockRoot,
|
|
1481
|
+
oldHeadBlock: oldHead.blockRoot,
|
|
1482
|
+
newHeadState: newHead.stateRoot,
|
|
1483
|
+
oldHeadState: oldHead.stateRoot,
|
|
1484
|
+
executionOptimistic: isOptimisticBlock(newHead),
|
|
1485
|
+
};
|
|
1486
|
+
|
|
1487
|
+
this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
|
|
1488
|
+
this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
|
|
1489
|
+
|
|
1490
|
+
this.metrics?.forkChoice.reorg.inc();
|
|
1491
|
+
this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
private recomputeHeadAfterELInvalidResponse(): void {
|
|
1496
|
+
// validateLatestHash only re-scores proto-array, the cached head is still the old one
|
|
1497
|
+
const oldHead = this.forkChoice.getHead();
|
|
1498
|
+
const newHead = this.recomputeForkChoiceHead(ForkchoiceCaller.executionInvalid);
|
|
1499
|
+
if (newHead.blockRoot === oldHead.blockRoot && newHead.payloadStatus === oldHead.payloadStatus) {
|
|
1500
|
+
return;
|
|
1501
|
+
}
|
|
1502
|
+
this.onHeadChanged(oldHead, newHead);
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1433
1505
|
/**
|
|
1434
1506
|
* Emit `head` and `head_v2` when the fork choice head differs between two observations. Every caller that
|
|
1435
1507
|
* can move the head, `updateAndGetHead()` and `updateTime()`, must capture the head before and pass both.
|
|
@@ -1486,10 +1558,10 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1486
1558
|
this.metrics?.forkChoice.requests.inc();
|
|
1487
1559
|
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.predictProposerHead});
|
|
1488
1560
|
const slot = this.clock.currentSlot;
|
|
1489
|
-
const
|
|
1561
|
+
const msFromSlot = this.clock.msFromSlot(slot);
|
|
1490
1562
|
|
|
1491
1563
|
try {
|
|
1492
|
-
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead,
|
|
1564
|
+
return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, msFromSlot, slot}).head;
|
|
1493
1565
|
} catch (e) {
|
|
1494
1566
|
this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetPredictedProposerHead});
|
|
1495
1567
|
throw e;
|
|
@@ -1501,13 +1573,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1501
1573
|
getProposerHead(slot: Slot): ProtoBlock {
|
|
1502
1574
|
this.metrics?.forkChoice.requests.inc();
|
|
1503
1575
|
const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.getProposerHead});
|
|
1504
|
-
const
|
|
1576
|
+
const msFromSlot = this.clock.msFromSlot(slot);
|
|
1505
1577
|
|
|
1506
1578
|
try {
|
|
1507
1579
|
// Do not emit head event here, when proposing we rely on the one emitted when importing our own block
|
|
1508
1580
|
const {head, isHeadTimely, notReorgedReason} = this.forkChoice.updateAndGetHead({
|
|
1509
1581
|
mode: UpdateHeadOpt.GetProposerHead,
|
|
1510
|
-
|
|
1582
|
+
msFromSlot,
|
|
1511
1583
|
slot,
|
|
1512
1584
|
});
|
|
1513
1585
|
|
|
@@ -1829,6 +1901,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1829
1901
|
|
|
1830
1902
|
this.attestationPool.prune(slot);
|
|
1831
1903
|
this.aggregatedAttestationPool.prune(slot);
|
|
1904
|
+
this.proposerTracker.prune(slot);
|
|
1905
|
+
this.singleAttestationPool.prune(this.proposerTracker);
|
|
1832
1906
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1833
1907
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1834
1908
|
this.payloadAttestationPool.prune(slot);
|
|
@@ -1855,6 +1929,55 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1855
1929
|
}
|
|
1856
1930
|
}
|
|
1857
1931
|
|
|
1932
|
+
/**
|
|
1933
|
+
* Track upcoming proposals of validators connected to this node, so that SingleAttestationPool only collects and
|
|
1934
|
+
* the network only subscribes to all attestation subnets before them. Proposals only change when the decision block
|
|
1935
|
+
* of next epoch proposers changes (the head enters a new epoch or reorgs that block) or a new validator connects,
|
|
1936
|
+
* set localProposalsKey to null before calling for the latter.
|
|
1937
|
+
* Never throws, it runs during block import.
|
|
1938
|
+
*/
|
|
1939
|
+
private refreshLocalProposals(): void {
|
|
1940
|
+
const clockSlot = this.clock.currentSlot;
|
|
1941
|
+
try {
|
|
1942
|
+
const headState = this.getHeadState();
|
|
1943
|
+
const headFork = this.config.getForkName(headState.slot);
|
|
1944
|
+
// post-fulu, the head state knows proposers of its epoch and the next one thanks to the proposer lookahead,
|
|
1945
|
+
// a pre-fulu state only predicts next epoch proposers
|
|
1946
|
+
if (!isForkPostFulu(headFork) || headState.epoch < computeEpochAtSlot(clockSlot) - 1) {
|
|
1947
|
+
return;
|
|
1948
|
+
}
|
|
1949
|
+
|
|
1950
|
+
const decisionRoot = proposerShufflingDecisionRoot(headFork, headState, headState.epoch + 1);
|
|
1951
|
+
if (decisionRoot === null) {
|
|
1952
|
+
return;
|
|
1953
|
+
}
|
|
1954
|
+
const localProposalsKey = `${headState.epoch}_${toRootHex(decisionRoot)}`;
|
|
1955
|
+
if (localProposalsKey === this.localProposalsKey) {
|
|
1956
|
+
return;
|
|
1957
|
+
}
|
|
1958
|
+
this.localProposalsKey = localProposalsKey;
|
|
1959
|
+
|
|
1960
|
+
const startSlot = computeStartSlotAtEpoch(headState.epoch);
|
|
1961
|
+
const newProposalSlots: Slot[] = [];
|
|
1962
|
+
for (const [i, proposerIndex] of [...headState.currentProposers, ...headState.nextProposers].entries()) {
|
|
1963
|
+
const proposalSlot = startSlot + i;
|
|
1964
|
+
if (
|
|
1965
|
+
proposalSlot >= clockSlot &&
|
|
1966
|
+
this.beaconProposerCache.has(proposerIndex) &&
|
|
1967
|
+
this.proposerTracker.addProposal(proposalSlot)
|
|
1968
|
+
) {
|
|
1969
|
+
newProposalSlots.push(proposalSlot);
|
|
1970
|
+
}
|
|
1971
|
+
}
|
|
1972
|
+
|
|
1973
|
+
if (newProposalSlots.length > 0) {
|
|
1974
|
+
this.emitter.emit(ChainEvent.localProposalSlots, newProposalSlots);
|
|
1975
|
+
}
|
|
1976
|
+
} catch (e) {
|
|
1977
|
+
this.logger.debug("Error refreshing local proposals", {slot: clockSlot}, e as Error);
|
|
1978
|
+
}
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1858
1981
|
private onClockEpoch(epoch: Epoch): void {
|
|
1859
1982
|
this.metrics?.clockEpoch.set(epoch);
|
|
1860
1983
|
|
|
@@ -1869,6 +1992,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1869
1992
|
protected onNewHead(head: ProtoBlock): void {
|
|
1870
1993
|
this.syncContributionAndProofPool.prune(head.slot);
|
|
1871
1994
|
this.seenContributionAndProof.prune(head.slot);
|
|
1995
|
+
|
|
1996
|
+
this.refreshLocalProposals();
|
|
1872
1997
|
}
|
|
1873
1998
|
|
|
1874
1999
|
private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
|
|
@@ -1937,6 +2062,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1937
2062
|
|
|
1938
2063
|
// Only update validator custody if we discovered new validators
|
|
1939
2064
|
if (newValidatorCount > previousValidatorCount) {
|
|
2065
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2066
|
+
this.localProposalsKey = null;
|
|
2067
|
+
this.refreshLocalProposals();
|
|
1940
2068
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1941
2069
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1942
2070
|
}
|
|
@@ -1952,6 +2080,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1952
2080
|
|
|
1953
2081
|
// Only update validator custody if we discovered new validators
|
|
1954
2082
|
if (hasNewValidators) {
|
|
2083
|
+
// new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
|
|
2084
|
+
this.localProposalsKey = null;
|
|
2085
|
+
this.refreshLocalProposals();
|
|
1955
2086
|
const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
|
|
1956
2087
|
await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
|
|
1957
2088
|
}
|
package/src/chain/emitter.ts
CHANGED
|
@@ -60,6 +60,11 @@ export enum ChainEvent {
|
|
|
60
60
|
* and is ready to be published.
|
|
61
61
|
*/
|
|
62
62
|
publishProposerSlashing = "publishProposerSlashing",
|
|
63
|
+
/**
|
|
64
|
+
* New block proposal slots of validators connected to this node, the network subscribes to all attestation
|
|
65
|
+
* subnets before them, see `slotsToSubscribeBeforeProposalDuty`
|
|
66
|
+
*/
|
|
67
|
+
localProposalSlots = "localProposalSlots",
|
|
63
68
|
/**
|
|
64
69
|
* Trigger an update of status so reqresp by peers have current earliestAvailableSlot
|
|
65
70
|
*/
|
|
@@ -127,6 +132,8 @@ export type IChainEvents = ApiEvents & {
|
|
|
127
132
|
|
|
128
133
|
[ChainEvent.publishProposerSlashing]: (proposerSlashing: phase0.ProposerSlashing) => void;
|
|
129
134
|
|
|
135
|
+
[ChainEvent.localProposalSlots]: (proposalSlots: Slot[]) => void;
|
|
136
|
+
|
|
130
137
|
[ChainEvent.updateStatus]: () => void;
|
|
131
138
|
|
|
132
139
|
// Sync events that are chain->chain. Initiated from network requests but do not cross the network
|
|
@@ -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",
|
|
@@ -12,6 +12,7 @@ export enum ExecutionPayloadEnvelopeErrorCode {
|
|
|
12
12
|
BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
|
|
13
13
|
BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
|
|
14
14
|
EXECUTION_REQUESTS_ROOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_EXECUTION_REQUESTS_ROOT_MISMATCH",
|
|
15
|
+
TOO_MANY_TRANSACTIONS = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_TOO_MANY_TRANSACTIONS",
|
|
15
16
|
INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
|
|
16
17
|
PAYLOAD_ENVELOPE_INPUT_MISSING = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_PAYLOAD_ENVELOPE_INPUT_MISSING",
|
|
17
18
|
}
|
|
@@ -54,6 +55,13 @@ export type ExecutionPayloadEnvelopeErrorType =
|
|
|
54
55
|
envelopeRequestsRoot: RootHex;
|
|
55
56
|
bidRequestsRoot: RootHex;
|
|
56
57
|
}
|
|
58
|
+
| {
|
|
59
|
+
code: ExecutionPayloadEnvelopeErrorCode.TOO_MANY_TRANSACTIONS;
|
|
60
|
+
slot: Slot;
|
|
61
|
+
root: RootHex;
|
|
62
|
+
transactionCount: number;
|
|
63
|
+
maxTransactionCount: number;
|
|
64
|
+
}
|
|
57
65
|
| {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE; slot: Slot; root: RootHex}
|
|
58
66
|
| {code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING; blockRoot: RootHex};
|
|
59
67
|
|
|
@@ -34,6 +34,17 @@ export type ForkChoiceOpts = RawForkChoiceOpts & {
|
|
|
34
34
|
export enum ForkchoiceCaller {
|
|
35
35
|
prepareNextSlot = "prepare_next_slot",
|
|
36
36
|
importBlock = "import_block",
|
|
37
|
+
executionInvalid = "execution_invalid",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Where an execution engine INVALID verdict comes from. Only `blockSegment` verdicts are about the payload the engine
|
|
42
|
+
* just processed and keep the consensus failure semantics in fork choice, the others are applied leniently.
|
|
43
|
+
*/
|
|
44
|
+
export enum ExecutionInvalidSource {
|
|
45
|
+
forkchoiceUpdated = "forkchoice_updated",
|
|
46
|
+
newPayload = "new_payload",
|
|
47
|
+
blockSegment = "block_segment",
|
|
37
48
|
}
|
|
38
49
|
|
|
39
50
|
/**
|