@lodestar/beacon-node 1.39.1 → 1.40.0-dev.059f489b0f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +23 -27
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -7
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js +0 -12
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/config/constants.d.ts +3 -0
- package/lib/api/impl/config/constants.d.ts.map +1 -1
- package/lib/api/impl/config/constants.js +5 -1
- package/lib/api/impl/config/constants.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +3 -6
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.d.ts.map +1 -1
- package/lib/api/impl/lodestar/index.js +30 -3
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/proof/index.d.ts.map +1 -1
- package/lib/api/impl/proof/index.js +1 -2
- package/lib/api/impl/proof/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +10 -11
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/rest/base.d.ts.map +1 -1
- package/lib/api/rest/base.js +2 -2
- package/lib/api/rest/base.js.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
- package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
- package/lib/chain/ColumnReconstructionTracker.js +7 -3
- package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js +7 -4
- package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +23 -14
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +30 -0
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +44 -3
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +15 -10
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +0 -14
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +0 -2
- 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 +9 -9
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +2 -2
- package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.d.ts +1 -4
- package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +28 -28
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/bls/multithread/index.d.ts +3 -1
- package/lib/chain/bls/multithread/index.d.ts.map +1 -1
- package/lib/chain/bls/multithread/index.js +5 -3
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
- package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
- package/lib/chain/bls/multithread/jobItem.js +2 -2
- package/lib/chain/bls/multithread/jobItem.js.map +1 -1
- package/lib/chain/bls/singleThread.d.ts +4 -2
- package/lib/chain/bls/singleThread.d.ts.map +1 -1
- package/lib/chain/bls/singleThread.js +4 -2
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.d.ts +2 -2
- package/lib/chain/bls/utils.d.ts.map +1 -1
- package/lib/chain/bls/utils.js +9 -6
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +25 -7
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +213 -50
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/attestationError.d.ts +14 -1
- package/lib/chain/errors/attestationError.d.ts.map +1 -1
- package/lib/chain/errors/attestationError.js +8 -0
- package/lib/chain/errors/attestationError.js.map +1 -1
- package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
- package/lib/chain/errors/executionPayloadBid.js +15 -0
- package/lib/chain/errors/executionPayloadBid.js.map +1 -0
- package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
- package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
- package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
- package/lib/chain/errors/index.d.ts +3 -0
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +3 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/errors/payloadAttestation.d.ts +34 -0
- package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
- package/lib/chain/errors/payloadAttestation.js +13 -0
- package/lib/chain/errors/payloadAttestation.js.map +1 -0
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +18 -0
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/initState.d.ts +1 -1
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +7 -5
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +23 -5
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/lightClient/index.d.ts.map +1 -1
- package/lib/chain/lightClient/index.js +1 -2
- package/lib/chain/lightClient/index.js.map +1 -1
- package/lib/chain/lightClient/proofs.d.ts.map +1 -1
- package/lib/chain/lightClient/proofs.js +0 -2
- package/lib/chain/lightClient/proofs.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +5 -9
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +12 -141
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
- package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
- package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
- package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
- package/lib/chain/opPools/index.d.ts +2 -0
- package/lib/chain/opPools/index.d.ts.map +1 -1
- package/lib/chain/opPools/index.js +2 -0
- package/lib/chain/opPools/index.js.map +1 -1
- package/lib/chain/opPools/opPool.js +5 -8
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
- package/lib/chain/opPools/payloadAttestationPool.js +109 -0
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
- 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/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +9 -10
- package/lib/chain/prepareNextSlot.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 +6 -4
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +5 -14
- 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/regen/queued.d.ts +6 -10
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +16 -40
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +6 -8
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +20 -34
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/seenCache/index.d.ts +3 -1
- package/lib/chain/seenCache/index.d.ts.map +1 -1
- package/lib/chain/seenCache/index.js +3 -1
- package/lib/chain/seenCache/index.js.map +1 -1
- package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
- package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
- package/lib/chain/seenCache/seenAttesters.js +5 -0
- package/lib/chain/seenCache/seenAttesters.js.map +1 -1
- package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
- package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
- package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
- package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +3 -3
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/shufflingCache.d.ts +16 -11
- package/lib/chain/shufflingCache.d.ts.map +1 -1
- package/lib/chain/shufflingCache.js +47 -41
- package/lib/chain/shufflingCache.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -2
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.js +4 -4
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/index.d.ts +0 -2
- package/lib/chain/stateCache/index.d.ts.map +1 -1
- package/lib/chain/stateCache/index.js +0 -2
- package/lib/chain/stateCache/index.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +7 -7
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +20 -17
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +5 -6
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.js +35 -14
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts +2 -2
- package/lib/chain/validation/attestation.d.ts.map +1 -1
- package/lib/chain/validation/attestation.js +28 -9
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +2 -2
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
- package/lib/chain/validation/blobSidecar.js +5 -5
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +8 -6
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -1
- package/lib/chain/validation/blsToExecutionChange.js +9 -2
- package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +5 -5
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
- package/lib/chain/validation/executionPayloadBid.js +104 -0
- package/lib/chain/validation/executionPayloadBid.js.map +1 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
- package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
- package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
- package/lib/chain/validation/payloadAttestationMessage.js +72 -0
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
- package/lib/chain/validation/proposerSlashing.js +3 -2
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
- package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
- package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
- package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
- package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
- package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
- package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
- package/lib/chain/validation/syncCommittee.js +1 -1
- package/lib/chain/validation/syncCommittee.js.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
- package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
- package/lib/chain/validation/voluntaryExit.js +1 -1
- package/lib/chain/validation/voluntaryExit.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +2 -0
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +49 -7
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/db/repositories/checkpointState.d.ts +2 -6
- package/lib/db/repositories/checkpointState.d.ts.map +1 -1
- package/lib/db/repositories/checkpointState.js +3 -16
- package/lib/db/repositories/checkpointState.js.map +1 -1
- package/lib/db/repositories/stateArchive.d.ts +9 -9
- package/lib/db/repositories/stateArchive.d.ts.map +1 -1
- package/lib/db/repositories/stateArchive.js +6 -21
- package/lib/db/repositories/stateArchive.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +9 -6
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +34 -7
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +28 -6
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +67 -17
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +3 -0
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +9 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +3 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -0
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +9 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +3 -0
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +34 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +123 -0
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +20 -2
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +3 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
- package/lib/network/gossip/scoringParameters.js +38 -2
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +77 -1
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +20 -0
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/network.d.ts +3 -0
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +9 -0
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts +6 -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.map +1 -1
- package/lib/network/peers/peerManager.js +9 -0
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +35 -4
- 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 +16 -0
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +3 -0
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -4
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +1 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +5 -26
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +1 -2
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +5 -7
- package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +1 -2
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -5
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/index.js +2 -2
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js +1 -1
- package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +17 -2
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts.map +1 -1
- package/lib/sync/backfill/backfill.js +3 -4
- package/lib/sync/backfill/backfill.js.map +1 -1
- package/lib/sync/backfill/verify.d.ts +1 -2
- package/lib/sync/backfill/verify.d.ts.map +1 -1
- package/lib/sync/backfill/verify.js +2 -2
- package/lib/sync/backfill/verify.js.map +1 -1
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +0 -1
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts.map +1 -1
- package/lib/sync/range/range.js +0 -3
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +0 -3
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +2 -2
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +1 -2
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/util/sszBytes.js +1 -1
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +16 -16
- package/src/api/impl/beacon/blocks/index.ts +39 -37
- package/src/api/impl/beacon/state/utils.ts +2 -22
- package/src/api/impl/config/constants.ts +8 -0
- package/src/api/impl/debug/index.ts +2 -6
- package/src/api/impl/lodestar/index.ts +36 -4
- package/src/api/impl/proof/index.ts +1 -2
- package/src/api/impl/validator/index.ts +15 -15
- package/src/api/rest/base.ts +4 -4
- package/src/chain/ColumnReconstructionTracker.ts +8 -4
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +7 -4
- package/src/chain/archiveStore/utils/archiveBlocks.ts +25 -14
- package/src/chain/blocks/blockInput/blockInput.ts +55 -4
- package/src/chain/blocks/importBlock.ts +16 -10
- package/src/chain/blocks/index.ts +0 -19
- package/src/chain/blocks/types.ts +0 -2
- package/src/chain/blocks/verifyBlock.ts +9 -12
- package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
- package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +2 -2
- package/src/chain/blocks/writeBlockInputToDb.ts +33 -30
- package/src/chain/bls/multithread/index.ts +7 -4
- package/src/chain/bls/multithread/jobItem.ts +7 -3
- package/src/chain/bls/singleThread.ts +5 -3
- package/src/chain/bls/utils.ts +15 -7
- package/src/chain/chain.ts +247 -65
- package/src/chain/errors/attestationError.ts +11 -1
- package/src/chain/errors/executionPayloadBid.ts +35 -0
- package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
- package/src/chain/errors/index.ts +3 -0
- package/src/chain/errors/payloadAttestation.ts +25 -0
- package/src/chain/forkChoice/index.ts +19 -0
- package/src/chain/initState.ts +7 -5
- package/src/chain/interface.ts +34 -3
- package/src/chain/lightClient/index.ts +1 -2
- package/src/chain/lightClient/proofs.ts +0 -2
- package/src/chain/opPools/aggregatedAttestationPool.ts +19 -191
- package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
- package/src/chain/opPools/index.ts +2 -0
- package/src/chain/opPools/opPool.ts +5 -7
- package/src/chain/opPools/payloadAttestationPool.ts +157 -0
- package/src/chain/options.ts +0 -2
- package/src/chain/prepareNextSlot.ts +8 -12
- package/src/chain/produceBlock/produceBlockBody.ts +13 -6
- package/src/chain/regen/interface.ts +4 -18
- package/src/chain/regen/queued.ts +17 -57
- package/src/chain/regen/regen.ts +22 -43
- package/src/chain/seenCache/index.ts +3 -1
- package/src/chain/seenCache/seenAttesters.ts +5 -0
- package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
- package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
- package/src/chain/seenCache/seenGossipBlockInput.ts +3 -3
- package/src/chain/shufflingCache.ts +67 -50
- package/src/chain/stateCache/fifoBlockStateCache.ts +4 -5
- package/src/chain/stateCache/index.ts +0 -2
- package/src/chain/stateCache/persistentCheckpointsCache.ts +23 -27
- package/src/chain/stateCache/types.ts +5 -10
- package/src/chain/validation/aggregateAndProof.ts +36 -14
- package/src/chain/validation/attestation.ts +36 -19
- package/src/chain/validation/attesterSlashing.ts +9 -7
- package/src/chain/validation/blobSidecar.ts +4 -9
- package/src/chain/validation/block.ts +9 -6
- package/src/chain/validation/blsToExecutionChange.ts +9 -7
- package/src/chain/validation/dataColumnSidecar.ts +4 -9
- package/src/chain/validation/executionPayloadBid.ts +141 -0
- package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
- package/src/chain/validation/payloadAttestationMessage.ts +109 -0
- package/src/chain/validation/proposerSlashing.ts +3 -7
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
- package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
- package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
- package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
- package/src/chain/validation/syncCommittee.ts +1 -1
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
- package/src/chain/validation/voluntaryExit.ts +1 -1
- package/src/chain/validatorMonitor.ts +62 -8
- package/src/db/repositories/checkpointState.ts +3 -19
- package/src/db/repositories/stateArchive.ts +13 -27
- package/src/execution/engine/mock.ts +40 -13
- package/src/index.ts +1 -1
- package/src/metrics/metrics/lodestar.ts +68 -17
- package/src/network/core/networkCore.ts +12 -0
- package/src/network/core/networkCoreWorker.ts +3 -0
- package/src/network/core/networkCoreWorkerHandler.ts +9 -0
- package/src/network/core/types.ts +6 -0
- package/src/network/gossip/gossipsub.ts +147 -1
- package/src/network/gossip/interface.ts +17 -0
- package/src/network/gossip/scoringParameters.ts +44 -2
- package/src/network/gossip/topic.ts +21 -0
- package/src/network/network.ts +12 -0
- package/src/network/options.ts +6 -0
- package/src/network/peers/peerManager.ts +11 -0
- package/src/network/processor/gossipHandlers.ts +49 -4
- package/src/network/processor/gossipQueues/index.ts +16 -0
- package/src/network/processor/index.ts +3 -0
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -4
- package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +5 -32
- package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +5 -9
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +5 -2
- package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -5
- package/src/network/reqresp/handlers/index.ts +2 -2
- package/src/network/reqresp/utils/dataColumnResponseValidation.ts +1 -1
- package/src/node/nodejs.ts +18 -3
- package/src/sync/backfill/backfill.ts +3 -4
- package/src/sync/backfill/verify.ts +2 -3
- package/src/sync/range/chain.ts +0 -1
- package/src/sync/range/range.ts +0 -3
- package/src/sync/unknownBlock.ts +0 -3
- package/src/sync/utils/downloadByRange.ts +2 -2
- package/src/sync/utils/downloadByRoot.ts +1 -2
- package/src/util/sszBytes.ts +1 -1
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -55
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
- package/lib/chain/stateCache/blockStateCacheImpl.js +0 -130
- package/lib/chain/stateCache/blockStateCacheImpl.js.map +0 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +0 -61
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -157
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
- package/lib/util/bytes.d.ts +0 -3
- package/lib/util/bytes.d.ts.map +0 -1
- package/lib/util/bytes.js +0 -11
- package/lib/util/bytes.js.map +0 -1
- package/src/chain/stateCache/blockStateCacheImpl.ts +0 -150
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -198
- package/src/util/bytes.ts +0 -11
package/src/chain/chain.ts
CHANGED
|
@@ -37,14 +37,19 @@ import {
|
|
|
37
37
|
UintNum64,
|
|
38
38
|
ValidatorIndex,
|
|
39
39
|
Wei,
|
|
40
|
+
deneb,
|
|
41
|
+
fulu,
|
|
40
42
|
isBlindedBeaconBlock,
|
|
41
43
|
phase0,
|
|
42
44
|
rewards,
|
|
45
|
+
ssz,
|
|
46
|
+
sszTypesFor,
|
|
43
47
|
} from "@lodestar/types";
|
|
44
48
|
import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRootHex} from "@lodestar/utils";
|
|
45
49
|
import {ProcessShutdownCallback} from "@lodestar/validator";
|
|
46
50
|
import {GENESIS_EPOCH, ZERO_HASH} from "../constants/index.js";
|
|
47
51
|
import {IBeaconDb} from "../db/index.js";
|
|
52
|
+
import {BLOB_SIDECARS_IN_WRAPPER_INDEX} from "../db/repositories/blobSidecars.ts";
|
|
48
53
|
import {BuilderStatus} from "../execution/builder/http.js";
|
|
49
54
|
import {IExecutionBuilder, IExecutionEngine} from "../execution/index.js";
|
|
50
55
|
import {Metrics} from "../metrics/index.js";
|
|
@@ -52,14 +57,18 @@ import {computeNodeIdFromPrivateKey} from "../network/subnets/interface.js";
|
|
|
52
57
|
import {BufferPool} from "../util/bufferPool.js";
|
|
53
58
|
import {Clock, ClockEvent, IClock} from "../util/clock.js";
|
|
54
59
|
import {CustodyConfig, getValidatorsCustodyRequirement} from "../util/dataColumns.js";
|
|
60
|
+
import {callInNextEventLoop} from "../util/eventLoop.js";
|
|
55
61
|
import {ensureDir, writeIfNotExist} from "../util/file.js";
|
|
56
62
|
import {isOptimisticBlock} from "../util/forkChoice.js";
|
|
63
|
+
import {JobItemQueue} from "../util/queue/itemQueue.ts";
|
|
57
64
|
import {SerializedCache} from "../util/serializedCache.js";
|
|
65
|
+
import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.ts";
|
|
58
66
|
import {ArchiveStore} from "./archiveStore/archiveStore.js";
|
|
59
67
|
import {CheckpointBalancesCache} from "./balancesCache.js";
|
|
60
68
|
import {BeaconProposerCache} from "./beaconProposerCache.js";
|
|
61
|
-
import {IBlockInput} from "./blocks/blockInput/index.js";
|
|
69
|
+
import {IBlockInput, isBlockInputBlobs, isBlockInputColumns} from "./blocks/blockInput/index.js";
|
|
62
70
|
import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
|
|
71
|
+
import {persistBlockInputs} from "./blocks/writeBlockInputToDb.ts";
|
|
63
72
|
import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
|
|
64
73
|
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
65
74
|
import {ChainEvent, ChainEventEmitter} from "./emitter.js";
|
|
@@ -70,7 +79,9 @@ import {LightClientServer} from "./lightClient/index.js";
|
|
|
70
79
|
import {
|
|
71
80
|
AggregatedAttestationPool,
|
|
72
81
|
AttestationPool,
|
|
82
|
+
ExecutionPayloadBidPool,
|
|
73
83
|
OpPool,
|
|
84
|
+
PayloadAttestationPool,
|
|
74
85
|
SyncCommitteeMessagePool,
|
|
75
86
|
SyncContributionAndProofPool,
|
|
76
87
|
} from "./opPools/index.js";
|
|
@@ -86,6 +97,9 @@ import {
|
|
|
86
97
|
SeenAttesters,
|
|
87
98
|
SeenBlockProposers,
|
|
88
99
|
SeenContributionAndProof,
|
|
100
|
+
SeenExecutionPayloadBids,
|
|
101
|
+
SeenExecutionPayloadEnvelopes,
|
|
102
|
+
SeenPayloadAttesters,
|
|
89
103
|
SeenSyncCommitteeMessages,
|
|
90
104
|
} from "./seenCache/index.js";
|
|
91
105
|
import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
|
|
@@ -93,12 +107,10 @@ import {SeenAttestationDatas} from "./seenCache/seenAttestationData.js";
|
|
|
93
107
|
import {SeenBlockAttesters} from "./seenCache/seenBlockAttesters.js";
|
|
94
108
|
import {SeenBlockInput} from "./seenCache/seenGossipBlockInput.js";
|
|
95
109
|
import {ShufflingCache} from "./shufflingCache.js";
|
|
96
|
-
import {BlockStateCacheImpl} from "./stateCache/blockStateCacheImpl.js";
|
|
97
110
|
import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datastore/db.js";
|
|
98
111
|
import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
|
|
99
112
|
import {CPStateDatastore} from "./stateCache/datastore/types.js";
|
|
100
113
|
import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
|
|
101
|
-
import {InMemoryCheckpointStateCache} from "./stateCache/inMemoryCheckpointsCache.js";
|
|
102
114
|
import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
|
|
103
115
|
import {CheckpointStateCache} from "./stateCache/types.js";
|
|
104
116
|
import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
@@ -112,6 +124,11 @@ import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
|
112
124
|
*/
|
|
113
125
|
const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
|
|
114
126
|
|
|
127
|
+
/**
|
|
128
|
+
* The maximum number of pending unfinalized block writes to the database before backpressure is applied.
|
|
129
|
+
*/
|
|
130
|
+
const DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES = 32;
|
|
131
|
+
|
|
115
132
|
export class BeaconChain implements IBeaconChain {
|
|
116
133
|
readonly genesisTime: UintNum64;
|
|
117
134
|
readonly genesisValidatorsRoot: Root;
|
|
@@ -123,7 +140,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
123
140
|
readonly logger: Logger;
|
|
124
141
|
readonly metrics: Metrics | null;
|
|
125
142
|
readonly validatorMonitor: ValidatorMonitor | null;
|
|
126
|
-
readonly bufferPool: BufferPool
|
|
143
|
+
readonly bufferPool: BufferPool;
|
|
127
144
|
|
|
128
145
|
readonly anchorStateLatestBlockSlot: Slot;
|
|
129
146
|
|
|
@@ -135,18 +152,24 @@ export class BeaconChain implements IBeaconChain {
|
|
|
135
152
|
readonly lightClientServer?: LightClientServer;
|
|
136
153
|
readonly reprocessController: ReprocessController;
|
|
137
154
|
readonly archiveStore: ArchiveStore;
|
|
155
|
+
readonly unfinalizedBlockWrites: JobItemQueue<[IBlockInput[]], void>;
|
|
138
156
|
|
|
139
157
|
// Ops pool
|
|
140
158
|
readonly attestationPool: AttestationPool;
|
|
141
159
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
142
160
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
143
161
|
readonly syncContributionAndProofPool;
|
|
162
|
+
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
163
|
+
readonly payloadAttestationPool: PayloadAttestationPool;
|
|
144
164
|
readonly opPool: OpPool;
|
|
145
165
|
|
|
146
166
|
// Gossip seen cache
|
|
147
167
|
readonly seenAttesters = new SeenAttesters();
|
|
148
168
|
readonly seenAggregators = new SeenAggregators();
|
|
169
|
+
readonly seenPayloadAttesters = new SeenPayloadAttesters();
|
|
149
170
|
readonly seenAggregatedAttestations: SeenAggregatedAttestations;
|
|
171
|
+
readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
|
|
172
|
+
readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
|
|
150
173
|
readonly seenBlockProposers = new SeenBlockProposers();
|
|
151
174
|
readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
|
|
152
175
|
readonly seenContributionAndProof: SeenContributionAndProof;
|
|
@@ -253,8 +276,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
253
276
|
const emitter = new ChainEventEmitter();
|
|
254
277
|
// by default, verify signatures on both main threads and worker threads
|
|
255
278
|
const bls = opts.blsVerifyAllMainThread
|
|
256
|
-
? new BlsSingleThreadVerifier({metrics})
|
|
257
|
-
: new BlsMultiThreadWorkerPool(opts, {logger, metrics});
|
|
279
|
+
? new BlsSingleThreadVerifier({metrics, index2pubkey})
|
|
280
|
+
: new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
|
|
258
281
|
|
|
259
282
|
if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
|
|
260
283
|
|
|
@@ -263,6 +286,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
263
286
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
|
|
264
287
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
265
288
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
289
|
+
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
290
|
+
this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
|
|
266
291
|
this.opPool = new OpPool(config);
|
|
267
292
|
|
|
268
293
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
@@ -291,7 +316,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
291
316
|
});
|
|
292
317
|
|
|
293
318
|
this._earliestAvailableSlot = anchorState.slot;
|
|
294
|
-
|
|
319
|
+
|
|
320
|
+
this.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
|
|
295
321
|
{
|
|
296
322
|
shuffling: anchorState.epochCtx.previousShuffling,
|
|
297
323
|
decisionRoot: anchorState.epochCtx.previousDecisionRoot,
|
|
@@ -311,32 +337,22 @@ export class BeaconChain implements IBeaconChain {
|
|
|
311
337
|
this.index2pubkey = index2pubkey;
|
|
312
338
|
|
|
313
339
|
const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
|
|
314
|
-
const blockStateCache = this.opts
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
this.
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
clock,
|
|
331
|
-
blockStateCache,
|
|
332
|
-
bufferPool: this.bufferPool,
|
|
333
|
-
datastore: this.cpStateDatastore,
|
|
334
|
-
},
|
|
335
|
-
this.opts
|
|
336
|
-
);
|
|
337
|
-
} else {
|
|
338
|
-
checkpointStateCache = new InMemoryCheckpointStateCache({metrics});
|
|
339
|
-
}
|
|
340
|
+
const blockStateCache = new FIFOBlockStateCache(this.opts, {metrics});
|
|
341
|
+
this.bufferPool = new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics);
|
|
342
|
+
|
|
343
|
+
this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
|
|
344
|
+
const checkpointStateCache: CheckpointStateCache = new PersistentCheckpointStateCache(
|
|
345
|
+
{
|
|
346
|
+
config,
|
|
347
|
+
metrics,
|
|
348
|
+
logger,
|
|
349
|
+
clock,
|
|
350
|
+
blockStateCache,
|
|
351
|
+
bufferPool: this.bufferPool,
|
|
352
|
+
datastore: this.cpStateDatastore,
|
|
353
|
+
},
|
|
354
|
+
this.opts
|
|
355
|
+
);
|
|
340
356
|
|
|
341
357
|
const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
|
|
342
358
|
blockStateCache.add(anchorState);
|
|
@@ -359,6 +375,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
359
375
|
forkChoice,
|
|
360
376
|
blockStateCache,
|
|
361
377
|
checkpointStateCache,
|
|
378
|
+
seenBlockInputCache: this.seenBlockInputCache,
|
|
362
379
|
db,
|
|
363
380
|
metrics,
|
|
364
381
|
validatorMonitor,
|
|
@@ -403,6 +420,15 @@ export class BeaconChain implements IBeaconChain {
|
|
|
403
420
|
signal
|
|
404
421
|
);
|
|
405
422
|
|
|
423
|
+
this.unfinalizedBlockWrites = new JobItemQueue(
|
|
424
|
+
persistBlockInputs.bind(this),
|
|
425
|
+
{
|
|
426
|
+
maxLength: DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES,
|
|
427
|
+
signal,
|
|
428
|
+
},
|
|
429
|
+
metrics?.unfinalizedBlockWritesQueue
|
|
430
|
+
);
|
|
431
|
+
|
|
406
432
|
// always run PrepareNextSlotScheduler except for fork_choice spec tests
|
|
407
433
|
if (!opts?.disablePrepareNextSlot) {
|
|
408
434
|
new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
|
|
@@ -417,6 +443,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
417
443
|
clock.addListener(ClockEvent.epoch, this.onClockEpoch.bind(this));
|
|
418
444
|
emitter.addListener(ChainEvent.forkChoiceFinalized, this.onForkChoiceFinalized.bind(this));
|
|
419
445
|
emitter.addListener(ChainEvent.forkChoiceJustified, this.onForkChoiceJustified.bind(this));
|
|
446
|
+
emitter.addListener(ChainEvent.checkpoint, this.onCheckpoint.bind(this));
|
|
420
447
|
}
|
|
421
448
|
|
|
422
449
|
async init(): Promise<void> {
|
|
@@ -427,6 +454,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
427
454
|
async close(): Promise<void> {
|
|
428
455
|
await this.archiveStore.close();
|
|
429
456
|
await this.bls.close();
|
|
457
|
+
|
|
458
|
+
// Since we don't persist unfinalized fork-choice,
|
|
459
|
+
// we can abort any ongoing unfinalized block writes.
|
|
460
|
+
// TODO: persist fork choice to disk and allow unfinalized block writes to complete.
|
|
461
|
+
this.unfinalizedBlockWrites.dropAllJobs();
|
|
462
|
+
|
|
430
463
|
this.abortController.abort();
|
|
431
464
|
}
|
|
432
465
|
|
|
@@ -456,6 +489,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
456
489
|
this.seenAttesters.isKnown(epoch, index) ||
|
|
457
490
|
// seenAggregators = single aggregator index, not participants of the aggregate
|
|
458
491
|
this.seenAggregators.isKnown(epoch, index) ||
|
|
492
|
+
// seenPayloadAttesters = single signer of payload attestation message
|
|
493
|
+
this.seenPayloadAttesters.isKnown(epoch, index) ||
|
|
459
494
|
// seenBlockProposers = single block proposer
|
|
460
495
|
this.seenBlockProposers.seenAtEpoch(epoch, index)
|
|
461
496
|
);
|
|
@@ -498,13 +533,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
498
533
|
// only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
|
|
499
534
|
const head = this.forkChoice.getHead();
|
|
500
535
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
501
|
-
return this.regen.getBlockSlotState(head
|
|
536
|
+
return this.regen.getBlockSlotState(head, startSlot, {dontTransferCache: true}, regenCaller);
|
|
502
537
|
}
|
|
503
538
|
|
|
504
539
|
async getStateBySlot(
|
|
505
540
|
slot: Slot,
|
|
506
541
|
opts?: StateGetOpts
|
|
507
|
-
): Promise<{state:
|
|
542
|
+
): Promise<{state: CachedBeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
508
543
|
const finalizedBlock = this.forkChoice.getFinalizedBlock();
|
|
509
544
|
|
|
510
545
|
if (slot < finalizedBlock.slot) {
|
|
@@ -516,12 +551,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
516
551
|
if (opts?.allowRegen) {
|
|
517
552
|
// Find closest canonical block to slot, then trigger regen
|
|
518
553
|
const block = this.forkChoice.getCanonicalBlockClosestLteSlot(slot) ?? finalizedBlock;
|
|
519
|
-
const state = await this.regen.getBlockSlotState(
|
|
520
|
-
block.blockRoot,
|
|
521
|
-
slot,
|
|
522
|
-
{dontTransferCache: true},
|
|
523
|
-
RegenCaller.restApi
|
|
524
|
-
);
|
|
554
|
+
const state = await this.regen.getBlockSlotState(block, slot, {dontTransferCache: true}, RegenCaller.restApi);
|
|
525
555
|
return {
|
|
526
556
|
state,
|
|
527
557
|
executionOptimistic: isOptimisticBlock(block),
|
|
@@ -559,7 +589,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
559
589
|
async getStateByStateRoot(
|
|
560
590
|
stateRoot: RootHex,
|
|
561
591
|
opts?: StateGetOpts
|
|
562
|
-
): Promise<{state:
|
|
592
|
+
): Promise<{state: CachedBeaconStateAllForks | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
563
593
|
if (opts?.allowRegen) {
|
|
564
594
|
const state = await this.regen.getState(stateRoot, RegenCaller.restApi);
|
|
565
595
|
const block = this.forkChoice.getBlock(state.latestBlockHeader.hashTreeRoot());
|
|
@@ -587,7 +617,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
587
617
|
};
|
|
588
618
|
}
|
|
589
619
|
|
|
590
|
-
|
|
620
|
+
// this is mostly useful for a node with `--chain.archiveStateEpochFrequency 1`
|
|
621
|
+
const data = await this.db.stateArchive.getBinaryByRoot(fromHex(stateRoot));
|
|
591
622
|
return data && {state: data, executionOptimistic: false, finalized: true};
|
|
592
623
|
}
|
|
593
624
|
|
|
@@ -648,6 +679,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
648
679
|
// Unfinalized slot, attempt to find in fork-choice
|
|
649
680
|
const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
|
|
650
681
|
if (block) {
|
|
682
|
+
// Block found in fork-choice.
|
|
683
|
+
// It may be in the block input cache, awaiting full DA reconstruction, check there first
|
|
684
|
+
// Otherwise (most likely), check the hot db
|
|
685
|
+
const blockInput = this.seenBlockInputCache.get(block.blockRoot);
|
|
686
|
+
if (blockInput?.hasBlock()) {
|
|
687
|
+
return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
688
|
+
}
|
|
651
689
|
const data = await this.db.block.get(fromHex(block.blockRoot));
|
|
652
690
|
if (data) {
|
|
653
691
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -667,6 +705,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
667
705
|
): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
668
706
|
const block = this.forkChoice.getBlockHex(root);
|
|
669
707
|
if (block) {
|
|
708
|
+
// Block found in fork-choice.
|
|
709
|
+
// It may be in the block input cache, awaiting full DA reconstruction, check there first
|
|
710
|
+
// Otherwise (most likely), check the hot db
|
|
711
|
+
const blockInput = this.seenBlockInputCache.get(block.blockRoot);
|
|
712
|
+
if (blockInput?.hasBlock()) {
|
|
713
|
+
return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
714
|
+
}
|
|
670
715
|
const data = await this.db.block.get(fromHex(root));
|
|
671
716
|
if (data) {
|
|
672
717
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -679,10 +724,137 @@ export class BeaconChain implements IBeaconChain {
|
|
|
679
724
|
return data && {block: data, executionOptimistic: false, finalized: true};
|
|
680
725
|
}
|
|
681
726
|
|
|
727
|
+
async getSerializedBlockByRoot(
|
|
728
|
+
root: string
|
|
729
|
+
): Promise<{block: Uint8Array; executionOptimistic: boolean; finalized: boolean; slot: Slot} | null> {
|
|
730
|
+
const block = this.forkChoice.getBlockHex(root);
|
|
731
|
+
if (block) {
|
|
732
|
+
// Block found in fork-choice.
|
|
733
|
+
// It may be in the block input cache, awaiting full DA reconstruction, check there first
|
|
734
|
+
// Otherwise (most likely), check the hot db
|
|
735
|
+
const blockInput = this.seenBlockInputCache.get(block.blockRoot);
|
|
736
|
+
if (blockInput?.hasBlock()) {
|
|
737
|
+
const signedBlock = blockInput.getBlock();
|
|
738
|
+
const serialized = this.serializedCache.get(signedBlock);
|
|
739
|
+
if (serialized) {
|
|
740
|
+
return {
|
|
741
|
+
block: serialized,
|
|
742
|
+
executionOptimistic: isOptimisticBlock(block),
|
|
743
|
+
finalized: false,
|
|
744
|
+
slot: blockInput.slot,
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
return {
|
|
748
|
+
block: sszTypesFor(blockInput.forkName).SignedBeaconBlock.serialize(signedBlock),
|
|
749
|
+
executionOptimistic: isOptimisticBlock(block),
|
|
750
|
+
finalized: false,
|
|
751
|
+
slot: blockInput.slot,
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
const data = await this.db.block.getBinary(fromHex(root));
|
|
755
|
+
if (data) {
|
|
756
|
+
const slot = getSlotFromSignedBeaconBlockSerialized(data);
|
|
757
|
+
if (slot === null) throw new Error(`Invalid block data stored in DB for root: ${root}`);
|
|
758
|
+
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false, slot};
|
|
759
|
+
}
|
|
760
|
+
// If block is not found in hot db, try cold db since there could be an archive cycle happening
|
|
761
|
+
// TODO: Add a lock to the archiver to have deterministic behavior on where are blocks
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
const data = await this.db.blockArchive.getBinaryEntryByRoot(fromHex(root));
|
|
765
|
+
return data && {block: data.value, executionOptimistic: false, finalized: true, slot: data.key};
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
|
|
769
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
770
|
+
if (blockInput) {
|
|
771
|
+
if (!isBlockInputBlobs(blockInput)) {
|
|
772
|
+
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
773
|
+
}
|
|
774
|
+
if (!blockInput.hasAllData()) {
|
|
775
|
+
return null;
|
|
776
|
+
}
|
|
777
|
+
return blockInput.getBlobs();
|
|
778
|
+
}
|
|
779
|
+
const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
|
|
780
|
+
if (unfinalizedBlobSidecars) {
|
|
781
|
+
return unfinalizedBlobSidecars;
|
|
782
|
+
}
|
|
783
|
+
return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
787
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
788
|
+
if (blockInput) {
|
|
789
|
+
if (!isBlockInputBlobs(blockInput)) {
|
|
790
|
+
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
791
|
+
}
|
|
792
|
+
if (!blockInput.hasAllData()) {
|
|
793
|
+
return null;
|
|
794
|
+
}
|
|
795
|
+
return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
|
|
796
|
+
}
|
|
797
|
+
const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
|
|
798
|
+
if (unfinalizedBlobSidecarsWrapper) {
|
|
799
|
+
return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
800
|
+
}
|
|
801
|
+
const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
|
|
802
|
+
if (finalizedBlobSidecarsWrapper) {
|
|
803
|
+
return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
804
|
+
}
|
|
805
|
+
return null;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<fulu.DataColumnSidecars> {
|
|
809
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
810
|
+
if (blockInput) {
|
|
811
|
+
if (!isBlockInputColumns(blockInput)) {
|
|
812
|
+
throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
|
|
813
|
+
}
|
|
814
|
+
return blockInput.getAllColumns();
|
|
815
|
+
}
|
|
816
|
+
const sidecarsUnfinalized = await this.db.dataColumnSidecar.values(fromHex(blockRootHex));
|
|
817
|
+
if (sidecarsUnfinalized.length > 0) {
|
|
818
|
+
return sidecarsUnfinalized;
|
|
819
|
+
}
|
|
820
|
+
const sidecarsFinalized = await this.db.dataColumnSidecarArchive.values(blockSlot);
|
|
821
|
+
return sidecarsFinalized;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
async getSerializedDataColumnSidecars(
|
|
825
|
+
blockSlot: Slot,
|
|
826
|
+
blockRootHex: string,
|
|
827
|
+
indices: number[]
|
|
828
|
+
): Promise<(Uint8Array | undefined)[]> {
|
|
829
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
830
|
+
if (blockInput) {
|
|
831
|
+
if (!isBlockInputColumns(blockInput)) {
|
|
832
|
+
throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
|
|
833
|
+
}
|
|
834
|
+
return indices.map((index) => {
|
|
835
|
+
const sidecar = blockInput.getColumn(index);
|
|
836
|
+
if (!sidecar) {
|
|
837
|
+
return undefined;
|
|
838
|
+
}
|
|
839
|
+
const serialized = this.serializedCache.get(sidecar);
|
|
840
|
+
if (serialized) {
|
|
841
|
+
return serialized;
|
|
842
|
+
}
|
|
843
|
+
return ssz.fulu.DataColumnSidecar.serialize(sidecar);
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
const sidecarsUnfinalized = await this.db.dataColumnSidecar.getManyBinary(fromHex(blockRootHex), indices);
|
|
847
|
+
if (sidecarsUnfinalized.some((sidecar) => sidecar != null)) {
|
|
848
|
+
return sidecarsUnfinalized;
|
|
849
|
+
}
|
|
850
|
+
const sidecarsFinalized = await this.db.dataColumnSidecarArchive.getManyBinary(blockSlot, indices);
|
|
851
|
+
return sidecarsFinalized;
|
|
852
|
+
}
|
|
853
|
+
|
|
682
854
|
async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
|
|
683
|
-
const {slot,
|
|
855
|
+
const {slot, parentBlock} = blockAttributes;
|
|
684
856
|
const state = await this.regen.getBlockSlotState(
|
|
685
|
-
|
|
857
|
+
parentBlock,
|
|
686
858
|
slot,
|
|
687
859
|
{dontTransferCache: true},
|
|
688
860
|
RegenCaller.produceBlock
|
|
@@ -719,7 +891,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
719
891
|
slot,
|
|
720
892
|
feeRecipient,
|
|
721
893
|
commonBlockBodyPromise,
|
|
722
|
-
|
|
894
|
+
parentBlock,
|
|
723
895
|
}: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
|
|
724
896
|
): Promise<{
|
|
725
897
|
block: AssembledBlockType<T>;
|
|
@@ -728,7 +900,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
728
900
|
shouldOverrideBuilder?: boolean;
|
|
729
901
|
}> {
|
|
730
902
|
const state = await this.regen.getBlockSlotState(
|
|
731
|
-
|
|
903
|
+
parentBlock,
|
|
732
904
|
slot,
|
|
733
905
|
{dontTransferCache: true},
|
|
734
906
|
RegenCaller.produceBlock
|
|
@@ -745,7 +917,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
745
917
|
graffiti,
|
|
746
918
|
slot,
|
|
747
919
|
feeRecipient,
|
|
748
|
-
|
|
920
|
+
parentBlock,
|
|
749
921
|
proposerIndex,
|
|
750
922
|
proposerPubKey,
|
|
751
923
|
commonBlockBodyPromise,
|
|
@@ -768,7 +940,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
768
940
|
const block = {
|
|
769
941
|
slot,
|
|
770
942
|
proposerIndex,
|
|
771
|
-
parentRoot:
|
|
943
|
+
parentRoot: fromHex(parentBlock.blockRoot),
|
|
772
944
|
stateRoot: ZERO_HASH,
|
|
773
945
|
body,
|
|
774
946
|
} as AssembledBlockType<T>;
|
|
@@ -964,12 +1136,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
964
1136
|
// thanks to one epoch look ahead, we don't need to dial up to attEpoch
|
|
965
1137
|
const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
|
|
966
1138
|
this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
|
|
967
|
-
state = await this.regen.getBlockSlotState(
|
|
968
|
-
attHeadBlock.blockRoot,
|
|
969
|
-
targetSlot,
|
|
970
|
-
{dontTransferCache: true},
|
|
971
|
-
regenCaller
|
|
972
|
-
);
|
|
1139
|
+
state = await this.regen.getBlockSlotState(attHeadBlock, targetSlot, {dontTransferCache: true}, regenCaller);
|
|
973
1140
|
} else if (blockEpoch > attEpoch) {
|
|
974
1141
|
// should not happen, handled inside attestation verification code
|
|
975
1142
|
throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
|
|
@@ -980,8 +1147,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
980
1147
|
this.metrics?.gossipAttestation.useHeadBlockState.inc({caller: regenCaller});
|
|
981
1148
|
state = await this.regen.getState(attHeadBlock.stateRoot, regenCaller);
|
|
982
1149
|
}
|
|
983
|
-
|
|
984
|
-
|
|
1150
|
+
// resolve the promise to unblock other calls of the same epoch and dependent root
|
|
1151
|
+
this.shufflingCache.processState(state);
|
|
985
1152
|
return state.epochCtx.getShufflingAtEpoch(attEpoch);
|
|
986
1153
|
}
|
|
987
1154
|
|
|
@@ -1098,6 +1265,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1098
1265
|
metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
|
|
1099
1266
|
metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
|
|
1100
1267
|
metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
|
|
1268
|
+
metrics.opPool.payloadAttestationPool.size.set(this.payloadAttestationPool.size);
|
|
1269
|
+
metrics.opPool.executionPayloadBidPool.size.set(this.executionPayloadBidPool.size);
|
|
1101
1270
|
// syncContributionAndProofPool tracks metrics on its own
|
|
1102
1271
|
metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
|
|
1103
1272
|
metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
|
|
@@ -1128,6 +1297,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1128
1297
|
this.aggregatedAttestationPool.prune(slot);
|
|
1129
1298
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1130
1299
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1300
|
+
this.payloadAttestationPool.prune(slot);
|
|
1301
|
+
this.executionPayloadBidPool.prune(slot);
|
|
1302
|
+
this.seenExecutionPayloadBids.prune(slot);
|
|
1131
1303
|
this.seenAttestationDatas.onSlot(slot);
|
|
1132
1304
|
this.reprocessController.onSlot(slot);
|
|
1133
1305
|
|
|
@@ -1151,6 +1323,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1151
1323
|
|
|
1152
1324
|
this.seenAttesters.prune(epoch);
|
|
1153
1325
|
this.seenAggregators.prune(epoch);
|
|
1326
|
+
this.seenPayloadAttesters.prune(epoch);
|
|
1154
1327
|
this.seenAggregatedAttestations.prune(epoch);
|
|
1155
1328
|
this.seenBlockAttesters.prune(epoch);
|
|
1156
1329
|
this.beaconProposerCache.prune(epoch);
|
|
@@ -1165,9 +1338,18 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1165
1338
|
this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
|
|
1166
1339
|
}
|
|
1167
1340
|
|
|
1341
|
+
private onCheckpoint(this: BeaconChain, _checkpoint: phase0.Checkpoint, state: CachedBeaconStateAllForks): void {
|
|
1342
|
+
// Defer to not block other checkpoint event handlers, which can cause lightclient update delays
|
|
1343
|
+
callInNextEventLoop(() => {
|
|
1344
|
+
this.shufflingCache.processState(state);
|
|
1345
|
+
});
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1168
1348
|
private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
|
|
1169
1349
|
this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
|
|
1170
|
-
|
|
1350
|
+
const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
|
|
1351
|
+
this.seenBlockProposers.prune(finalizedSlot);
|
|
1352
|
+
this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
|
|
1171
1353
|
|
|
1172
1354
|
// Update validator custody to account for effective balance changes
|
|
1173
1355
|
await this.updateValidatorsCustodyRequirement(cp);
|
|
@@ -1175,13 +1357,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1175
1357
|
// TODO: Improve using regen here
|
|
1176
1358
|
const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
|
|
1177
1359
|
const headState = this.regen.getStateSync(stateRoot);
|
|
1178
|
-
const
|
|
1179
|
-
if (
|
|
1180
|
-
throw Error(`Head block ${slot}
|
|
1360
|
+
const blockResult = await this.getBlockByRoot(blockRoot);
|
|
1361
|
+
if (blockResult == null) {
|
|
1362
|
+
throw Error(`Head block for ${slot} is not available in cache or database`);
|
|
1181
1363
|
}
|
|
1182
1364
|
|
|
1183
1365
|
if (headState) {
|
|
1184
|
-
this.opPool.pruneAll(
|
|
1366
|
+
this.opPool.pruneAll(blockResult.block, headState);
|
|
1185
1367
|
}
|
|
1186
1368
|
|
|
1187
1369
|
if (headState === null) {
|
|
@@ -1295,9 +1477,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1295
1477
|
|
|
1296
1478
|
preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
|
|
1297
1479
|
|
|
1298
|
-
const
|
|
1480
|
+
const proposerRewards = this.regen.getStateSync(toRootHex(block.stateRoot))?.proposerRewards ?? undefined;
|
|
1299
1481
|
|
|
1300
|
-
return computeBlockRewards(this.config, block, preState
|
|
1482
|
+
return computeBlockRewards(this.config, block, preState, proposerRewards);
|
|
1301
1483
|
}
|
|
1302
1484
|
|
|
1303
1485
|
async getAttestationsRewards(
|
|
@@ -1338,6 +1520,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1338
1520
|
|
|
1339
1521
|
preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
|
|
1340
1522
|
|
|
1341
|
-
return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState
|
|
1523
|
+
return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState, validatorIds);
|
|
1342
1524
|
}
|
|
1343
1525
|
}
|
|
@@ -139,6 +139,14 @@ export enum AttestationErrorCode {
|
|
|
139
139
|
* Electra: Attester not in committee
|
|
140
140
|
*/
|
|
141
141
|
ATTESTER_NOT_IN_COMMITTEE = "ATTESTATION_ERROR_ATTESTER_NOT_IN_COMMITTEE",
|
|
142
|
+
/**
|
|
143
|
+
* Gloas: Invalid attestationData index: is non-zero and non-one
|
|
144
|
+
*/
|
|
145
|
+
INVALID_PAYLOAD_STATUS_VALUE = "ATTESTATION_ERROR_INVALID_PAYLOAD_STATUS_VALUE",
|
|
146
|
+
/**
|
|
147
|
+
* Gloas: Current slot attestation is marking payload as present
|
|
148
|
+
*/
|
|
149
|
+
PREMATURELY_INDICATED_PAYLOAD_PRESENT = "ATTESTATION_ERROR_PREMATURELY_INDICATED_PAYLOAD_PRESENT",
|
|
142
150
|
}
|
|
143
151
|
|
|
144
152
|
export type AttestationErrorType =
|
|
@@ -175,7 +183,9 @@ export type AttestationErrorType =
|
|
|
175
183
|
| {code: AttestationErrorCode.TOO_MANY_SKIPPED_SLOTS; headBlockSlot: Slot; attestationSlot: Slot}
|
|
176
184
|
| {code: AttestationErrorCode.NOT_EXACTLY_ONE_COMMITTEE_BIT_SET}
|
|
177
185
|
| {code: AttestationErrorCode.NON_ZERO_ATTESTATION_DATA_INDEX}
|
|
178
|
-
| {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE}
|
|
186
|
+
| {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE}
|
|
187
|
+
| {code: AttestationErrorCode.INVALID_PAYLOAD_STATUS_VALUE; attDataIndex: number}
|
|
188
|
+
| {code: AttestationErrorCode.PREMATURELY_INDICATED_PAYLOAD_PRESENT};
|
|
179
189
|
|
|
180
190
|
export class AttestationError extends GossipActionError<AttestationErrorType> {
|
|
181
191
|
getMetadata(): Record<string, string | number | null> {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {BuilderIndex, RootHex, Slot} from "@lodestar/types";
|
|
2
|
+
import {GossipActionError} from "./gossipValidation.ts";
|
|
3
|
+
|
|
4
|
+
export enum ExecutionPayloadBidErrorCode {
|
|
5
|
+
BUILDER_NOT_ELIGIBLE = "EXECUTION_PAYLOAD_BID_ERROR_BUILDER_NOT_ELIGIBLE",
|
|
6
|
+
NON_ZERO_EXECUTION_PAYMENT = "EXECUTION_PAYLOAD_BID_ERROR_NON_ZERO_EXECUTION_PAYMENT",
|
|
7
|
+
BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
|
|
8
|
+
BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
|
|
9
|
+
BID_TOO_HIGH = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_HIGH",
|
|
10
|
+
UNKNOWN_BLOCK_ROOT = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_BLOCK_ROOT",
|
|
11
|
+
INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
|
|
12
|
+
INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type ExecutionPayloadBidErrorType =
|
|
16
|
+
| {code: ExecutionPayloadBidErrorCode.BUILDER_NOT_ELIGIBLE; builderIndex: BuilderIndex}
|
|
17
|
+
| {
|
|
18
|
+
code: ExecutionPayloadBidErrorCode.NON_ZERO_EXECUTION_PAYMENT;
|
|
19
|
+
builderIndex: BuilderIndex;
|
|
20
|
+
executionPayment: number;
|
|
21
|
+
}
|
|
22
|
+
| {
|
|
23
|
+
code: ExecutionPayloadBidErrorCode.BID_ALREADY_KNOWN;
|
|
24
|
+
builderIndex: BuilderIndex;
|
|
25
|
+
slot: Slot;
|
|
26
|
+
parentBlockRoot: RootHex;
|
|
27
|
+
parentBlockHash: RootHex;
|
|
28
|
+
}
|
|
29
|
+
| {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
|
|
30
|
+
| {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
|
|
31
|
+
| {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
|
|
32
|
+
| {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
|
|
33
|
+
| {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
|
|
34
|
+
|
|
35
|
+
export class ExecutionPayloadBidError extends GossipActionError<ExecutionPayloadBidErrorType> {}
|