@lodestar/beacon-node 1.40.0-dev.0ae7a89ead → 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/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 +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 +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 +2 -6
- 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 +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 +21 -4
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +185 -19
- 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/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 +3 -8
- 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 +1 -2
- 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/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 +5 -4
- 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/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/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/config/constants.ts +8 -0
- 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 +12 -11
- package/src/chain/ColumnReconstructionTracker.ts +8 -4
- package/src/chain/archiveStore/utils/archiveBlocks.ts +4 -0
- package/src/chain/blocks/blockInput/blockInput.ts +8 -0
- package/src/chain/blocks/importBlock.ts +2 -6
- 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 +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 +210 -27
- 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/prepareNextSlot.ts +6 -6
- package/src/chain/produceBlock/produceBlockBody.ts +7 -5
- package/src/chain/regen/interface.ts +2 -12
- package/src/chain/regen/queued.ts +3 -23
- 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/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 +5 -4
- 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/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/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/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";
|
|
@@ -113,6 +126,11 @@ import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
|
113
126
|
*/
|
|
114
127
|
const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
|
|
115
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
|
+
|
|
116
134
|
export class BeaconChain implements IBeaconChain {
|
|
117
135
|
readonly genesisTime: UintNum64;
|
|
118
136
|
readonly genesisValidatorsRoot: Root;
|
|
@@ -136,18 +154,24 @@ export class BeaconChain implements IBeaconChain {
|
|
|
136
154
|
readonly lightClientServer?: LightClientServer;
|
|
137
155
|
readonly reprocessController: ReprocessController;
|
|
138
156
|
readonly archiveStore: ArchiveStore;
|
|
157
|
+
readonly unfinalizedBlockWrites: JobItemQueue<[IBlockInput[]], void>;
|
|
139
158
|
|
|
140
159
|
// Ops pool
|
|
141
160
|
readonly attestationPool: AttestationPool;
|
|
142
161
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
143
162
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
144
163
|
readonly syncContributionAndProofPool;
|
|
164
|
+
readonly executionPayloadBidPool: ExecutionPayloadBidPool;
|
|
165
|
+
readonly payloadAttestationPool: PayloadAttestationPool;
|
|
145
166
|
readonly opPool: OpPool;
|
|
146
167
|
|
|
147
168
|
// Gossip seen cache
|
|
148
169
|
readonly seenAttesters = new SeenAttesters();
|
|
149
170
|
readonly seenAggregators = new SeenAggregators();
|
|
171
|
+
readonly seenPayloadAttesters = new SeenPayloadAttesters();
|
|
150
172
|
readonly seenAggregatedAttestations: SeenAggregatedAttestations;
|
|
173
|
+
readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
|
|
174
|
+
readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
|
|
151
175
|
readonly seenBlockProposers = new SeenBlockProposers();
|
|
152
176
|
readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
|
|
153
177
|
readonly seenContributionAndProof: SeenContributionAndProof;
|
|
@@ -254,8 +278,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
254
278
|
const emitter = new ChainEventEmitter();
|
|
255
279
|
// by default, verify signatures on both main threads and worker threads
|
|
256
280
|
const bls = opts.blsVerifyAllMainThread
|
|
257
|
-
? new BlsSingleThreadVerifier({metrics})
|
|
258
|
-
: new BlsMultiThreadWorkerPool(opts, {logger, metrics});
|
|
281
|
+
? new BlsSingleThreadVerifier({metrics, index2pubkey})
|
|
282
|
+
: new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
|
|
259
283
|
|
|
260
284
|
if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
|
|
261
285
|
|
|
@@ -264,6 +288,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
264
288
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
|
|
265
289
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
266
290
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
291
|
+
this.executionPayloadBidPool = new ExecutionPayloadBidPool();
|
|
292
|
+
this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
|
|
267
293
|
this.opPool = new OpPool(config);
|
|
268
294
|
|
|
269
295
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
@@ -361,6 +387,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
361
387
|
forkChoice,
|
|
362
388
|
blockStateCache,
|
|
363
389
|
checkpointStateCache,
|
|
390
|
+
seenBlockInputCache: this.seenBlockInputCache,
|
|
364
391
|
db,
|
|
365
392
|
metrics,
|
|
366
393
|
validatorMonitor,
|
|
@@ -405,6 +432,15 @@ export class BeaconChain implements IBeaconChain {
|
|
|
405
432
|
signal
|
|
406
433
|
);
|
|
407
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
|
+
|
|
408
444
|
// always run PrepareNextSlotScheduler except for fork_choice spec tests
|
|
409
445
|
if (!opts?.disablePrepareNextSlot) {
|
|
410
446
|
new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
|
|
@@ -430,6 +466,12 @@ export class BeaconChain implements IBeaconChain {
|
|
|
430
466
|
async close(): Promise<void> {
|
|
431
467
|
await this.archiveStore.close();
|
|
432
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
|
+
|
|
433
475
|
this.abortController.abort();
|
|
434
476
|
}
|
|
435
477
|
|
|
@@ -459,6 +501,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
459
501
|
this.seenAttesters.isKnown(epoch, index) ||
|
|
460
502
|
// seenAggregators = single aggregator index, not participants of the aggregate
|
|
461
503
|
this.seenAggregators.isKnown(epoch, index) ||
|
|
504
|
+
// seenPayloadAttesters = single signer of payload attestation message
|
|
505
|
+
this.seenPayloadAttesters.isKnown(epoch, index) ||
|
|
462
506
|
// seenBlockProposers = single block proposer
|
|
463
507
|
this.seenBlockProposers.seenAtEpoch(epoch, index)
|
|
464
508
|
);
|
|
@@ -501,7 +545,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
501
545
|
// only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
|
|
502
546
|
const head = this.forkChoice.getHead();
|
|
503
547
|
const startSlot = computeStartSlotAtEpoch(epoch);
|
|
504
|
-
return this.regen.getBlockSlotState(head
|
|
548
|
+
return this.regen.getBlockSlotState(head, startSlot, {dontTransferCache: true}, regenCaller);
|
|
505
549
|
}
|
|
506
550
|
|
|
507
551
|
async getStateBySlot(
|
|
@@ -519,12 +563,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
519
563
|
if (opts?.allowRegen) {
|
|
520
564
|
// Find closest canonical block to slot, then trigger regen
|
|
521
565
|
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
|
-
);
|
|
566
|
+
const state = await this.regen.getBlockSlotState(block, slot, {dontTransferCache: true}, RegenCaller.restApi);
|
|
528
567
|
return {
|
|
529
568
|
state,
|
|
530
569
|
executionOptimistic: isOptimisticBlock(block),
|
|
@@ -652,6 +691,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
652
691
|
// Unfinalized slot, attempt to find in fork-choice
|
|
653
692
|
const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
|
|
654
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
|
+
}
|
|
655
701
|
const data = await this.db.block.get(fromHex(block.blockRoot));
|
|
656
702
|
if (data) {
|
|
657
703
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -671,6 +717,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
671
717
|
): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
|
|
672
718
|
const block = this.forkChoice.getBlockHex(root);
|
|
673
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
|
+
}
|
|
674
727
|
const data = await this.db.block.get(fromHex(root));
|
|
675
728
|
if (data) {
|
|
676
729
|
return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
|
|
@@ -683,10 +736,137 @@ export class BeaconChain implements IBeaconChain {
|
|
|
683
736
|
return data && {block: data, executionOptimistic: false, finalized: true};
|
|
684
737
|
}
|
|
685
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
|
+
|
|
686
866
|
async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
|
|
687
|
-
const {slot,
|
|
867
|
+
const {slot, parentBlock} = blockAttributes;
|
|
688
868
|
const state = await this.regen.getBlockSlotState(
|
|
689
|
-
|
|
869
|
+
parentBlock,
|
|
690
870
|
slot,
|
|
691
871
|
{dontTransferCache: true},
|
|
692
872
|
RegenCaller.produceBlock
|
|
@@ -723,7 +903,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
723
903
|
slot,
|
|
724
904
|
feeRecipient,
|
|
725
905
|
commonBlockBodyPromise,
|
|
726
|
-
|
|
906
|
+
parentBlock,
|
|
727
907
|
}: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
|
|
728
908
|
): Promise<{
|
|
729
909
|
block: AssembledBlockType<T>;
|
|
@@ -732,7 +912,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
732
912
|
shouldOverrideBuilder?: boolean;
|
|
733
913
|
}> {
|
|
734
914
|
const state = await this.regen.getBlockSlotState(
|
|
735
|
-
|
|
915
|
+
parentBlock,
|
|
736
916
|
slot,
|
|
737
917
|
{dontTransferCache: true},
|
|
738
918
|
RegenCaller.produceBlock
|
|
@@ -749,7 +929,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
749
929
|
graffiti,
|
|
750
930
|
slot,
|
|
751
931
|
feeRecipient,
|
|
752
|
-
|
|
932
|
+
parentBlock,
|
|
753
933
|
proposerIndex,
|
|
754
934
|
proposerPubKey,
|
|
755
935
|
commonBlockBodyPromise,
|
|
@@ -772,7 +952,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
772
952
|
const block = {
|
|
773
953
|
slot,
|
|
774
954
|
proposerIndex,
|
|
775
|
-
parentRoot:
|
|
955
|
+
parentRoot: fromHex(parentBlock.blockRoot),
|
|
776
956
|
stateRoot: ZERO_HASH,
|
|
777
957
|
body,
|
|
778
958
|
} as AssembledBlockType<T>;
|
|
@@ -968,12 +1148,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
968
1148
|
// thanks to one epoch look ahead, we don't need to dial up to attEpoch
|
|
969
1149
|
const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
|
|
970
1150
|
this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
|
|
971
|
-
state = await this.regen.getBlockSlotState(
|
|
972
|
-
attHeadBlock.blockRoot,
|
|
973
|
-
targetSlot,
|
|
974
|
-
{dontTransferCache: true},
|
|
975
|
-
regenCaller
|
|
976
|
-
);
|
|
1151
|
+
state = await this.regen.getBlockSlotState(attHeadBlock, targetSlot, {dontTransferCache: true}, regenCaller);
|
|
977
1152
|
} else if (blockEpoch > attEpoch) {
|
|
978
1153
|
// should not happen, handled inside attestation verification code
|
|
979
1154
|
throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
|
|
@@ -1102,6 +1277,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1102
1277
|
metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
|
|
1103
1278
|
metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
|
|
1104
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);
|
|
1105
1282
|
// syncContributionAndProofPool tracks metrics on its own
|
|
1106
1283
|
metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
|
|
1107
1284
|
metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
|
|
@@ -1132,6 +1309,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1132
1309
|
this.aggregatedAttestationPool.prune(slot);
|
|
1133
1310
|
this.syncCommitteeMessagePool.prune(slot);
|
|
1134
1311
|
this.seenSyncCommitteeMessages.prune(slot);
|
|
1312
|
+
this.payloadAttestationPool.prune(slot);
|
|
1313
|
+
this.executionPayloadBidPool.prune(slot);
|
|
1314
|
+
this.seenExecutionPayloadBids.prune(slot);
|
|
1135
1315
|
this.seenAttestationDatas.onSlot(slot);
|
|
1136
1316
|
this.reprocessController.onSlot(slot);
|
|
1137
1317
|
|
|
@@ -1155,6 +1335,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1155
1335
|
|
|
1156
1336
|
this.seenAttesters.prune(epoch);
|
|
1157
1337
|
this.seenAggregators.prune(epoch);
|
|
1338
|
+
this.seenPayloadAttesters.prune(epoch);
|
|
1158
1339
|
this.seenAggregatedAttestations.prune(epoch);
|
|
1159
1340
|
this.seenBlockAttesters.prune(epoch);
|
|
1160
1341
|
this.beaconProposerCache.prune(epoch);
|
|
@@ -1178,7 +1359,9 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1178
1359
|
|
|
1179
1360
|
private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
|
|
1180
1361
|
this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
|
|
1181
|
-
|
|
1362
|
+
const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
|
|
1363
|
+
this.seenBlockProposers.prune(finalizedSlot);
|
|
1364
|
+
this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
|
|
1182
1365
|
|
|
1183
1366
|
// Update validator custody to account for effective balance changes
|
|
1184
1367
|
await this.updateValidatorsCustodyRequirement(cp);
|
|
@@ -1186,13 +1369,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1186
1369
|
// TODO: Improve using regen here
|
|
1187
1370
|
const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
|
|
1188
1371
|
const headState = this.regen.getStateSync(stateRoot);
|
|
1189
|
-
const
|
|
1190
|
-
if (
|
|
1191
|
-
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`);
|
|
1192
1375
|
}
|
|
1193
1376
|
|
|
1194
1377
|
if (headState) {
|
|
1195
|
-
this.opPool.pruneAll(
|
|
1378
|
+
this.opPool.pruneAll(blockResult.block, headState);
|
|
1196
1379
|
}
|
|
1197
1380
|
|
|
1198
1381
|
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> {}
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
import {ZERO_HASH_HEX} from "@lodestar/params";
|
|
12
12
|
import {
|
|
13
13
|
CachedBeaconStateAllForks,
|
|
14
|
+
CachedBeaconStateGloas,
|
|
14
15
|
DataAvailabilityStatus,
|
|
15
16
|
computeAnchorCheckpoint,
|
|
16
17
|
computeEpochAtSlot,
|
|
@@ -144,6 +145,15 @@ export function initializeForkChoiceFromFinalizedState(
|
|
|
144
145
|
: {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
|
|
145
146
|
|
|
146
147
|
dataAvailabilityStatus: DataAvailabilityStatus.PreData,
|
|
148
|
+
...(computeEpochAtSlot(blockHeader.slot) < state.config.GLOAS_FORK_EPOCH
|
|
149
|
+
? {
|
|
150
|
+
builderIndex: undefined,
|
|
151
|
+
blockHashHex: undefined,
|
|
152
|
+
}
|
|
153
|
+
: {
|
|
154
|
+
builderIndex: (state as CachedBeaconStateGloas).latestExecutionPayloadBid.builderIndex,
|
|
155
|
+
blockHashHex: toRootHex((state as CachedBeaconStateGloas).latestExecutionPayloadBid.blockHash),
|
|
156
|
+
}),
|
|
147
157
|
},
|
|
148
158
|
currentSlot
|
|
149
159
|
),
|
|
@@ -225,6 +235,15 @@ export function initializeForkChoiceFromUnfinalizedState(
|
|
|
225
235
|
: {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
|
|
226
236
|
|
|
227
237
|
dataAvailabilityStatus: DataAvailabilityStatus.PreData,
|
|
238
|
+
...(computeEpochAtSlot(blockHeader.slot) < unfinalizedState.config.GLOAS_FORK_EPOCH
|
|
239
|
+
? {
|
|
240
|
+
builderIndex: undefined,
|
|
241
|
+
blockHashHex: undefined,
|
|
242
|
+
}
|
|
243
|
+
: {
|
|
244
|
+
builderIndex: (unfinalizedState as CachedBeaconStateGloas).latestExecutionPayloadBid.builderIndex,
|
|
245
|
+
blockHashHex: toRootHex((unfinalizedState as CachedBeaconStateGloas).latestExecutionPayloadBid.blockHash),
|
|
246
|
+
}),
|
|
228
247
|
};
|
|
229
248
|
|
|
230
249
|
const parentSlot = blockHeader.slot - 1;
|