@lodestar/beacon-node 1.39.1 → 1.40.0-dev.1020f27ca9
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 +15 -25
- 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 +16 -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/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 +5 -3
- 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 +2 -0
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +6 -0
- 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 +14 -9
- 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 +1 -0
- 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 +20 -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 +24 -6
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +201 -25
- 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 +5 -3
- 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/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/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 +4 -13
- 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 +5 -9
- 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.js +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/blockStateCacheImpl.d.ts +1 -2
- package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -1
- package/lib/chain/stateCache/blockStateCacheImpl.js +2 -2
- package/lib/chain/stateCache/blockStateCacheImpl.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/inMemoryCheckpointsCache.d.ts +4 -5
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js +9 -10
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +5 -6
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +17 -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 +3 -3
- 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 +7 -4
- 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 +3 -3
- 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/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/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +34 -3
- 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.js +2 -2
- 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/util/sszBytes.js +1 -1
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +15 -15
- package/src/api/impl/beacon/blocks/index.ts +17 -25
- 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 +19 -4
- package/src/api/impl/proof/index.ts +1 -2
- package/src/api/impl/validator/index.ts +13 -14
- package/src/chain/ColumnReconstructionTracker.ts +8 -4
- package/src/chain/archiveStore/historicalState/getHistoricalState.ts +5 -3
- package/src/chain/archiveStore/utils/archiveBlocks.ts +25 -14
- package/src/chain/blocks/blockInput/blockInput.ts +8 -0
- package/src/chain/blocks/importBlock.ts +15 -9
- 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 +1 -0
- package/src/chain/blocks/writeBlockInputToDb.ts +24 -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 +230 -36
- 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 +5 -3
- package/src/chain/interface.ts +34 -3
- 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/prepareNextSlot.ts +8 -12
- package/src/chain/produceBlock/produceBlockBody.ts +13 -6
- package/src/chain/regen/interface.ts +3 -17
- package/src/chain/regen/queued.ts +17 -56
- 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 +1 -1
- package/src/chain/shufflingCache.ts +67 -50
- package/src/chain/stateCache/blockStateCacheImpl.ts +2 -3
- package/src/chain/stateCache/fifoBlockStateCache.ts +4 -5
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +9 -15
- package/src/chain/stateCache/persistentCheckpointsCache.ts +17 -25
- 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 +2 -7
- package/src/chain/validation/block.ts +8 -4
- package/src/chain/validation/blsToExecutionChange.ts +9 -7
- package/src/chain/validation/dataColumnSidecar.ts +2 -7
- 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/gossip/interface.ts +17 -0
- package/src/network/gossip/scoringParameters.ts +44 -2
- package/src/network/gossip/topic.ts +21 -0
- package/src/network/processor/gossipHandlers.ts +48 -3
- 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 +2 -2
- 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/util/sszBytes.ts +1 -1
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";
|
|
@@ -112,6 +126,11 @@ import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
|
112
126
|
*/
|
|
113
127
|
const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
|
|
114
128
|
|
|
129
|
+
/**
|
|
130
|
+
* The maximum number of pending unfinalized block writes to the database before backpressure is applied.
|
|
131
|
+
*/
|
|
132
|
+
const DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES = 32;
|
|
133
|
+
|
|
115
134
|
export class BeaconChain implements IBeaconChain {
|
|
116
135
|
readonly genesisTime: UintNum64;
|
|
117
136
|
readonly genesisValidatorsRoot: Root;
|
|
@@ -135,18 +154,24 @@ export class BeaconChain implements IBeaconChain {
|
|
|
135
154
|
readonly lightClientServer?: LightClientServer;
|
|
136
155
|
readonly reprocessController: ReprocessController;
|
|
137
156
|
readonly archiveStore: ArchiveStore;
|
|
157
|
+
readonly unfinalizedBlockWrites: JobItemQueue<[IBlockInput[]], void>;
|
|
138
158
|
|
|
139
159
|
// Ops pool
|
|
140
160
|
readonly attestationPool: AttestationPool;
|
|
141
161
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
142
162
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
143
163
|
readonly syncContributionAndProofPool;
|
|
164
|
+
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
165
|
+
readonly payloadAttestationPool: PayloadAttestationPool;
|
|
144
166
|
readonly opPool: OpPool;
|
|
145
167
|
|
|
146
168
|
// Gossip seen cache
|
|
147
169
|
readonly seenAttesters = new SeenAttesters();
|
|
148
170
|
readonly seenAggregators = new SeenAggregators();
|
|
171
|
+
readonly seenPayloadAttesters = new SeenPayloadAttesters();
|
|
149
172
|
readonly seenAggregatedAttestations: SeenAggregatedAttestations;
|
|
173
|
+
readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
|
|
174
|
+
readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
|
|
150
175
|
readonly seenBlockProposers = new SeenBlockProposers();
|
|
151
176
|
readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
|
|
152
177
|
readonly seenContributionAndProof: SeenContributionAndProof;
|
|
@@ -253,8 +278,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
253
278
|
const emitter = new ChainEventEmitter();
|
|
254
279
|
// by default, verify signatures on both main threads and worker threads
|
|
255
280
|
const bls = opts.blsVerifyAllMainThread
|
|
256
|
-
? new BlsSingleThreadVerifier({metrics})
|
|
257
|
-
: new BlsMultiThreadWorkerPool(opts, {logger, metrics});
|
|
281
|
+
? new BlsSingleThreadVerifier({metrics, index2pubkey})
|
|
282
|
+
: new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
|
|
258
283
|
|
|
259
284
|
if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
|
|
260
285
|
|
|
@@ -263,6 +288,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
263
288
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
|
|
264
289
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
265
290
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
291
|
+
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
292
|
+
this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
|
|
266
293
|
this.opPool = new OpPool(config);
|
|
267
294
|
|
|
268
295
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
@@ -291,7 +318,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
291
318
|
});
|
|
292
319
|
|
|
293
320
|
this._earliestAvailableSlot = anchorState.slot;
|
|
294
|
-
|
|
321
|
+
|
|
322
|
+
this.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
|
|
295
323
|
{
|
|
296
324
|
shuffling: anchorState.epochCtx.previousShuffling,
|
|
297
325
|
decisionRoot: anchorState.epochCtx.previousDecisionRoot,
|
|
@@ -359,6 +387,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
359
387
|
forkChoice,
|
|
360
388
|
blockStateCache,
|
|
361
389
|
checkpointStateCache,
|
|
390
|
+
seenBlockInputCache: this.seenBlockInputCache,
|
|
362
391
|
db,
|
|
363
392
|
metrics,
|
|
364
393
|
validatorMonitor,
|
|
@@ -403,6 +432,15 @@ export class BeaconChain implements IBeaconChain {
|
|
|
403
432
|
signal
|
|
404
433
|
);
|
|
405
434
|
|
|
435
|
+
this.unfinalizedBlockWrites = new JobItemQueue(
|
|
436
|
+
persistBlockInputs.bind(this),
|
|
437
|
+
{
|
|
438
|
+
maxLength: DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES,
|
|
439
|
+
signal,
|
|
440
|
+
},
|
|
441
|
+
metrics?.unfinalizedBlockWritesQueue
|
|
442
|
+
);
|
|
443
|
+
|
|
406
444
|
// always run PrepareNextSlotScheduler except for fork_choice spec tests
|
|
407
445
|
if (!opts?.disablePrepareNextSlot) {
|
|
408
446
|
new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
|
|
@@ -417,6 +455,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
417
455
|
clock.addListener(ClockEvent.epoch, this.onClockEpoch.bind(this));
|
|
418
456
|
emitter.addListener(ChainEvent.forkChoiceFinalized, this.onForkChoiceFinalized.bind(this));
|
|
419
457
|
emitter.addListener(ChainEvent.forkChoiceJustified, this.onForkChoiceJustified.bind(this));
|
|
458
|
+
emitter.addListener(ChainEvent.checkpoint, this.onCheckpoint.bind(this));
|
|
420
459
|
}
|
|
421
460
|
|
|
422
461
|
async init(): Promise<void> {
|
|
@@ -427,6 +466,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
427
466
|
async close(): Promise<void> {
|
|
428
467
|
await this.archiveStore.close();
|
|
429
468
|
await this.bls.close();
|
|
469
|
+
|
|
470
|
+
// Since we don't persist unfinalized fork-choice,
|
|
471
|
+
// we can abort any ongoing unfinalized block writes.
|
|
472
|
+
// TODO: persist fork choice to disk and allow unfinalized block writes to complete.
|
|
473
|
+
this.unfinalizedBlockWrites.dropAllJobs();
|
|
474
|
+
|
|
430
475
|
this.abortController.abort();
|
|
431
476
|
}
|
|
432
477
|
|
|
@@ -456,6 +501,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
456
501
|
this.seenAttesters.isKnown(epoch, index) ||
|
|
457
502
|
// seenAggregators = single aggregator index, not participants of the aggregate
|
|
458
503
|
this.seenAggregators.isKnown(epoch, index) ||
|
|
504
|
+
// seenPayloadAttesters = single signer of payload attestation message
|
|
505
|
+
this.seenPayloadAttesters.isKnown(epoch, index) ||
|
|
459
506
|
// seenBlockProposers = single block proposer
|
|
460
507
|
this.seenBlockProposers.seenAtEpoch(epoch, index)
|
|
461
508
|
);
|
|
@@ -498,13 +545,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
498
545
|
// only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
|
|
499
546
|
const head = this.forkChoice.getHead();
|
|
500
547
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
501
|
-
return this.regen.getBlockSlotState(head
|
|
548
|
+
return this.regen.getBlockSlotState(head, startSlot, {dontTransferCache: true}, regenCaller);
|
|
502
549
|
}
|
|
503
550
|
|
|
504
551
|
async getStateBySlot(
|
|
505
552
|
slot: Slot,
|
|
506
553
|
opts?: StateGetOpts
|
|
507
|
-
): Promise<{state:
|
|
554
|
+
): Promise<{state: CachedBeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
508
555
|
const finalizedBlock = this.forkChoice.getFinalizedBlock();
|
|
509
556
|
|
|
510
557
|
if (slot < finalizedBlock.slot) {
|
|
@@ -516,12 +563,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
516
563
|
if (opts?.allowRegen) {
|
|
517
564
|
// Find closest canonical block to slot, then trigger regen
|
|
518
565
|
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
|
-
);
|
|
566
|
+
const state = await this.regen.getBlockSlotState(block, slot, {dontTransferCache: true}, RegenCaller.restApi);
|
|
525
567
|
return {
|
|
526
568
|
state,
|
|
527
569
|
executionOptimistic: isOptimisticBlock(block),
|
|
@@ -559,7 +601,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
559
601
|
async getStateByStateRoot(
|
|
560
602
|
stateRoot: RootHex,
|
|
561
603
|
opts?: StateGetOpts
|
|
562
|
-
): Promise<{state:
|
|
604
|
+
): Promise<{state: CachedBeaconStateAllForks | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
563
605
|
if (opts?.allowRegen) {
|
|
564
606
|
const state = await this.regen.getState(stateRoot, RegenCaller.restApi);
|
|
565
607
|
const block = this.forkChoice.getBlock(state.latestBlockHeader.hashTreeRoot());
|
|
@@ -587,7 +629,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
587
629
|
};
|
|
588
630
|
}
|
|
589
631
|
|
|
590
|
-
|
|
632
|
+
// this is mostly useful for a node with `--chain.archiveStateEpochFrequency 1`
|
|
633
|
+
const data = await this.db.stateArchive.getBinaryByRoot(fromHex(stateRoot));
|
|
591
634
|
return data && {state: data, executionOptimistic: false, finalized: true};
|
|
592
635
|
}
|
|
593
636
|
|
|
@@ -648,6 +691,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
648
691
|
// Unfinalized slot, attempt to find in fork-choice
|
|
649
692
|
const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
|
|
650
693
|
if (block) {
|
|
694
|
+
// Block found in fork-choice.
|
|
695
|
+
// It may be in the block input cache, awaiting full DA reconstruction, check there first
|
|
696
|
+
// Otherwise (most likely), check the hot db
|
|
697
|
+
const blockInput = this.seenBlockInputCache.get(block.blockRoot);
|
|
698
|
+
if (blockInput?.hasBlock()) {
|
|
699
|
+
return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
700
|
+
}
|
|
651
701
|
const data = await this.db.block.get(fromHex(block.blockRoot));
|
|
652
702
|
if (data) {
|
|
653
703
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -667,6 +717,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
667
717
|
): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
668
718
|
const block = this.forkChoice.getBlockHex(root);
|
|
669
719
|
if (block) {
|
|
720
|
+
// Block found in fork-choice.
|
|
721
|
+
// It may be in the block input cache, awaiting full DA reconstruction, check there first
|
|
722
|
+
// Otherwise (most likely), check the hot db
|
|
723
|
+
const blockInput = this.seenBlockInputCache.get(block.blockRoot);
|
|
724
|
+
if (blockInput?.hasBlock()) {
|
|
725
|
+
return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
726
|
+
}
|
|
670
727
|
const data = await this.db.block.get(fromHex(root));
|
|
671
728
|
if (data) {
|
|
672
729
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -679,10 +736,137 @@ export class BeaconChain implements IBeaconChain {
|
|
|
679
736
|
return data && {block: data, executionOptimistic: false, finalized: true};
|
|
680
737
|
}
|
|
681
738
|
|
|
739
|
+
async getSerializedBlockByRoot(
|
|
740
|
+
root: string
|
|
741
|
+
): Promise<{block: Uint8Array; executionOptimistic: boolean; finalized: boolean; slot: Slot} | null> {
|
|
742
|
+
const block = this.forkChoice.getBlockHex(root);
|
|
743
|
+
if (block) {
|
|
744
|
+
// Block found in fork-choice.
|
|
745
|
+
// It may be in the block input cache, awaiting full DA reconstruction, check there first
|
|
746
|
+
// Otherwise (most likely), check the hot db
|
|
747
|
+
const blockInput = this.seenBlockInputCache.get(block.blockRoot);
|
|
748
|
+
if (blockInput?.hasBlock()) {
|
|
749
|
+
const signedBlock = blockInput.getBlock();
|
|
750
|
+
const serialized = this.serializedCache.get(signedBlock);
|
|
751
|
+
if (serialized) {
|
|
752
|
+
return {
|
|
753
|
+
block: serialized,
|
|
754
|
+
executionOptimistic: isOptimisticBlock(block),
|
|
755
|
+
finalized: false,
|
|
756
|
+
slot: blockInput.slot,
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
return {
|
|
760
|
+
block: sszTypesFor(blockInput.forkName).SignedBeaconBlock.serialize(signedBlock),
|
|
761
|
+
executionOptimistic: isOptimisticBlock(block),
|
|
762
|
+
finalized: false,
|
|
763
|
+
slot: blockInput.slot,
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
const data = await this.db.block.getBinary(fromHex(root));
|
|
767
|
+
if (data) {
|
|
768
|
+
const slot = getSlotFromSignedBeaconBlockSerialized(data);
|
|
769
|
+
if (slot === null) throw new Error(`Invalid block data stored in DB for root: ${root}`);
|
|
770
|
+
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false, slot};
|
|
771
|
+
}
|
|
772
|
+
// If block is not found in hot db, try cold db since there could be an archive cycle happening
|
|
773
|
+
// TODO: Add a lock to the archiver to have deterministic behavior on where are blocks
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
const data = await this.db.blockArchive.getBinaryEntryByRoot(fromHex(root));
|
|
777
|
+
return data && {block: data.value, executionOptimistic: false, finalized: true, slot: data.key};
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
|
|
781
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
782
|
+
if (blockInput) {
|
|
783
|
+
if (!isBlockInputBlobs(blockInput)) {
|
|
784
|
+
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
785
|
+
}
|
|
786
|
+
if (!blockInput.hasAllData()) {
|
|
787
|
+
return null;
|
|
788
|
+
}
|
|
789
|
+
return blockInput.getBlobs();
|
|
790
|
+
}
|
|
791
|
+
const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
|
|
792
|
+
if (unfinalizedBlobSidecars) {
|
|
793
|
+
return unfinalizedBlobSidecars;
|
|
794
|
+
}
|
|
795
|
+
return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
|
|
799
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
800
|
+
if (blockInput) {
|
|
801
|
+
if (!isBlockInputBlobs(blockInput)) {
|
|
802
|
+
throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
|
|
803
|
+
}
|
|
804
|
+
if (!blockInput.hasAllData()) {
|
|
805
|
+
return null;
|
|
806
|
+
}
|
|
807
|
+
return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
|
|
808
|
+
}
|
|
809
|
+
const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
|
|
810
|
+
if (unfinalizedBlobSidecarsWrapper) {
|
|
811
|
+
return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
812
|
+
}
|
|
813
|
+
const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
|
|
814
|
+
if (finalizedBlobSidecarsWrapper) {
|
|
815
|
+
return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
|
|
816
|
+
}
|
|
817
|
+
return null;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<fulu.DataColumnSidecars> {
|
|
821
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
822
|
+
if (blockInput) {
|
|
823
|
+
if (!isBlockInputColumns(blockInput)) {
|
|
824
|
+
throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
|
|
825
|
+
}
|
|
826
|
+
return blockInput.getAllColumns();
|
|
827
|
+
}
|
|
828
|
+
const sidecarsUnfinalized = await this.db.dataColumnSidecar.values(fromHex(blockRootHex));
|
|
829
|
+
if (sidecarsUnfinalized.length > 0) {
|
|
830
|
+
return sidecarsUnfinalized;
|
|
831
|
+
}
|
|
832
|
+
const sidecarsFinalized = await this.db.dataColumnSidecarArchive.values(blockSlot);
|
|
833
|
+
return sidecarsFinalized;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
async getSerializedDataColumnSidecars(
|
|
837
|
+
blockSlot: Slot,
|
|
838
|
+
blockRootHex: string,
|
|
839
|
+
indices: number[]
|
|
840
|
+
): Promise<(Uint8Array | undefined)[]> {
|
|
841
|
+
const blockInput = this.seenBlockInputCache.get(blockRootHex);
|
|
842
|
+
if (blockInput) {
|
|
843
|
+
if (!isBlockInputColumns(blockInput)) {
|
|
844
|
+
throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
|
|
845
|
+
}
|
|
846
|
+
return indices.map((index) => {
|
|
847
|
+
const sidecar = blockInput.getColumn(index);
|
|
848
|
+
if (!sidecar) {
|
|
849
|
+
return undefined;
|
|
850
|
+
}
|
|
851
|
+
const serialized = this.serializedCache.get(sidecar);
|
|
852
|
+
if (serialized) {
|
|
853
|
+
return serialized;
|
|
854
|
+
}
|
|
855
|
+
return ssz.fulu.DataColumnSidecar.serialize(sidecar);
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
const sidecarsUnfinalized = await this.db.dataColumnSidecar.getManyBinary(fromHex(blockRootHex), indices);
|
|
859
|
+
if (sidecarsUnfinalized.some((sidecar) => sidecar != null)) {
|
|
860
|
+
return sidecarsUnfinalized;
|
|
861
|
+
}
|
|
862
|
+
const sidecarsFinalized = await this.db.dataColumnSidecarArchive.getManyBinary(blockSlot, indices);
|
|
863
|
+
return sidecarsFinalized;
|
|
864
|
+
}
|
|
865
|
+
|
|
682
866
|
async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
|
|
683
|
-
const {slot,
|
|
867
|
+
const {slot, parentBlock} = blockAttributes;
|
|
684
868
|
const state = await this.regen.getBlockSlotState(
|
|
685
|
-
|
|
869
|
+
parentBlock,
|
|
686
870
|
slot,
|
|
687
871
|
{dontTransferCache: true},
|
|
688
872
|
RegenCaller.produceBlock
|
|
@@ -719,7 +903,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
719
903
|
slot,
|
|
720
904
|
feeRecipient,
|
|
721
905
|
commonBlockBodyPromise,
|
|
722
|
-
|
|
906
|
+
parentBlock,
|
|
723
907
|
}: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
|
|
724
908
|
): Promise<{
|
|
725
909
|
block: AssembledBlockType<T>;
|
|
@@ -728,7 +912,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
728
912
|
shouldOverrideBuilder?: boolean;
|
|
729
913
|
}> {
|
|
730
914
|
const state = await this.regen.getBlockSlotState(
|
|
731
|
-
|
|
915
|
+
parentBlock,
|
|
732
916
|
slot,
|
|
733
917
|
{dontTransferCache: true},
|
|
734
918
|
RegenCaller.produceBlock
|
|
@@ -745,7 +929,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
745
929
|
graffiti,
|
|
746
930
|
slot,
|
|
747
931
|
feeRecipient,
|
|
748
|
-
|
|
932
|
+
parentBlock,
|
|
749
933
|
proposerIndex,
|
|
750
934
|
proposerPubKey,
|
|
751
935
|
commonBlockBodyPromise,
|
|
@@ -768,7 +952,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
768
952
|
const block = {
|
|
769
953
|
slot,
|
|
770
954
|
proposerIndex,
|
|
771
|
-
parentRoot:
|
|
955
|
+
parentRoot: fromHex(parentBlock.blockRoot),
|
|
772
956
|
stateRoot: ZERO_HASH,
|
|
773
957
|
body,
|
|
774
958
|
} as AssembledBlockType<T>;
|
|
@@ -964,12 +1148,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
964
1148
|
// thanks to one epoch look ahead, we don't need to dial up to attEpoch
|
|
965
1149
|
const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
|
|
966
1150
|
this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
|
|
967
|
-
state = await this.regen.getBlockSlotState(
|
|
968
|
-
attHeadBlock.blockRoot,
|
|
969
|
-
targetSlot,
|
|
970
|
-
{dontTransferCache: true},
|
|
971
|
-
regenCaller
|
|
972
|
-
);
|
|
1151
|
+
state = await this.regen.getBlockSlotState(attHeadBlock, targetSlot, {dontTransferCache: true}, regenCaller);
|
|
973
1152
|
} else if (blockEpoch > attEpoch) {
|
|
974
1153
|
// should not happen, handled inside attestation verification code
|
|
975
1154
|
throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
|
|
@@ -980,8 +1159,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
980
1159
|
this.metrics?.gossipAttestation.useHeadBlockState.inc({caller: regenCaller});
|
|
981
1160
|
state = await this.regen.getState(attHeadBlock.stateRoot, regenCaller);
|
|
982
1161
|
}
|
|
983
|
-
|
|
984
|
-
|
|
1162
|
+
// resolve the promise to unblock other calls of the same epoch and dependent root
|
|
1163
|
+
this.shufflingCache.processState(state);
|
|
985
1164
|
return state.epochCtx.getShufflingAtEpoch(attEpoch);
|
|
986
1165
|
}
|
|
987
1166
|
|
|
@@ -1098,6 +1277,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1098
1277
|
metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
|
|
1099
1278
|
metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
|
|
1100
1279
|
metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
|
|
1280
|
+
metrics.opPool.payloadAttestationPool.size.set(this.payloadAttestationPool.size);
|
|
1281
|
+
metrics.opPool.executionPayloadBidPool.size.set(this.executionPayloadBidPool.size);
|
|
1101
1282
|
// syncContributionAndProofPool tracks metrics on its own
|
|
1102
1283
|
metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
|
|
1103
1284
|
metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
|
|
@@ -1128,6 +1309,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1128
1309
|
this.aggregatedAttestationPool.prune(slot);
|
|
1129
1310
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1130
1311
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1312
|
+
this.payloadAttestationPool.prune(slot);
|
|
1313
|
+
this.executionPayloadBidPool.prune(slot);
|
|
1314
|
+
this.seenExecutionPayloadBids.prune(slot);
|
|
1131
1315
|
this.seenAttestationDatas.onSlot(slot);
|
|
1132
1316
|
this.reprocessController.onSlot(slot);
|
|
1133
1317
|
|
|
@@ -1151,6 +1335,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1151
1335
|
|
|
1152
1336
|
this.seenAttesters.prune(epoch);
|
|
1153
1337
|
this.seenAggregators.prune(epoch);
|
|
1338
|
+
this.seenPayloadAttesters.prune(epoch);
|
|
1154
1339
|
this.seenAggregatedAttestations.prune(epoch);
|
|
1155
1340
|
this.seenBlockAttesters.prune(epoch);
|
|
1156
1341
|
this.beaconProposerCache.prune(epoch);
|
|
@@ -1165,9 +1350,18 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1165
1350
|
this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
|
|
1166
1351
|
}
|
|
1167
1352
|
|
|
1353
|
+
private onCheckpoint(this: BeaconChain, _checkpoint: phase0.Checkpoint, state: CachedBeaconStateAllForks): void {
|
|
1354
|
+
// Defer to not block other checkpoint event handlers, which can cause lightclient update delays
|
|
1355
|
+
callInNextEventLoop(() => {
|
|
1356
|
+
this.shufflingCache.processState(state);
|
|
1357
|
+
});
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1168
1360
|
private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
|
|
1169
1361
|
this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
|
|
1170
|
-
|
|
1362
|
+
const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
|
|
1363
|
+
this.seenBlockProposers.prune(finalizedSlot);
|
|
1364
|
+
this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
|
|
1171
1365
|
|
|
1172
1366
|
// Update validator custody to account for effective balance changes
|
|
1173
1367
|
await this.updateValidatorsCustodyRequirement(cp);
|
|
@@ -1175,13 +1369,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1175
1369
|
// TODO: Improve using regen here
|
|
1176
1370
|
const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
|
|
1177
1371
|
const headState = this.regen.getStateSync(stateRoot);
|
|
1178
|
-
const
|
|
1179
|
-
if (
|
|
1180
|
-
throw Error(`Head block ${slot}
|
|
1372
|
+
const blockResult = await this.getBlockByRoot(blockRoot);
|
|
1373
|
+
if (blockResult == null) {
|
|
1374
|
+
throw Error(`Head block for ${slot} is not available in cache or database`);
|
|
1181
1375
|
}
|
|
1182
1376
|
|
|
1183
1377
|
if (headState) {
|
|
1184
|
-
this.opPool.pruneAll(
|
|
1378
|
+
this.opPool.pruneAll(blockResult.block, headState);
|
|
1185
1379
|
}
|
|
1186
1380
|
|
|
1187
1381
|
if (headState === null) {
|
|
@@ -1295,9 +1489,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1295
1489
|
|
|
1296
1490
|
preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
|
|
1297
1491
|
|
|
1298
|
-
const
|
|
1492
|
+
const proposerRewards = this.regen.getStateSync(toRootHex(block.stateRoot))?.proposerRewards ?? undefined;
|
|
1299
1493
|
|
|
1300
|
-
return computeBlockRewards(this.config, block, preState
|
|
1494
|
+
return computeBlockRewards(this.config, block, preState, proposerRewards);
|
|
1301
1495
|
}
|
|
1302
1496
|
|
|
1303
1497
|
async getAttestationsRewards(
|
|
@@ -1338,6 +1532,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1338
1532
|
|
|
1339
1533
|
preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
|
|
1340
1534
|
|
|
1341
|
-
return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState
|
|
1535
|
+
return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState, validatorIds);
|
|
1342
1536
|
}
|
|
1343
1537
|
}
|
|
@@ -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> {}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {BuilderIndex, RootHex, Slot} from "@lodestar/types";
|
|
2
|
+
import {GossipActionError} from "./gossipValidation.js";
|
|
3
|
+
|
|
4
|
+
export enum ExecutionPayloadEnvelopeErrorCode {
|
|
5
|
+
BELONG_TO_FINALIZED_BLOCK = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BELONG_TO_FINALIZED_BLOCK",
|
|
6
|
+
BLOCK_ROOT_UNKNOWN = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_ROOT_UNKNOWN",
|
|
7
|
+
ENVELOPE_ALREADY_KNOWN = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_ALREADY_KNOWN",
|
|
8
|
+
INVALID_BLOCK = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_BLOCK",
|
|
9
|
+
SLOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_SLOT_MISMATCH",
|
|
10
|
+
BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
|
|
11
|
+
BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
|
|
12
|
+
INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
|
|
13
|
+
CACHE_FAIL = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_CACHE_FAIL",
|
|
14
|
+
}
|
|
15
|
+
export type ExecutionPayloadEnvelopeErrorType =
|
|
16
|
+
| {code: ExecutionPayloadEnvelopeErrorCode.BELONG_TO_FINALIZED_BLOCK; envelopeSlot: Slot; finalizedSlot: Slot}
|
|
17
|
+
| {code: ExecutionPayloadEnvelopeErrorCode.BLOCK_ROOT_UNKNOWN; blockRoot: RootHex}
|
|
18
|
+
| {
|
|
19
|
+
code: ExecutionPayloadEnvelopeErrorCode.ENVELOPE_ALREADY_KNOWN;
|
|
20
|
+
blockRoot: RootHex;
|
|
21
|
+
slot: Slot;
|
|
22
|
+
}
|
|
23
|
+
| {code: ExecutionPayloadEnvelopeErrorCode.INVALID_BLOCK; blockRoot: RootHex}
|
|
24
|
+
| {code: ExecutionPayloadEnvelopeErrorCode.SLOT_MISMATCH; envelopeSlot: Slot; blockSlot: Slot}
|
|
25
|
+
| {
|
|
26
|
+
code: ExecutionPayloadEnvelopeErrorCode.BUILDER_INDEX_MISMATCH;
|
|
27
|
+
envelopeBuilderIndex: BuilderIndex;
|
|
28
|
+
bidBuilderIndex: BuilderIndex;
|
|
29
|
+
}
|
|
30
|
+
| {code: ExecutionPayloadEnvelopeErrorCode.BLOCK_HASH_MISMATCH; envelopeBlockHash: RootHex; bidBlockHash: RootHex}
|
|
31
|
+
| {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE}
|
|
32
|
+
| {code: ExecutionPayloadEnvelopeErrorCode.CACHE_FAIL; blockRoot: RootHex};
|
|
33
|
+
|
|
34
|
+
export class ExecutionPayloadEnvelopeError extends GossipActionError<ExecutionPayloadEnvelopeErrorType> {}
|
|
@@ -4,7 +4,10 @@ export * from "./blobSidecarError.js";
|
|
|
4
4
|
export * from "./blockError.js";
|
|
5
5
|
export * from "./blsToExecutionChangeError.js";
|
|
6
6
|
export * from "./dataColumnSidecarError.js";
|
|
7
|
+
export * from "./executionPayloadBid.js";
|
|
8
|
+
export * from "./executionPayloadEnvelope.js";
|
|
7
9
|
export * from "./gossipValidation.js";
|
|
10
|
+
export * from "./payloadAttestation.js";
|
|
8
11
|
export * from "./proposerSlashingError.js";
|
|
9
12
|
export * from "./syncCommitteeError.js";
|
|
10
13
|
export * from "./voluntaryExitError.js";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {RootHex, Slot, ValidatorIndex} from "@lodestar/types";
|
|
2
|
+
import {GossipActionError} from "./gossipValidation.ts";
|
|
3
|
+
|
|
4
|
+
export enum PayloadAttestationErrorCode {
|
|
5
|
+
NOT_CURRENT_SLOT = "PAYLOAD_ATTESTATION_ERROR_NOT_CURRENT_SLOT",
|
|
6
|
+
PAYLOAD_ATTESTATION_ALREADY_KNOWN = "PAYLOAD_ATTESTATION_ERROR_PAYLOAD_ATTESTATION_ALREADY_KNOWN",
|
|
7
|
+
UNKNOWN_BLOCK_ROOT = "PAYLOAD_ATTESTATION_ERROR_UNKNOWN_BLOCK_ROOT",
|
|
8
|
+
INVALID_BLOCK = "PAYLOAD_ATTESTATION_ERROR_INVALID_BLOCK",
|
|
9
|
+
INVALID_ATTESTER = "PAYLOAD_ATTESTATION_ERROR_INVALID_ATTESTER",
|
|
10
|
+
INVALID_SIGNATURE = "PAYLOAD_ATTESTATION_ERROR_INVALID_SIGNATURE",
|
|
11
|
+
}
|
|
12
|
+
export type PayloadAttestationErrorType =
|
|
13
|
+
| {code: PayloadAttestationErrorCode.NOT_CURRENT_SLOT; currentSlot: Slot; slot: Slot}
|
|
14
|
+
| {
|
|
15
|
+
code: PayloadAttestationErrorCode.PAYLOAD_ATTESTATION_ALREADY_KNOWN;
|
|
16
|
+
validatorIndex: ValidatorIndex;
|
|
17
|
+
slot: Slot;
|
|
18
|
+
blockRoot: RootHex;
|
|
19
|
+
}
|
|
20
|
+
| {code: PayloadAttestationErrorCode.UNKNOWN_BLOCK_ROOT; blockRoot: RootHex}
|
|
21
|
+
| {code: PayloadAttestationErrorCode.INVALID_BLOCK; blockRoot: RootHex}
|
|
22
|
+
| {code: PayloadAttestationErrorCode.INVALID_ATTESTER; attesterIndex: ValidatorIndex}
|
|
23
|
+
| {code: PayloadAttestationErrorCode.INVALID_SIGNATURE};
|
|
24
|
+
|
|
25
|
+
export class PayloadAttestationError extends GossipActionError<PayloadAttestationErrorType> {}
|