@lodestar/beacon-node 1.40.0-dev.c975f70481 → 1.40.0-dev.cd347a28d7
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/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 +15 -2
- package/lib/api/impl/lodestar/index.js.map +1 -1
- package/lib/api/impl/validator/index.d.ts.map +1 -1
- package/lib/api/impl/validator/index.js +9 -8
- 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/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +4 -0
- 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 +42 -1
- 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 +3 -7
- 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 +1 -8
- 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/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 +22 -5
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +197 -44
- 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/interface.d.ts +21 -3
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.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/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.js +6 -4
- 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 +5 -3
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +4 -9
- 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 +2 -3
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +2 -16
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +5 -7
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +7 -17
- 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/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 +2 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +3 -0
- package/lib/chain/stateCache/persistentCheckpointsCache.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 +27 -8
- 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 +1 -1
- 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 +6 -6
- package/lib/chain/validation/block.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 +1 -1
- 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.js +0 -1
- package/lib/db/repositories/checkpointState.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +27 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +64 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +19 -0
- package/lib/network/gossip/gossipsub.d.ts.map +1 -1
- package/lib/network/gossip/gossipsub.js +71 -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/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/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/package.json +15 -15
- package/src/api/impl/beacon/blocks/index.ts +17 -25
- package/src/api/impl/debug/index.ts +2 -6
- package/src/api/impl/lodestar/index.ts +18 -3
- package/src/api/impl/validator/index.ts +14 -12
- package/src/chain/ColumnReconstructionTracker.ts +8 -4
- package/src/chain/archiveStore/utils/archiveBlocks.ts +4 -0
- package/src/chain/blocks/blockInput/blockInput.ts +53 -2
- package/src/chain/blocks/importBlock.ts +3 -7
- package/src/chain/blocks/index.ts +0 -19
- package/src/chain/blocks/types.ts +0 -2
- package/src/chain/blocks/verifyBlock.ts +0 -9
- package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
- 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 +227 -56
- 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/interface.ts +32 -1
- package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
- package/src/chain/opPools/index.ts +2 -0
- package/src/chain/opPools/payloadAttestationPool.ts +157 -0
- package/src/chain/options.ts +0 -2
- package/src/chain/prepareNextSlot.ts +6 -6
- package/src/chain/produceBlock/produceBlockBody.ts +7 -5
- package/src/chain/regen/interface.ts +3 -13
- package/src/chain/regen/queued.ts +3 -24
- package/src/chain/regen/regen.ts +10 -25
- 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/stateCache/index.ts +0 -2
- package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
- package/src/chain/validation/aggregateAndProof.ts +36 -14
- package/src/chain/validation/attestation.ts +33 -16
- package/src/chain/validation/attesterSlashing.ts +1 -6
- package/src/chain/validation/blobSidecar.ts +2 -7
- package/src/chain/validation/block.ts +6 -6
- 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 +1 -6
- 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 +1 -1
- package/src/metrics/metrics/lodestar.ts +65 -0
- package/src/network/gossip/gossipsub.ts +86 -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/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/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/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -54
- 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 -60
- package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -156
- package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
- package/src/chain/stateCache/blockStateCacheImpl.ts +0 -149
- package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -192
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";
|
|
@@ -55,12 +60,15 @@ import {CustodyConfig, getValidatorsCustodyRequirement} from "../util/dataColumn
|
|
|
55
60
|
import {callInNextEventLoop} from "../util/eventLoop.js";
|
|
56
61
|
import {ensureDir, writeIfNotExist} from "../util/file.js";
|
|
57
62
|
import {isOptimisticBlock} from "../util/forkChoice.js";
|
|
63
|
+
import {JobItemQueue} from "../util/queue/itemQueue.ts";
|
|
58
64
|
import {SerializedCache} from "../util/serializedCache.js";
|
|
65
|
+
import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.ts";
|
|
59
66
|
import {ArchiveStore} from "./archiveStore/archiveStore.js";
|
|
60
67
|
import {CheckpointBalancesCache} from "./balancesCache.js";
|
|
61
68
|
import {BeaconProposerCache} from "./beaconProposerCache.js";
|
|
62
|
-
import {IBlockInput} from "./blocks/blockInput/index.js";
|
|
69
|
+
import {IBlockInput, isBlockInputBlobs, isBlockInputColumns} from "./blocks/blockInput/index.js";
|
|
63
70
|
import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
|
|
71
|
+
import {persistBlockInputs} from "./blocks/writeBlockInputToDb.ts";
|
|
64
72
|
import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
|
|
65
73
|
import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
|
|
66
74
|
import {ChainEvent, ChainEventEmitter} from "./emitter.js";
|
|
@@ -71,7 +79,9 @@ import {LightClientServer} from "./lightClient/index.js";
|
|
|
71
79
|
import {
|
|
72
80
|
AggregatedAttestationPool,
|
|
73
81
|
AttestationPool,
|
|
82
|
+
ExecutionPayloadBidPool,
|
|
74
83
|
OpPool,
|
|
84
|
+
PayloadAttestationPool,
|
|
75
85
|
SyncCommitteeMessagePool,
|
|
76
86
|
SyncContributionAndProofPool,
|
|
77
87
|
} from "./opPools/index.js";
|
|
@@ -87,6 +97,9 @@ import {
|
|
|
87
97
|
SeenAttesters,
|
|
88
98
|
SeenBlockProposers,
|
|
89
99
|
SeenContributionAndProof,
|
|
100
|
+
SeenExecutionPayloadBids,
|
|
101
|
+
SeenExecutionPayloadEnvelopes,
|
|
102
|
+
SeenPayloadAttesters,
|
|
90
103
|
SeenSyncCommitteeMessages,
|
|
91
104
|
} from "./seenCache/index.js";
|
|
92
105
|
import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
|
|
@@ -94,12 +107,10 @@ import {SeenAttestationDatas} from "./seenCache/seenAttestationData.js";
|
|
|
94
107
|
import {SeenBlockAttesters} from "./seenCache/seenBlockAttesters.js";
|
|
95
108
|
import {SeenBlockInput} from "./seenCache/seenGossipBlockInput.js";
|
|
96
109
|
import {ShufflingCache} from "./shufflingCache.js";
|
|
97
|
-
import {BlockStateCacheImpl} from "./stateCache/blockStateCacheImpl.js";
|
|
98
110
|
import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datastore/db.js";
|
|
99
111
|
import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
|
|
100
112
|
import {CPStateDatastore} from "./stateCache/datastore/types.js";
|
|
101
113
|
import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
|
|
102
|
-
import {InMemoryCheckpointStateCache} from "./stateCache/inMemoryCheckpointsCache.js";
|
|
103
114
|
import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
|
|
104
115
|
import {CheckpointStateCache} from "./stateCache/types.js";
|
|
105
116
|
import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
@@ -113,6 +124,11 @@ import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
|
113
124
|
*/
|
|
114
125
|
const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
|
|
115
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
|
+
|
|
116
132
|
export class BeaconChain implements IBeaconChain {
|
|
117
133
|
readonly genesisTime: UintNum64;
|
|
118
134
|
readonly genesisValidatorsRoot: Root;
|
|
@@ -124,7 +140,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
124
140
|
readonly logger: Logger;
|
|
125
141
|
readonly metrics: Metrics | null;
|
|
126
142
|
readonly validatorMonitor: ValidatorMonitor | null;
|
|
127
|
-
readonly bufferPool: BufferPool
|
|
143
|
+
readonly bufferPool: BufferPool;
|
|
128
144
|
|
|
129
145
|
readonly anchorStateLatestBlockSlot: Slot;
|
|
130
146
|
|
|
@@ -136,18 +152,24 @@ export class BeaconChain implements IBeaconChain {
|
|
|
136
152
|
readonly lightClientServer?: LightClientServer;
|
|
137
153
|
readonly reprocessController: ReprocessController;
|
|
138
154
|
readonly archiveStore: ArchiveStore;
|
|
155
|
+
readonly unfinalizedBlockWrites: JobItemQueue<[IBlockInput[]], void>;
|
|
139
156
|
|
|
140
157
|
// Ops pool
|
|
141
158
|
readonly attestationPool: AttestationPool;
|
|
142
159
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
143
160
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
144
161
|
readonly syncContributionAndProofPool;
|
|
162
|
+
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
163
|
+
readonly payloadAttestationPool: PayloadAttestationPool;
|
|
145
164
|
readonly opPool: OpPool;
|
|
146
165
|
|
|
147
166
|
// Gossip seen cache
|
|
148
167
|
readonly seenAttesters = new SeenAttesters();
|
|
149
168
|
readonly seenAggregators = new SeenAggregators();
|
|
169
|
+
readonly seenPayloadAttesters = new SeenPayloadAttesters();
|
|
150
170
|
readonly seenAggregatedAttestations: SeenAggregatedAttestations;
|
|
171
|
+
readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
|
|
172
|
+
readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
|
|
151
173
|
readonly seenBlockProposers = new SeenBlockProposers();
|
|
152
174
|
readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
|
|
153
175
|
readonly seenContributionAndProof: SeenContributionAndProof;
|
|
@@ -254,8 +276,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
254
276
|
const emitter = new ChainEventEmitter();
|
|
255
277
|
// by default, verify signatures on both main threads and worker threads
|
|
256
278
|
const bls = opts.blsVerifyAllMainThread
|
|
257
|
-
? new BlsSingleThreadVerifier({metrics})
|
|
258
|
-
: new BlsMultiThreadWorkerPool(opts, {logger, metrics});
|
|
279
|
+
? new BlsSingleThreadVerifier({metrics, index2pubkey})
|
|
280
|
+
: new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
|
|
259
281
|
|
|
260
282
|
if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
|
|
261
283
|
|
|
@@ -264,6 +286,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
264
286
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
|
|
265
287
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
266
288
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
289
|
+
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
290
|
+
this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
|
|
267
291
|
this.opPool = new OpPool(config);
|
|
268
292
|
|
|
269
293
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
@@ -313,32 +337,22 @@ export class BeaconChain implements IBeaconChain {
|
|
|
313
337
|
this.index2pubkey = index2pubkey;
|
|
314
338
|
|
|
315
339
|
const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
|
|
316
|
-
const blockStateCache = this.opts
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
this.
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
clock,
|
|
333
|
-
blockStateCache,
|
|
334
|
-
bufferPool: this.bufferPool,
|
|
335
|
-
datastore: this.cpStateDatastore,
|
|
336
|
-
},
|
|
337
|
-
this.opts
|
|
338
|
-
);
|
|
339
|
-
} else {
|
|
340
|
-
checkpointStateCache = new InMemoryCheckpointStateCache({metrics});
|
|
341
|
-
}
|
|
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
|
+
);
|
|
342
356
|
|
|
343
357
|
const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
|
|
344
358
|
blockStateCache.add(anchorState);
|
|
@@ -361,6 +375,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
361
375
|
forkChoice,
|
|
362
376
|
blockStateCache,
|
|
363
377
|
checkpointStateCache,
|
|
378
|
+
seenBlockInputCache: this.seenBlockInputCache,
|
|
364
379
|
db,
|
|
365
380
|
metrics,
|
|
366
381
|
validatorMonitor,
|
|
@@ -405,6 +420,15 @@ export class BeaconChain implements IBeaconChain {
|
|
|
405
420
|
signal
|
|
406
421
|
);
|
|
407
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
|
+
|
|
408
432
|
// always run PrepareNextSlotScheduler except for fork_choice spec tests
|
|
409
433
|
if (!opts?.disablePrepareNextSlot) {
|
|
410
434
|
new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
|
|
@@ -430,6 +454,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
430
454
|
async close(): Promise<void> {
|
|
431
455
|
await this.archiveStore.close();
|
|
432
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
|
+
|
|
433
463
|
this.abortController.abort();
|
|
434
464
|
}
|
|
435
465
|
|
|
@@ -459,6 +489,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
459
489
|
this.seenAttesters.isKnown(epoch, index) ||
|
|
460
490
|
// seenAggregators = single aggregator index, not participants of the aggregate
|
|
461
491
|
this.seenAggregators.isKnown(epoch, index) ||
|
|
492
|
+
// seenPayloadAttesters = single signer of payload attestation message
|
|
493
|
+
this.seenPayloadAttesters.isKnown(epoch, index) ||
|
|
462
494
|
// seenBlockProposers = single block proposer
|
|
463
495
|
this.seenBlockProposers.seenAtEpoch(epoch, index)
|
|
464
496
|
);
|
|
@@ -501,7 +533,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
501
533
|
// only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
|
|
502
534
|
const head = this.forkChoice.getHead();
|
|
503
535
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
504
|
-
return this.regen.getBlockSlotState(head
|
|
536
|
+
return this.regen.getBlockSlotState(head, startSlot, {dontTransferCache: true}, regenCaller);
|
|
505
537
|
}
|
|
506
538
|
|
|
507
539
|
async getStateBySlot(
|
|
@@ -519,12 +551,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
519
551
|
if (opts?.allowRegen) {
|
|
520
552
|
// Find closest canonical block to slot, then trigger regen
|
|
521
553
|
const block = this.forkChoice.getCanonicalBlockClosestLteSlot(slot) ?? finalizedBlock;
|
|
522
|
-
const state = await this.regen.getBlockSlotState(
|
|
523
|
-
block.blockRoot,
|
|
524
|
-
slot,
|
|
525
|
-
{dontTransferCache: true},
|
|
526
|
-
RegenCaller.restApi
|
|
527
|
-
);
|
|
554
|
+
const state = await this.regen.getBlockSlotState(block, slot, {dontTransferCache: true}, RegenCaller.restApi);
|
|
528
555
|
return {
|
|
529
556
|
state,
|
|
530
557
|
executionOptimistic: isOptimisticBlock(block),
|
|
@@ -652,6 +679,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
652
679
|
// Unfinalized slot, attempt to find in fork-choice
|
|
653
680
|
const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
|
|
654
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
|
+
}
|
|
655
689
|
const data = await this.db.block.get(fromHex(block.blockRoot));
|
|
656
690
|
if (data) {
|
|
657
691
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -671,6 +705,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
671
705
|
): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
672
706
|
const block = this.forkChoice.getBlockHex(root);
|
|
673
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
|
+
}
|
|
674
715
|
const data = await this.db.block.get(fromHex(root));
|
|
675
716
|
if (data) {
|
|
676
717
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -683,10 +724,137 @@ export class BeaconChain implements IBeaconChain {
|
|
|
683
724
|
return data && {block: data, executionOptimistic: false, finalized: true};
|
|
684
725
|
}
|
|
685
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
|
+
|
|
686
854
|
async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
|
|
687
|
-
const {slot,
|
|
855
|
+
const {slot, parentBlock} = blockAttributes;
|
|
688
856
|
const state = await this.regen.getBlockSlotState(
|
|
689
|
-
|
|
857
|
+
parentBlock,
|
|
690
858
|
slot,
|
|
691
859
|
{dontTransferCache: true},
|
|
692
860
|
RegenCaller.produceBlock
|
|
@@ -723,7 +891,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
723
891
|
slot,
|
|
724
892
|
feeRecipient,
|
|
725
893
|
commonBlockBodyPromise,
|
|
726
|
-
|
|
894
|
+
parentBlock,
|
|
727
895
|
}: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
|
|
728
896
|
): Promise<{
|
|
729
897
|
block: AssembledBlockType<T>;
|
|
@@ -732,7 +900,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
732
900
|
shouldOverrideBuilder?: boolean;
|
|
733
901
|
}> {
|
|
734
902
|
const state = await this.regen.getBlockSlotState(
|
|
735
|
-
|
|
903
|
+
parentBlock,
|
|
736
904
|
slot,
|
|
737
905
|
{dontTransferCache: true},
|
|
738
906
|
RegenCaller.produceBlock
|
|
@@ -749,7 +917,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
749
917
|
graffiti,
|
|
750
918
|
slot,
|
|
751
919
|
feeRecipient,
|
|
752
|
-
|
|
920
|
+
parentBlock,
|
|
753
921
|
proposerIndex,
|
|
754
922
|
proposerPubKey,
|
|
755
923
|
commonBlockBodyPromise,
|
|
@@ -772,7 +940,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
772
940
|
const block = {
|
|
773
941
|
slot,
|
|
774
942
|
proposerIndex,
|
|
775
|
-
parentRoot:
|
|
943
|
+
parentRoot: fromHex(parentBlock.blockRoot),
|
|
776
944
|
stateRoot: ZERO_HASH,
|
|
777
945
|
body,
|
|
778
946
|
} as AssembledBlockType<T>;
|
|
@@ -968,12 +1136,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
968
1136
|
// thanks to one epoch look ahead, we don't need to dial up to attEpoch
|
|
969
1137
|
const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
|
|
970
1138
|
this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
|
|
971
|
-
state = await this.regen.getBlockSlotState(
|
|
972
|
-
attHeadBlock.blockRoot,
|
|
973
|
-
targetSlot,
|
|
974
|
-
{dontTransferCache: true},
|
|
975
|
-
regenCaller
|
|
976
|
-
);
|
|
1139
|
+
state = await this.regen.getBlockSlotState(attHeadBlock, targetSlot, {dontTransferCache: true}, regenCaller);
|
|
977
1140
|
} else if (blockEpoch > attEpoch) {
|
|
978
1141
|
// should not happen, handled inside attestation verification code
|
|
979
1142
|
throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
|
|
@@ -1102,6 +1265,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1102
1265
|
metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
|
|
1103
1266
|
metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
|
|
1104
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);
|
|
1105
1270
|
// syncContributionAndProofPool tracks metrics on its own
|
|
1106
1271
|
metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
|
|
1107
1272
|
metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
|
|
@@ -1132,6 +1297,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1132
1297
|
this.aggregatedAttestationPool.prune(slot);
|
|
1133
1298
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1134
1299
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1300
|
+
this.payloadAttestationPool.prune(slot);
|
|
1301
|
+
this.executionPayloadBidPool.prune(slot);
|
|
1302
|
+
this.seenExecutionPayloadBids.prune(slot);
|
|
1135
1303
|
this.seenAttestationDatas.onSlot(slot);
|
|
1136
1304
|
this.reprocessController.onSlot(slot);
|
|
1137
1305
|
|
|
@@ -1155,6 +1323,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1155
1323
|
|
|
1156
1324
|
this.seenAttesters.prune(epoch);
|
|
1157
1325
|
this.seenAggregators.prune(epoch);
|
|
1326
|
+
this.seenPayloadAttesters.prune(epoch);
|
|
1158
1327
|
this.seenAggregatedAttestations.prune(epoch);
|
|
1159
1328
|
this.seenBlockAttesters.prune(epoch);
|
|
1160
1329
|
this.beaconProposerCache.prune(epoch);
|
|
@@ -1178,7 +1347,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1178
1347
|
|
|
1179
1348
|
private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
|
|
1180
1349
|
this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
|
|
1181
|
-
|
|
1350
|
+
const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
|
|
1351
|
+
this.seenBlockProposers.prune(finalizedSlot);
|
|
1352
|
+
this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
|
|
1182
1353
|
|
|
1183
1354
|
// Update validator custody to account for effective balance changes
|
|
1184
1355
|
await this.updateValidatorsCustodyRequirement(cp);
|
|
@@ -1186,13 +1357,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1186
1357
|
// TODO: Improve using regen here
|
|
1187
1358
|
const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
|
|
1188
1359
|
const headState = this.regen.getStateSync(stateRoot);
|
|
1189
|
-
const
|
|
1190
|
-
if (
|
|
1191
|
-
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`);
|
|
1192
1363
|
}
|
|
1193
1364
|
|
|
1194
1365
|
if (headState) {
|
|
1195
|
-
this.opPool.pruneAll(
|
|
1366
|
+
this.opPool.pruneAll(blockResult.block, headState);
|
|
1196
1367
|
}
|
|
1197
1368
|
|
|
1198
1369
|
if (headState === null) {
|
|
@@ -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> {}
|