@lodestar/beacon-node 1.38.0 → 1.39.0-dev.075956b855
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/utils.js +1 -1
- package/lib/api/impl/beacon/blocks/utils.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/index.js +4 -5
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +1 -1
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +1 -21
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -6
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +9 -128
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts +3 -2
- package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSignatures.js +3 -2
- package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
- package/lib/chain/chain.d.ts +4 -5
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +25 -56
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/initState.d.ts +1 -14
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +1 -62
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +0 -2
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -4
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +4 -4
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/opPool.d.ts +3 -0
- package/lib/chain/opPools/opPool.d.ts.map +1 -1
- package/lib/chain/opPools/opPool.js +9 -8
- package/lib/chain/opPools/opPool.js.map +1 -1
- package/lib/chain/options.d.ts +0 -4
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -2
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts +0 -4
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +2 -22
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +2 -22
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +32 -98
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/rewards/attestationsRewards.d.ts +3 -2
- package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -1
- package/lib/chain/rewards/attestationsRewards.js +9 -9
- package/lib/chain/rewards/attestationsRewards.js.map +1 -1
- package/lib/chain/rewards/blockRewards.d.ts +2 -1
- package/lib/chain/rewards/blockRewards.d.ts.map +1 -1
- package/lib/chain/rewards/blockRewards.js +5 -5
- package/lib/chain/rewards/blockRewards.js.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.d.ts +3 -2
- package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -1
- package/lib/chain/rewards/syncCommitteeRewards.js +2 -3
- package/lib/chain/rewards/syncCommitteeRewards.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +4 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -2
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.js +9 -0
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +2 -2
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
- package/lib/chain/validation/blobSidecar.js +2 -2
- package/lib/chain/validation/blobSidecar.js.map +1 -1
- package/lib/chain/validation/block.js +1 -1
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/blsToExecutionChange.js +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.js +2 -2
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -1
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.js +1 -1
- package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +3 -2
- package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -4
- package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommittee.d.ts +3 -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 +2 -1
- 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 +3 -2
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
- package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +2 -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 +5 -4
- 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/db/beacon.d.ts +3 -7
- package/lib/db/beacon.d.ts.map +1 -1
- package/lib/db/beacon.js +33 -12
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +12 -6
- package/lib/db/buckets.d.ts.map +1 -1
- package/lib/db/buckets.js +6 -1
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +2 -7
- package/lib/db/interface.d.ts.map +1 -1
- package/lib/db/repositories/index.d.ts +0 -3
- package/lib/db/repositories/index.d.ts.map +1 -1
- package/lib/db/repositories/index.js +0 -3
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/execution/engine/http.d.ts +5 -13
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +6 -15
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +1 -1
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/{eth1/provider → execution/engine}/jsonRpcHttpClient.d.ts +1 -1
- package/lib/execution/engine/jsonRpcHttpClient.d.ts.map +1 -0
- package/lib/execution/engine/jsonRpcHttpClient.js.map +1 -0
- package/lib/execution/engine/jwt.d.ts.map +1 -0
- package/lib/execution/engine/jwt.js.map +1 -0
- package/lib/execution/engine/mock.d.ts +2 -6
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +4 -15
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
- package/lib/execution/engine/types.d.ts +1 -1
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +1 -1
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/execution/engine/utils.d.ts +64 -2
- package/lib/execution/engine/utils.d.ts.map +1 -1
- package/lib/execution/engine/utils.js +91 -2
- package/lib/execution/engine/utils.js.map +1 -1
- package/lib/index.d.ts +1 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -2
- package/lib/index.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +0 -49
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +0 -134
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/events.d.ts +1 -1
- package/lib/network/core/events.d.ts.map +1 -1
- package/lib/network/core/events.js +1 -1
- package/lib/network/core/events.js.map +1 -1
- package/lib/network/events.d.ts +6 -1
- package/lib/network/events.d.ts.map +1 -1
- package/lib/network/events.js +7 -1
- package/lib/network/events.js.map +1 -1
- package/lib/node/nodejs.d.ts +6 -3
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +13 -10
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/notifier.d.ts.map +1 -1
- package/lib/node/notifier.js +0 -13
- package/lib/node/notifier.js.map +1 -1
- package/lib/node/options.d.ts +0 -2
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +0 -2
- package/lib/node/options.js.map +1 -1
- package/lib/node/utils/interop/deposits.d.ts +2 -1
- package/lib/node/utils/interop/deposits.d.ts.map +1 -1
- package/lib/node/utils/interop/deposits.js.map +1 -1
- package/lib/node/utils/interop/state.d.ts +1 -1
- package/lib/node/utils/interop/state.d.ts.map +1 -1
- package/lib/node/utils/state.d.ts +1 -7
- package/lib/node/utils/state.d.ts.map +1 -1
- package/lib/node/utils/state.js +1 -14
- package/lib/node/utils/state.js.map +1 -1
- package/lib/sync/backfill/backfill.d.ts.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 +2 -2
- package/lib/sync/backfill/verify.d.ts.map +1 -1
- package/lib/sync/backfill/verify.js +3 -3
- package/lib/sync/backfill/verify.js.map +1 -1
- package/lib/util/workerEvents.d.ts +1 -6
- package/lib/util/workerEvents.d.ts.map +1 -1
- package/lib/util/workerEvents.js +8 -8
- package/lib/util/workerEvents.js.map +1 -1
- package/package.json +14 -21
- package/src/api/impl/beacon/blocks/utils.ts +1 -1
- package/src/api/impl/beacon/state/index.ts +4 -5
- package/src/api/impl/validator/index.ts +1 -1
- package/src/chain/blocks/verifyBlock.ts +3 -24
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -161
- package/src/chain/blocks/verifyBlocksSignatures.ts +15 -4
- package/src/chain/chain.ts +28 -63
- package/src/chain/initState.ts +1 -97
- package/src/chain/interface.ts +0 -2
- package/src/chain/opPools/aggregatedAttestationPool.ts +7 -7
- package/src/chain/opPools/opPool.ts +8 -8
- package/src/chain/options.ts +0 -6
- package/src/chain/prepareNextSlot.ts +2 -29
- package/src/chain/produceBlock/produceBlockBody.ts +33 -132
- package/src/chain/rewards/attestationsRewards.ts +18 -8
- package/src/chain/rewards/blockRewards.ts +6 -3
- package/src/chain/rewards/syncCommitteeRewards.ts +5 -3
- package/src/chain/stateCache/persistentCheckpointsCache.ts +15 -2
- package/src/chain/validation/aggregateAndProof.ts +12 -0
- package/src/chain/validation/attesterSlashing.ts +7 -2
- package/src/chain/validation/blobSidecar.ts +10 -2
- package/src/chain/validation/block.ts +1 -1
- package/src/chain/validation/blsToExecutionChange.ts +1 -1
- package/src/chain/validation/dataColumnSidecar.ts +6 -1
- package/src/chain/validation/proposerSlashing.ts +6 -1
- package/src/chain/validation/signatureSets/aggregateAndProof.ts +1 -1
- package/src/chain/validation/signatureSets/contributionAndProof.ts +6 -3
- package/src/chain/validation/signatureSets/syncCommittee.ts +6 -2
- package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +3 -1
- package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +5 -2
- package/src/chain/validation/syncCommittee.ts +1 -1
- package/src/chain/validation/syncCommitteeContributionAndProof.ts +10 -6
- package/src/chain/validation/voluntaryExit.ts +1 -1
- package/src/db/beacon.ts +38 -16
- package/src/db/buckets.ts +12 -7
- package/src/db/interface.ts +2 -13
- package/src/db/repositories/index.ts +0 -3
- package/src/execution/engine/http.ts +12 -21
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +1 -1
- package/src/{eth1/provider → execution/engine}/jsonRpcHttpClient.ts +1 -1
- package/src/execution/engine/mock.ts +4 -17
- package/src/execution/engine/payloadIdCache.ts +1 -1
- package/src/execution/engine/types.ts +9 -9
- package/src/execution/engine/utils.ts +111 -5
- package/src/index.ts +1 -2
- package/src/metrics/metrics/lodestar.ts +0 -144
- package/src/network/core/events.ts +1 -1
- package/src/network/events.ts +7 -1
- package/src/node/nodejs.ts +20 -11
- package/src/node/notifier.ts +0 -16
- package/src/node/options.ts +0 -3
- package/src/node/utils/interop/deposits.ts +3 -1
- package/src/node/utils/interop/state.ts +1 -1
- package/src/node/utils/state.ts +3 -18
- package/src/sync/backfill/backfill.ts +14 -2
- package/src/sync/backfill/verify.ts +9 -2
- package/src/util/workerEvents.ts +9 -8
- package/lib/chain/genesis/genesis.d.ts +0 -51
- package/lib/chain/genesis/genesis.d.ts.map +0 -1
- package/lib/chain/genesis/genesis.js +0 -123
- package/lib/chain/genesis/genesis.js.map +0 -1
- package/lib/chain/genesis/interface.d.ts +0 -13
- package/lib/chain/genesis/interface.d.ts.map +0 -1
- package/lib/chain/genesis/interface.js +0 -2
- package/lib/chain/genesis/interface.js.map +0 -1
- package/lib/db/repositories/depositDataRoot.d.ts +0 -22
- package/lib/db/repositories/depositDataRoot.d.ts.map +0 -1
- package/lib/db/repositories/depositDataRoot.js +0 -62
- package/lib/db/repositories/depositDataRoot.js.map +0 -1
- package/lib/db/repositories/depositEvent.d.ts +0 -13
- package/lib/db/repositories/depositEvent.d.ts.map +0 -1
- package/lib/db/repositories/depositEvent.js +0 -27
- package/lib/db/repositories/depositEvent.js.map +0 -1
- package/lib/db/repositories/eth1Data.d.ts +0 -13
- package/lib/db/repositories/eth1Data.d.ts.map +0 -1
- package/lib/db/repositories/eth1Data.js +0 -26
- package/lib/db/repositories/eth1Data.js.map +0 -1
- package/lib/db/single/index.d.ts +0 -3
- package/lib/db/single/index.d.ts.map +0 -1
- package/lib/db/single/index.js +0 -3
- package/lib/db/single/index.js.map +0 -1
- package/lib/db/single/preGenesisState.d.ts +0 -16
- package/lib/db/single/preGenesisState.d.ts.map +0 -1
- package/lib/db/single/preGenesisState.js +0 -29
- package/lib/db/single/preGenesisState.js.map +0 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts +0 -14
- package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +0 -1
- package/lib/db/single/preGenesisStateLastProcessedBlock.js +0 -27
- package/lib/db/single/preGenesisStateLastProcessedBlock.js.map +0 -1
- package/lib/eth1/errors.d.ts +0 -66
- package/lib/eth1/errors.d.ts.map +0 -1
- package/lib/eth1/errors.js +0 -27
- package/lib/eth1/errors.js.map +0 -1
- package/lib/eth1/eth1DataCache.d.ts +0 -19
- package/lib/eth1/eth1DataCache.d.ts.map +0 -1
- package/lib/eth1/eth1DataCache.js +0 -19
- package/lib/eth1/eth1DataCache.js.map +0 -1
- package/lib/eth1/eth1DepositDataTracker.d.ts +0 -80
- package/lib/eth1/eth1DepositDataTracker.d.ts.map +0 -1
- package/lib/eth1/eth1DepositDataTracker.js +0 -317
- package/lib/eth1/eth1DepositDataTracker.js.map +0 -1
- package/lib/eth1/eth1DepositsCache.d.ts +0 -42
- package/lib/eth1/eth1DepositsCache.d.ts.map +0 -1
- package/lib/eth1/eth1DepositsCache.js +0 -119
- package/lib/eth1/eth1DepositsCache.js.map +0 -1
- package/lib/eth1/eth1MergeBlockTracker.d.ts +0 -65
- package/lib/eth1/eth1MergeBlockTracker.d.ts.map +0 -1
- package/lib/eth1/eth1MergeBlockTracker.js +0 -262
- package/lib/eth1/eth1MergeBlockTracker.js.map +0 -1
- package/lib/eth1/index.d.ts +0 -46
- package/lib/eth1/index.d.ts.map +0 -1
- package/lib/eth1/index.js +0 -121
- package/lib/eth1/index.js.map +0 -1
- package/lib/eth1/interface.d.ts +0 -112
- package/lib/eth1/interface.d.ts.map +0 -1
- package/lib/eth1/interface.js +0 -8
- package/lib/eth1/interface.js.map +0 -1
- package/lib/eth1/options.d.ts +0 -22
- package/lib/eth1/options.d.ts.map +0 -1
- package/lib/eth1/options.js +0 -8
- package/lib/eth1/options.js.map +0 -1
- package/lib/eth1/provider/eth1Provider.d.ts +0 -39
- package/lib/eth1/provider/eth1Provider.d.ts.map +0 -1
- package/lib/eth1/provider/eth1Provider.js +0 -147
- package/lib/eth1/provider/eth1Provider.js.map +0 -1
- package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +0 -1
- package/lib/eth1/provider/jsonRpcHttpClient.js.map +0 -1
- package/lib/eth1/provider/jwt.d.ts.map +0 -1
- package/lib/eth1/provider/jwt.js.map +0 -1
- package/lib/eth1/provider/utils.d.ts +0 -65
- package/lib/eth1/provider/utils.d.ts.map +0 -1
- package/lib/eth1/provider/utils.js +0 -120
- package/lib/eth1/provider/utils.js.map +0 -1
- package/lib/eth1/stream.d.ts +0 -15
- package/lib/eth1/stream.d.ts.map +0 -1
- package/lib/eth1/stream.js +0 -54
- package/lib/eth1/stream.js.map +0 -1
- package/lib/eth1/utils/depositContract.d.ts +0 -14
- package/lib/eth1/utils/depositContract.d.ts.map +0 -1
- package/lib/eth1/utils/depositContract.js +0 -33
- package/lib/eth1/utils/depositContract.js.map +0 -1
- package/lib/eth1/utils/deposits.d.ts +0 -8
- package/lib/eth1/utils/deposits.d.ts.map +0 -1
- package/lib/eth1/utils/deposits.js +0 -47
- package/lib/eth1/utils/deposits.js.map +0 -1
- package/lib/eth1/utils/eth1Data.d.ts +0 -22
- package/lib/eth1/utils/eth1Data.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Data.js +0 -77
- package/lib/eth1/utils/eth1Data.js.map +0 -1
- package/lib/eth1/utils/eth1DepositEvent.d.ts +0 -7
- package/lib/eth1/utils/eth1DepositEvent.d.ts.map +0 -1
- package/lib/eth1/utils/eth1DepositEvent.js +0 -13
- package/lib/eth1/utils/eth1DepositEvent.js.map +0 -1
- package/lib/eth1/utils/eth1Vote.d.ts +0 -17
- package/lib/eth1/utils/eth1Vote.d.ts.map +0 -1
- package/lib/eth1/utils/eth1Vote.js +0 -111
- package/lib/eth1/utils/eth1Vote.js.map +0 -1
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts +0 -9
- package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +0 -1
- package/lib/eth1/utils/groupDepositEventsByBlock.js +0 -17
- package/lib/eth1/utils/groupDepositEventsByBlock.js.map +0 -1
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts +0 -10
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +0 -1
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.js +0 -14
- package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.js.map +0 -1
- package/src/chain/genesis/genesis.ts +0 -190
- package/src/chain/genesis/interface.ts +0 -14
- package/src/db/repositories/depositDataRoot.ts +0 -80
- package/src/db/repositories/depositEvent.ts +0 -32
- package/src/db/repositories/eth1Data.ts +0 -33
- package/src/db/single/index.ts +0 -2
- package/src/db/single/preGenesisState.ts +0 -37
- package/src/db/single/preGenesisStateLastProcessedBlock.ts +0 -34
- package/src/eth1/errors.ts +0 -40
- package/src/eth1/eth1DataCache.ts +0 -26
- package/src/eth1/eth1DepositDataTracker.ts +0 -410
- package/src/eth1/eth1DepositsCache.ts +0 -141
- package/src/eth1/eth1MergeBlockTracker.ts +0 -328
- package/src/eth1/index.ts +0 -157
- package/src/eth1/interface.ts +0 -131
- package/src/eth1/options.ts +0 -28
- package/src/eth1/provider/eth1Provider.ts +0 -229
- package/src/eth1/provider/utils.ts +0 -136
- package/src/eth1/stream.ts +0 -75
- package/src/eth1/utils/depositContract.ts +0 -37
- package/src/eth1/utils/deposits.ts +0 -70
- package/src/eth1/utils/eth1Data.ts +0 -100
- package/src/eth1/utils/eth1DepositEvent.ts +0 -12
- package/src/eth1/utils/eth1Vote.ts +0 -142
- package/src/eth1/utils/groupDepositEventsByBlock.ts +0 -19
- package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +0 -18
- /package/lib/{eth1/provider → execution/engine}/jsonRpcHttpClient.js +0 -0
- /package/lib/{eth1/provider → execution/engine}/jwt.d.ts +0 -0
- /package/lib/{eth1/provider → execution/engine}/jwt.js +0 -0
- /package/src/{eth1/provider → execution/engine}/jwt.ts +0 -0
|
@@ -95,7 +95,7 @@ export function getBeaconStateApi({
|
|
|
95
95
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
96
96
|
const currentEpoch = getCurrentEpoch(state);
|
|
97
97
|
const {validators, balances} = state; // Get the validators sub tree once for all the loop
|
|
98
|
-
const {pubkey2index} = chain
|
|
98
|
+
const {pubkey2index} = chain;
|
|
99
99
|
|
|
100
100
|
const validatorResponses: routes.beacon.ValidatorResponse[] = [];
|
|
101
101
|
if (validatorIds.length) {
|
|
@@ -154,7 +154,7 @@ export function getBeaconStateApi({
|
|
|
154
154
|
|
|
155
155
|
async postStateValidatorIdentities({stateId, validatorIds = []}) {
|
|
156
156
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
157
|
-
const {pubkey2index} = chain
|
|
157
|
+
const {pubkey2index} = chain;
|
|
158
158
|
|
|
159
159
|
let validatorIdentities: routes.beacon.ValidatorIdentities;
|
|
160
160
|
|
|
@@ -187,7 +187,7 @@ export function getBeaconStateApi({
|
|
|
187
187
|
|
|
188
188
|
async getStateValidator({stateId, validatorId}) {
|
|
189
189
|
const {state, executionOptimistic, finalized} = await getState(stateId);
|
|
190
|
-
const {pubkey2index} = chain
|
|
190
|
+
const {pubkey2index} = chain;
|
|
191
191
|
|
|
192
192
|
const resp = getStateValidatorIndex(validatorId, state, pubkey2index);
|
|
193
193
|
if (!resp.valid) {
|
|
@@ -212,10 +212,9 @@ export function getBeaconStateApi({
|
|
|
212
212
|
if (validatorIds.length) {
|
|
213
213
|
assertUniqueItems(validatorIds, "Duplicate validator IDs provided");
|
|
214
214
|
|
|
215
|
-
const headState = chain.getHeadState();
|
|
216
215
|
const balances: routes.beacon.ValidatorBalance[] = [];
|
|
217
216
|
for (const id of validatorIds) {
|
|
218
|
-
const resp = getStateValidatorIndex(id, state,
|
|
217
|
+
const resp = getStateValidatorIndex(id, state, chain.pubkey2index);
|
|
219
218
|
|
|
220
219
|
if (resp.valid) {
|
|
221
220
|
balances.push({
|
|
@@ -1511,7 +1511,7 @@ export function getValidatorApi(
|
|
|
1511
1511
|
|
|
1512
1512
|
const filteredRegistrations = registrations.filter((registration) => {
|
|
1513
1513
|
const {pubkey} = registration.message;
|
|
1514
|
-
const validatorIndex =
|
|
1514
|
+
const validatorIndex = chain.pubkey2index.get(pubkey);
|
|
1515
1515
|
if (validatorIndex === null) return false;
|
|
1516
1516
|
|
|
1517
1517
|
const validator = headState.validators.getReadonly(validatorIndex);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {ChainForkConfig} from "@lodestar/config";
|
|
2
1
|
import {ExecutionStatus, ProtoBlock} from "@lodestar/fork-choice";
|
|
3
2
|
import {ForkName, isForkPostFulu} from "@lodestar/params";
|
|
4
3
|
import {
|
|
@@ -7,8 +6,7 @@ import {
|
|
|
7
6
|
computeEpochAtSlot,
|
|
8
7
|
isStateValidatorsNodesPopulated,
|
|
9
8
|
} from "@lodestar/state-transition";
|
|
10
|
-
import {IndexedAttestation,
|
|
11
|
-
import {Logger, toRootHex} from "@lodestar/utils";
|
|
9
|
+
import {IndexedAttestation, deneb} from "@lodestar/types";
|
|
12
10
|
import type {BeaconChain} from "../chain.js";
|
|
13
11
|
import {BlockError, BlockErrorCode} from "../errors/index.js";
|
|
14
12
|
import {BlockProcessOpts} from "../options.js";
|
|
@@ -18,7 +16,6 @@ import {ImportBlockOpts} from "./types.js";
|
|
|
18
16
|
import {DENEB_BLOWFISH_BANNER} from "./utils/blowfishBanner.js";
|
|
19
17
|
import {ELECTRA_GIRAFFE_BANNER} from "./utils/giraffeBanner.js";
|
|
20
18
|
import {CAPELLA_OWL_BANNER} from "./utils/ownBanner.js";
|
|
21
|
-
import {POS_PANDA_MERGE_TRANSITION_BANNER} from "./utils/pandaMergeTransitionBanner.js";
|
|
22
19
|
import {FULU_ZEBRA_BANNER} from "./utils/zebraBanner.js";
|
|
23
20
|
import {verifyBlocksDataAvailability} from "./verifyBlocksDataAvailability.js";
|
|
24
21
|
import {SegmentExecStatus, verifyBlocksExecutionPayload} from "./verifyBlocksExecutionPayloads.js";
|
|
@@ -103,7 +100,6 @@ export async function verifyBlocksInEpoch(
|
|
|
103
100
|
: Promise.resolve({
|
|
104
101
|
execAborted: null,
|
|
105
102
|
executionStatuses: blocks.map((_blk) => ExecutionStatus.Syncing),
|
|
106
|
-
mergeBlockFound: null,
|
|
107
103
|
} as SegmentExecStatus);
|
|
108
104
|
|
|
109
105
|
// Store indexed attestations for each block to avoid recomputing them during import
|
|
@@ -143,6 +139,8 @@ export async function verifyBlocksInEpoch(
|
|
|
143
139
|
// All signatures at once
|
|
144
140
|
opts.skipVerifyBlockSignatures !== true
|
|
145
141
|
? verifyBlocksSignatures(
|
|
142
|
+
this.config,
|
|
143
|
+
this.index2pubkey,
|
|
146
144
|
this.bls,
|
|
147
145
|
this.logger,
|
|
148
146
|
this.metrics,
|
|
@@ -162,12 +160,6 @@ export async function verifyBlocksInEpoch(
|
|
|
162
160
|
]);
|
|
163
161
|
|
|
164
162
|
if (opts.verifyOnly !== true) {
|
|
165
|
-
if (segmentExecStatus.execAborted === null && segmentExecStatus.mergeBlockFound !== null) {
|
|
166
|
-
// merge block found and is fully valid = state transition + signatures + execution payload.
|
|
167
|
-
// TODO: Will this banner be logged during syncing?
|
|
168
|
-
logOnPowBlock(this.logger, this.config, segmentExecStatus.mergeBlockFound);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
163
|
const fromForkBoundary = this.config.getForkBoundaryAtEpoch(computeEpochAtSlot(parentBlock.slot));
|
|
172
164
|
const toForkBoundary = this.config.getForkBoundaryAtEpoch(computeEpochAtSlot(lastBlock.message.slot));
|
|
173
165
|
|
|
@@ -250,16 +242,3 @@ export async function verifyBlocksInEpoch(
|
|
|
250
242
|
abortController.abort();
|
|
251
243
|
}
|
|
252
244
|
}
|
|
253
|
-
|
|
254
|
-
function logOnPowBlock(logger: Logger, config: ChainForkConfig, mergeBlock: bellatrix.BeaconBlock): void {
|
|
255
|
-
const mergeBlockHash = toRootHex(config.getForkTypes(mergeBlock.slot).BeaconBlock.hashTreeRoot(mergeBlock));
|
|
256
|
-
const mergeExecutionHash = toRootHex(mergeBlock.body.executionPayload.blockHash);
|
|
257
|
-
const mergePowHash = toRootHex(mergeBlock.body.executionPayload.parentHash);
|
|
258
|
-
logger.info(POS_PANDA_MERGE_TRANSITION_BANNER);
|
|
259
|
-
logger.info("Execution transitioning from PoW to PoS!!!");
|
|
260
|
-
logger.info("Importing block referencing terminal PoW block", {
|
|
261
|
-
blockHash: mergeBlockHash,
|
|
262
|
-
executionHash: mergeExecutionHash,
|
|
263
|
-
powHash: mergePowHash,
|
|
264
|
-
});
|
|
265
|
-
}
|
|
@@ -6,19 +6,16 @@ import {
|
|
|
6
6
|
LVHValidResponse,
|
|
7
7
|
MaybeValidExecutionStatus,
|
|
8
8
|
ProtoBlock,
|
|
9
|
-
assertValidTerminalPowBlock,
|
|
10
9
|
} from "@lodestar/fork-choice";
|
|
11
|
-
import {ForkSeq
|
|
10
|
+
import {ForkSeq} from "@lodestar/params";
|
|
12
11
|
import {
|
|
13
12
|
CachedBeaconStateAllForks,
|
|
14
13
|
isExecutionBlockBodyType,
|
|
15
14
|
isExecutionEnabled,
|
|
16
15
|
isExecutionStateType,
|
|
17
|
-
isMergeTransitionBlock as isMergeTransitionBlockFn,
|
|
18
16
|
} from "@lodestar/state-transition";
|
|
19
|
-
import {
|
|
17
|
+
import {bellatrix, electra} from "@lodestar/types";
|
|
20
18
|
import {ErrorAborted, Logger, toRootHex} from "@lodestar/utils";
|
|
21
|
-
import {IEth1ForBlockProduction} from "../../eth1/index.js";
|
|
22
19
|
import {ExecutionPayloadStatus, IExecutionEngine} from "../../execution/engine/interface.js";
|
|
23
20
|
import {Metrics} from "../../metrics/metrics.js";
|
|
24
21
|
import {IClock} from "../../util/clock.js";
|
|
@@ -29,7 +26,6 @@ import {IBlockInput} from "./blockInput/types.js";
|
|
|
29
26
|
import {ImportBlockOpts} from "./types.js";
|
|
30
27
|
|
|
31
28
|
export type VerifyBlockExecutionPayloadModules = {
|
|
32
|
-
eth1: IEth1ForBlockProduction;
|
|
33
29
|
executionEngine: IExecutionEngine;
|
|
34
30
|
clock: IClock;
|
|
35
31
|
logger: Logger;
|
|
@@ -44,9 +40,8 @@ export type SegmentExecStatus =
|
|
|
44
40
|
execAborted: null;
|
|
45
41
|
executionStatuses: MaybeValidExecutionStatus[];
|
|
46
42
|
executionTime: number;
|
|
47
|
-
mergeBlockFound: bellatrix.BeaconBlock | null;
|
|
48
43
|
}
|
|
49
|
-
| {execAborted: ExecAbortType; invalidSegmentLVH?: LVHInvalidResponse
|
|
44
|
+
| {execAborted: ExecAbortType; invalidSegmentLVH?: LVHInvalidResponse};
|
|
50
45
|
|
|
51
46
|
type VerifyExecutionErrorResponse =
|
|
52
47
|
| {executionStatus: ExecutionStatus.Invalid; lvhResponse: LVHInvalidResponse; execError: BlockError}
|
|
@@ -72,7 +67,6 @@ export async function verifyBlocksExecutionPayload(
|
|
|
72
67
|
opts: BlockProcessOpts & ImportBlockOpts
|
|
73
68
|
): Promise<SegmentExecStatus> {
|
|
74
69
|
const executionStatuses: MaybeValidExecutionStatus[] = [];
|
|
75
|
-
let mergeBlockFound: bellatrix.BeaconBlock | null = null;
|
|
76
70
|
const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
|
|
77
71
|
const lastBlock = blockInputs.at(-1);
|
|
78
72
|
|
|
@@ -96,57 +90,9 @@ export async function verifyBlocksExecutionPayload(
|
|
|
96
90
|
// will either validate or prune invalid blocks
|
|
97
91
|
//
|
|
98
92
|
// We need to track and keep updating if its safe to optimistically import these blocks.
|
|
99
|
-
// The following is how we determine for a block if its safe:
|
|
100
|
-
//
|
|
101
|
-
// (but we need to modify this check for this segment of blocks because it checks if the
|
|
102
|
-
// parent of any block imported in forkchoice is post-merge and currently we could only
|
|
103
|
-
// have blocks[0]'s parent imported in the chain as this is no longer one by one verify +
|
|
104
|
-
// import.)
|
|
105
|
-
//
|
|
106
93
|
//
|
|
107
94
|
// When to import such blocks:
|
|
108
95
|
// From: https://github.com/ethereum/consensus-specs/pull/2844
|
|
109
|
-
// A block MUST NOT be optimistically imported, unless either of the following
|
|
110
|
-
// conditions are met:
|
|
111
|
-
//
|
|
112
|
-
// 1. Parent of the block has execution
|
|
113
|
-
//
|
|
114
|
-
// Since with the sync optimizations, the previous block might not have been in the
|
|
115
|
-
// forkChoice yet, so the below check could fail for safeSlotsToImportOptimistically
|
|
116
|
-
//
|
|
117
|
-
// Luckily, we can depend on the preState0 to see if we are already post merge w.r.t
|
|
118
|
-
// the blocks we are importing.
|
|
119
|
-
//
|
|
120
|
-
// Or in other words if
|
|
121
|
-
// - block status is syncing
|
|
122
|
-
// - and we are not in a post merge world and is parent is not optimistically safe
|
|
123
|
-
// - and we are syncing close to the chain head i.e. clock slot
|
|
124
|
-
// - and parent is optimistically safe
|
|
125
|
-
//
|
|
126
|
-
// then throw error
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
// - if we haven't yet imported a post merge ancestor in forkchoice i.e.
|
|
130
|
-
// - and we are syncing close to the clockSlot, i.e. merge Transition could be underway
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
// 2. The current slot (as per the system clock) is at least
|
|
134
|
-
// SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY ahead of the slot of the block being
|
|
135
|
-
// imported.
|
|
136
|
-
// This means that the merge transition could be underway and we can't afford to import
|
|
137
|
-
// a block which is not fully validated as it could affect liveliness of the network.
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
// For this segment of blocks:
|
|
141
|
-
// We are optimistically safe with respect to this entire block segment if:
|
|
142
|
-
// - all the blocks are way behind the current slot
|
|
143
|
-
// - or we have already imported a post-merge parent of first block of this chain in forkchoice
|
|
144
|
-
const currentSlot = chain.clock.currentSlot;
|
|
145
|
-
const safeSlotsToImportOptimistically = opts.safeSlotsToImportOptimistically ?? SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY;
|
|
146
|
-
let isOptimisticallySafe =
|
|
147
|
-
parentBlock.executionStatus !== ExecutionStatus.PreMerge ||
|
|
148
|
-
lastBlock.slot + safeSlotsToImportOptimistically < currentSlot;
|
|
149
|
-
|
|
150
96
|
for (let blockIndex = 0; blockIndex < blockInputs.length; blockIndex++) {
|
|
151
97
|
const blockInput = blockInputs[blockIndex];
|
|
152
98
|
// If blocks are invalid in consensus the main promise could resolve before this loop ends.
|
|
@@ -154,14 +100,7 @@ export async function verifyBlocksExecutionPayload(
|
|
|
154
100
|
if (signal.aborted) {
|
|
155
101
|
throw new ErrorAborted("verifyBlockExecutionPayloads");
|
|
156
102
|
}
|
|
157
|
-
const verifyResponse = await verifyBlockExecutionPayload(
|
|
158
|
-
chain,
|
|
159
|
-
blockInput,
|
|
160
|
-
preState0,
|
|
161
|
-
opts,
|
|
162
|
-
isOptimisticallySafe,
|
|
163
|
-
currentSlot
|
|
164
|
-
);
|
|
103
|
+
const verifyResponse = await verifyBlockExecutionPayload(chain, blockInput, preState0);
|
|
165
104
|
|
|
166
105
|
// If execError has happened, then we need to extract the segmentExecStatus and return
|
|
167
106
|
if (verifyResponse.execError !== null) {
|
|
@@ -170,75 +109,7 @@ export async function verifyBlocksExecutionPayload(
|
|
|
170
109
|
|
|
171
110
|
// If we are here then its because executionStatus is one of MaybeValidExecutionStatus
|
|
172
111
|
const {executionStatus} = verifyResponse;
|
|
173
|
-
// It becomes optimistically safe for following blocks if a post-merge block is deemed fit
|
|
174
|
-
// for import. If it would not have been safe verifyBlockExecutionPayload would have
|
|
175
|
-
// returned execError and loop would have been aborted
|
|
176
|
-
if (executionStatus !== ExecutionStatus.PreMerge) {
|
|
177
|
-
isOptimisticallySafe = true;
|
|
178
|
-
}
|
|
179
112
|
executionStatuses.push(executionStatus);
|
|
180
|
-
|
|
181
|
-
const blockBody = blockInput.getBlock().message.body;
|
|
182
|
-
const isMergeTransitionBlock =
|
|
183
|
-
// If the merge block is found, stop the search as the isMergeTransitionBlockFn condition
|
|
184
|
-
// will still evaluate to true for the following blocks leading to errors (while syncing)
|
|
185
|
-
// as the preState0 still belongs to the pre state of the first block on segment
|
|
186
|
-
mergeBlockFound === null &&
|
|
187
|
-
isExecutionStateType(preState0) &&
|
|
188
|
-
isExecutionBlockBodyType(blockBody) &&
|
|
189
|
-
isMergeTransitionBlockFn(preState0, blockBody);
|
|
190
|
-
|
|
191
|
-
// If this is a merge transition block, check to ensure if it references
|
|
192
|
-
// a valid terminal PoW block.
|
|
193
|
-
//
|
|
194
|
-
// However specs define this check to be run inside forkChoice's onBlock
|
|
195
|
-
// (https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/fork-choice.md#on_block)
|
|
196
|
-
// but we perform the check here (as inspired from the lighthouse impl)
|
|
197
|
-
//
|
|
198
|
-
// Reasons:
|
|
199
|
-
// 1. If the block is not valid, we should fail early and not wait till
|
|
200
|
-
// forkChoice import.
|
|
201
|
-
// 2. It makes logical sense to pair it with the block validations and
|
|
202
|
-
// deal it with the external services like eth1 tracker here than
|
|
203
|
-
// in import block
|
|
204
|
-
if (isMergeTransitionBlock) {
|
|
205
|
-
const mergeBlock = blockInput.getBlock().message as bellatrix.BeaconBlock;
|
|
206
|
-
const mergeBlockHash = toRootHex(chain.config.getForkTypes(mergeBlock.slot).BeaconBlock.hashTreeRoot(mergeBlock));
|
|
207
|
-
const powBlockRootHex = toRootHex(mergeBlock.body.executionPayload.parentHash);
|
|
208
|
-
const powBlock = await chain.eth1.getPowBlock(powBlockRootHex).catch((error) => {
|
|
209
|
-
// Lets just warn the user here, errors if any will be reported on
|
|
210
|
-
// `assertValidTerminalPowBlock` checks
|
|
211
|
-
chain.logger.warn(
|
|
212
|
-
"Error fetching terminal PoW block referred in the merge transition block",
|
|
213
|
-
{powBlockHash: powBlockRootHex, mergeBlockHash},
|
|
214
|
-
error
|
|
215
|
-
);
|
|
216
|
-
return null;
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
const powBlockParent =
|
|
220
|
-
powBlock &&
|
|
221
|
-
(await chain.eth1.getPowBlock(powBlock.parentHash).catch((error) => {
|
|
222
|
-
// Lets just warn the user here, errors if any will be reported on
|
|
223
|
-
// `assertValidTerminalPowBlock` checks
|
|
224
|
-
chain.logger.warn(
|
|
225
|
-
"Error fetching parent of the terminal PoW block referred in the merge transition block",
|
|
226
|
-
{powBlockParentHash: powBlock.parentHash, powBlock: powBlockRootHex, mergeBlockHash},
|
|
227
|
-
error
|
|
228
|
-
);
|
|
229
|
-
return null;
|
|
230
|
-
}));
|
|
231
|
-
|
|
232
|
-
// executionStatus will never == ExecutionStatus.PreMerge if it's the mergeBlock. But gotta make TS happy =D
|
|
233
|
-
if (executionStatus === ExecutionStatus.PreMerge) {
|
|
234
|
-
throw Error("Merge block must not have executionStatus == PreMerge");
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
assertValidTerminalPowBlock(chain.config, mergeBlock, {executionStatus, powBlock, powBlockParent});
|
|
238
|
-
// Valid execution payload, but may not be in a valid beacon chain block. Delay printing the POS ACTIVATED banner
|
|
239
|
-
// to the end of the verify block routine, which confirms that this block is fully valid.
|
|
240
|
-
mergeBlockFound = mergeBlock;
|
|
241
|
-
}
|
|
242
113
|
}
|
|
243
114
|
|
|
244
115
|
const executionTime = Date.now();
|
|
@@ -265,7 +136,6 @@ export async function verifyBlocksExecutionPayload(
|
|
|
265
136
|
execAborted: null,
|
|
266
137
|
executionStatuses,
|
|
267
138
|
executionTime,
|
|
268
|
-
mergeBlockFound,
|
|
269
139
|
};
|
|
270
140
|
}
|
|
271
141
|
|
|
@@ -275,28 +145,20 @@ export async function verifyBlocksExecutionPayload(
|
|
|
275
145
|
export async function verifyBlockExecutionPayload(
|
|
276
146
|
chain: VerifyBlockExecutionPayloadModules,
|
|
277
147
|
blockInput: IBlockInput,
|
|
278
|
-
preState0: CachedBeaconStateAllForks
|
|
279
|
-
opts: BlockProcessOpts,
|
|
280
|
-
isOptimisticallySafe: boolean,
|
|
281
|
-
currentSlot: Slot
|
|
148
|
+
preState0: CachedBeaconStateAllForks
|
|
282
149
|
): Promise<VerifyBlockExecutionResponse> {
|
|
283
150
|
const block = blockInput.getBlock();
|
|
284
151
|
/** Not null if execution is enabled */
|
|
285
152
|
const executionPayloadEnabled =
|
|
286
153
|
isExecutionStateType(preState0) &&
|
|
287
154
|
isExecutionBlockBodyType(block.message.body) &&
|
|
288
|
-
// Safe to use with a state previous to block's preState. isMergeComplete can only transition from false to true.
|
|
289
|
-
// - If preState0 is after merge block: condition is true, and will always be true
|
|
290
|
-
// - If preState0 is before merge block: the block could lie but then state transition function will throw above
|
|
291
|
-
// It is kinda safe to send non-trusted payloads to the execution client because at most it can trigger sync.
|
|
292
|
-
// TODO: If this becomes a problem, do some basic verification beforehand, like checking the proposer signature.
|
|
293
155
|
isExecutionEnabled(preState0, block.message)
|
|
294
156
|
? block.message.body.executionPayload
|
|
295
157
|
: null;
|
|
296
158
|
|
|
297
159
|
if (!executionPayloadEnabled) {
|
|
298
|
-
//
|
|
299
|
-
return {executionStatus: ExecutionStatus.PreMerge, execError: null}
|
|
160
|
+
// Pre-merge block, no execution payload to verify
|
|
161
|
+
return {executionStatus: ExecutionStatus.PreMerge, lvhResponse: undefined, execError: null};
|
|
300
162
|
}
|
|
301
163
|
|
|
302
164
|
// TODO: Handle better notifyNewPayload() returning error is syncing
|
|
@@ -343,24 +205,10 @@ export async function verifyBlockExecutionPayload(
|
|
|
343
205
|
}
|
|
344
206
|
|
|
345
207
|
// Accepted and Syncing have the same treatment, as final validation of block is pending
|
|
208
|
+
// Post-merge, we're always safe to optimistically import
|
|
346
209
|
case ExecutionPayloadStatus.ACCEPTED:
|
|
347
|
-
case ExecutionPayloadStatus.SYNCING:
|
|
348
|
-
// Check if the entire segment was deemed safe or, this block specifically itself if not in
|
|
349
|
-
// the safeSlotsToImportOptimistically window of current slot, then we can import else
|
|
350
|
-
// we need to throw and not import his block
|
|
351
|
-
const safeSlotsToImportOptimistically =
|
|
352
|
-
opts.safeSlotsToImportOptimistically ?? SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY;
|
|
353
|
-
if (!isOptimisticallySafe && blockInput.slot + safeSlotsToImportOptimistically >= currentSlot) {
|
|
354
|
-
const execError = new BlockError(block, {
|
|
355
|
-
code: BlockErrorCode.EXECUTION_ENGINE_ERROR,
|
|
356
|
-
execStatus: ExecutionPayloadStatus.UNSAFE_OPTIMISTIC_STATUS,
|
|
357
|
-
errorMessage: `not safe to import ${execResult.status} payload within ${opts.safeSlotsToImportOptimistically} of currentSlot`,
|
|
358
|
-
});
|
|
359
|
-
return {executionStatus: null, execError} as VerifyBlockExecutionResponse;
|
|
360
|
-
}
|
|
361
|
-
|
|
210
|
+
case ExecutionPayloadStatus.SYNCING:
|
|
362
211
|
return {executionStatus: ExecutionStatus.Syncing, execError: null};
|
|
363
|
-
}
|
|
364
212
|
|
|
365
213
|
// If the block has is not valid, or it referenced an invalid terminal block then the
|
|
366
214
|
// block is invalid, however it has no bearing on any forkChoice cleanup
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {BeaconConfig} from "@lodestar/config";
|
|
2
|
+
import {CachedBeaconStateAllForks, Index2PubkeyCache, getBlockSignatureSets} from "@lodestar/state-transition";
|
|
2
3
|
import {IndexedAttestation, SignedBeaconBlock} from "@lodestar/types";
|
|
3
4
|
import {Logger} from "@lodestar/utils";
|
|
4
5
|
import {Metrics} from "../../metrics/metrics.js";
|
|
@@ -15,6 +16,8 @@ import {ImportBlockOpts} from "./types.js";
|
|
|
15
16
|
* Since all data is known in advance all signatures are verified at once in parallel.
|
|
16
17
|
*/
|
|
17
18
|
export async function verifyBlocksSignatures(
|
|
19
|
+
config: BeaconConfig,
|
|
20
|
+
index2pubkey: Index2PubkeyCache,
|
|
18
21
|
bls: IBlsVerifier,
|
|
19
22
|
logger: Logger,
|
|
20
23
|
metrics: Metrics | null,
|
|
@@ -25,6 +28,7 @@ export async function verifyBlocksSignatures(
|
|
|
25
28
|
): Promise<{verifySignaturesTime: number}> {
|
|
26
29
|
const isValidPromises: Promise<boolean>[] = [];
|
|
27
30
|
const recvToValLatency = Date.now() / 1000 - (opts.seenTimestampSec ?? Date.now() / 1000);
|
|
31
|
+
const currentSyncCommitteeIndexed = preState0.epochCtx.currentSyncCommitteeIndexed;
|
|
28
32
|
|
|
29
33
|
// Verifies signatures after running state transition, so all SyncCommittee signed roots are known at this point.
|
|
30
34
|
// We must ensure block.slot <= state.slot before running getAllBlockSignatureSets().
|
|
@@ -38,9 +42,16 @@ export async function verifyBlocksSignatures(
|
|
|
38
42
|
: //
|
|
39
43
|
// Verify signatures per block to track which block is invalid
|
|
40
44
|
bls.verifySignatureSets(
|
|
41
|
-
getBlockSignatureSets(
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
getBlockSignatureSets(
|
|
46
|
+
config,
|
|
47
|
+
index2pubkey,
|
|
48
|
+
currentSyncCommitteeIndexed,
|
|
49
|
+
block,
|
|
50
|
+
indexedAttestationsByBlock[i],
|
|
51
|
+
{
|
|
52
|
+
skipProposerSignature: opts.validProposerSignature,
|
|
53
|
+
}
|
|
54
|
+
)
|
|
44
55
|
);
|
|
45
56
|
|
|
46
57
|
// getBlockSignatureSets() takes 45ms in benchmarks for 2022Q2 mainnet blocks (100 sigs). When syncing a 32 blocks
|
package/src/chain/chain.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {PrivateKey} from "@libp2p/interface";
|
|
|
3
3
|
import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
|
|
4
4
|
import {CompositeTypeAny, TreeView, Type} from "@chainsafe/ssz";
|
|
5
5
|
import {BeaconConfig} from "@lodestar/config";
|
|
6
|
-
import {CheckpointWithHex,
|
|
6
|
+
import {CheckpointWithHex, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
|
|
7
7
|
import {LoggerNode} from "@lodestar/logger/node";
|
|
8
8
|
import {EFFECTIVE_BALANCE_INCREMENT, GENESIS_SLOT, SLOTS_PER_EPOCH, isForkPostElectra} from "@lodestar/params";
|
|
9
9
|
import {
|
|
@@ -17,10 +17,8 @@ import {
|
|
|
17
17
|
computeEndSlotAtEpoch,
|
|
18
18
|
computeEpochAtSlot,
|
|
19
19
|
computeStartSlotAtEpoch,
|
|
20
|
-
createCachedBeaconState,
|
|
21
20
|
getEffectiveBalanceIncrementsZeroInactive,
|
|
22
21
|
getEffectiveBalancesFromStateBytes,
|
|
23
|
-
isCachedBeaconState,
|
|
24
22
|
processSlots,
|
|
25
23
|
} from "@lodestar/state-transition";
|
|
26
24
|
import {
|
|
@@ -43,7 +41,6 @@ import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRoot
|
|
|
43
41
|
import {ProcessShutdownCallback} from "@lodestar/validator";
|
|
44
42
|
import {GENESIS_EPOCH, ZERO_HASH} from "../constants/index.js";
|
|
45
43
|
import {IBeaconDb} from "../db/index.js";
|
|
46
|
-
import {IEth1ForBlockProduction} from "../eth1/index.js";
|
|
47
44
|
import {BuilderStatus} from "../execution/builder/http.js";
|
|
48
45
|
import {IExecutionBuilder, IExecutionEngine} from "../execution/index.js";
|
|
49
46
|
import {Metrics} from "../metrics/index.js";
|
|
@@ -117,7 +114,6 @@ const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
|
|
|
117
114
|
export class BeaconChain implements IBeaconChain {
|
|
118
115
|
readonly genesisTime: UintNum64;
|
|
119
116
|
readonly genesisValidatorsRoot: Root;
|
|
120
|
-
readonly eth1: IEth1ForBlockProduction;
|
|
121
117
|
readonly executionEngine: IExecutionEngine;
|
|
122
118
|
readonly executionBuilder?: IExecutionBuilder;
|
|
123
119
|
// Expose config for convenience in modularized functions
|
|
@@ -144,7 +140,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
144
140
|
readonly aggregatedAttestationPool: AggregatedAttestationPool;
|
|
145
141
|
readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
|
|
146
142
|
readonly syncContributionAndProofPool;
|
|
147
|
-
readonly opPool
|
|
143
|
+
readonly opPool: OpPool;
|
|
148
144
|
|
|
149
145
|
// Gossip seen cache
|
|
150
146
|
readonly seenAttesters = new SeenAttesters();
|
|
@@ -206,6 +202,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
206
202
|
{
|
|
207
203
|
privateKey,
|
|
208
204
|
config,
|
|
205
|
+
pubkey2index,
|
|
206
|
+
index2pubkey,
|
|
209
207
|
db,
|
|
210
208
|
dbName,
|
|
211
209
|
dataDir,
|
|
@@ -216,12 +214,13 @@ export class BeaconChain implements IBeaconChain {
|
|
|
216
214
|
validatorMonitor,
|
|
217
215
|
anchorState,
|
|
218
216
|
isAnchorStateFinalized,
|
|
219
|
-
eth1,
|
|
220
217
|
executionEngine,
|
|
221
218
|
executionBuilder,
|
|
222
219
|
}: {
|
|
223
220
|
privateKey: PrivateKey;
|
|
224
221
|
config: BeaconConfig;
|
|
222
|
+
pubkey2index: PubkeyIndexMap;
|
|
223
|
+
index2pubkey: Index2PubkeyCache;
|
|
225
224
|
db: IBeaconDb;
|
|
226
225
|
dbName: string;
|
|
227
226
|
dataDir: string;
|
|
@@ -231,9 +230,8 @@ export class BeaconChain implements IBeaconChain {
|
|
|
231
230
|
clock?: IClock;
|
|
232
231
|
metrics: Metrics | null;
|
|
233
232
|
validatorMonitor: ValidatorMonitor | null;
|
|
234
|
-
anchorState:
|
|
233
|
+
anchorState: CachedBeaconStateAllForks;
|
|
235
234
|
isAnchorStateFinalized: boolean;
|
|
236
|
-
eth1: IEth1ForBlockProduction;
|
|
237
235
|
executionEngine: IExecutionEngine;
|
|
238
236
|
executionBuilder?: IExecutionBuilder;
|
|
239
237
|
}
|
|
@@ -248,7 +246,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
248
246
|
this.genesisTime = anchorState.genesisTime;
|
|
249
247
|
this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
|
|
250
248
|
this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
|
|
251
|
-
this.eth1 = eth1;
|
|
252
249
|
this.executionEngine = executionEngine;
|
|
253
250
|
this.executionBuilder = executionBuilder;
|
|
254
251
|
const signal = this.abortController.signal;
|
|
@@ -265,6 +262,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
265
262
|
this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
|
|
266
263
|
this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
|
|
267
264
|
this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
|
|
265
|
+
this.opPool = new OpPool(config);
|
|
268
266
|
|
|
269
267
|
this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
|
|
270
268
|
this.seenContributionAndProof = new SeenContributionAndProof(metrics);
|
|
@@ -291,39 +289,25 @@ export class BeaconChain implements IBeaconChain {
|
|
|
291
289
|
logger,
|
|
292
290
|
});
|
|
293
291
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
// pubkeys takes ~30 seconds for 350k keys (mainnet 2022Q2).
|
|
297
|
-
// When the BeaconStateCache is created in eth1 genesis builder it may be incorrect. Until we can ensure that
|
|
298
|
-
// it's safe to re-use _ANY_ BeaconStateCache, this option is disabled by default and only used in tests.
|
|
299
|
-
const cachedState =
|
|
300
|
-
isCachedBeaconState(anchorState) && opts.skipCreateStateCacheIfAvailable
|
|
301
|
-
? anchorState
|
|
302
|
-
: createCachedBeaconState(anchorState, {
|
|
303
|
-
config,
|
|
304
|
-
pubkey2index: new PubkeyIndexMap(),
|
|
305
|
-
index2pubkey: [],
|
|
306
|
-
});
|
|
307
|
-
this._earliestAvailableSlot = cachedState.slot;
|
|
308
|
-
|
|
309
|
-
this.shufflingCache = cachedState.epochCtx.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
|
|
292
|
+
this._earliestAvailableSlot = anchorState.slot;
|
|
293
|
+
this.shufflingCache = anchorState.epochCtx.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
|
|
310
294
|
{
|
|
311
|
-
shuffling:
|
|
312
|
-
decisionRoot:
|
|
295
|
+
shuffling: anchorState.epochCtx.previousShuffling,
|
|
296
|
+
decisionRoot: anchorState.epochCtx.previousDecisionRoot,
|
|
313
297
|
},
|
|
314
298
|
{
|
|
315
|
-
shuffling:
|
|
316
|
-
decisionRoot:
|
|
299
|
+
shuffling: anchorState.epochCtx.currentShuffling,
|
|
300
|
+
decisionRoot: anchorState.epochCtx.currentDecisionRoot,
|
|
317
301
|
},
|
|
318
302
|
{
|
|
319
|
-
shuffling:
|
|
320
|
-
decisionRoot:
|
|
303
|
+
shuffling: anchorState.epochCtx.nextShuffling,
|
|
304
|
+
decisionRoot: anchorState.epochCtx.nextDecisionRoot,
|
|
321
305
|
},
|
|
322
306
|
]);
|
|
323
307
|
|
|
324
|
-
//
|
|
325
|
-
this.pubkey2index =
|
|
326
|
-
this.index2pubkey =
|
|
308
|
+
// Global cache of validators pubkey/index mapping
|
|
309
|
+
this.pubkey2index = pubkey2index;
|
|
310
|
+
this.index2pubkey = index2pubkey;
|
|
327
311
|
|
|
328
312
|
const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
|
|
329
313
|
const blockStateCache = this.opts.nHistoricalStates
|
|
@@ -339,6 +323,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
339
323
|
this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
|
|
340
324
|
checkpointStateCache = new PersistentCheckpointStateCache(
|
|
341
325
|
{
|
|
326
|
+
config,
|
|
342
327
|
metrics,
|
|
343
328
|
logger,
|
|
344
329
|
clock,
|
|
@@ -353,15 +338,15 @@ export class BeaconChain implements IBeaconChain {
|
|
|
353
338
|
}
|
|
354
339
|
|
|
355
340
|
const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
|
|
356
|
-
blockStateCache.add(
|
|
357
|
-
blockStateCache.setHeadState(
|
|
358
|
-
checkpointStateCache.add(checkpoint,
|
|
341
|
+
blockStateCache.add(anchorState);
|
|
342
|
+
blockStateCache.setHeadState(anchorState);
|
|
343
|
+
checkpointStateCache.add(checkpoint, anchorState);
|
|
359
344
|
|
|
360
345
|
const forkChoice = initializeForkChoice(
|
|
361
346
|
config,
|
|
362
347
|
emitter,
|
|
363
348
|
clock.currentSlot,
|
|
364
|
-
|
|
349
|
+
anchorState,
|
|
365
350
|
isAnchorStateFinalized,
|
|
366
351
|
opts,
|
|
367
352
|
this.justifiedBalancesGetter.bind(this),
|
|
@@ -417,15 +402,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
417
402
|
signal
|
|
418
403
|
);
|
|
419
404
|
|
|
420
|
-
// Stop polling eth1 data if anchor state is in Electra AND deposit_requests_start_index is reached
|
|
421
|
-
const anchorStateFork = this.config.getForkName(anchorState.slot);
|
|
422
|
-
if (isForkPostElectra(anchorStateFork)) {
|
|
423
|
-
const {eth1DepositIndex, depositRequestsStartIndex} = anchorState as BeaconStateElectra;
|
|
424
|
-
if (eth1DepositIndex === Number(depositRequestsStartIndex)) {
|
|
425
|
-
this.eth1.stopPollingEth1Data();
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
405
|
// always run PrepareNextSlotScheduler except for fork_choice spec tests
|
|
430
406
|
if (!opts?.disablePrepareNextSlot) {
|
|
431
407
|
new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
|
|
@@ -757,7 +733,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
757
733
|
RegenCaller.produceBlock
|
|
758
734
|
);
|
|
759
735
|
const proposerIndex = state.epochCtx.getBeaconProposer(slot);
|
|
760
|
-
const proposerPubKey =
|
|
736
|
+
const proposerPubKey = this.index2pubkey[proposerIndex].toBytes();
|
|
761
737
|
|
|
762
738
|
const {body, produceResult, executionPayloadValue, shouldOverrideBuilder} = await produceBlockBody.call(
|
|
763
739
|
this,
|
|
@@ -1177,17 +1153,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1177
1153
|
this.seenAggregatedAttestations.prune(epoch);
|
|
1178
1154
|
this.seenBlockAttesters.prune(epoch);
|
|
1179
1155
|
this.beaconProposerCache.prune(epoch);
|
|
1180
|
-
|
|
1181
|
-
// Poll for merge block in the background to speed-up block production. Only if:
|
|
1182
|
-
// - after BELLATRIX_FORK_EPOCH
|
|
1183
|
-
// - Beacon node synced
|
|
1184
|
-
// - head state not isMergeTransitionComplete
|
|
1185
|
-
if (this.config.BELLATRIX_FORK_EPOCH - epoch < 1) {
|
|
1186
|
-
const head = this.forkChoice.getHead();
|
|
1187
|
-
if (epoch - computeEpochAtSlot(head.slot) < 5 && head.executionStatus === ExecutionStatus.PreMerge) {
|
|
1188
|
-
this.eth1.startPollingMergeBlock();
|
|
1189
|
-
}
|
|
1190
|
-
}
|
|
1191
1156
|
}
|
|
1192
1157
|
|
|
1193
1158
|
protected onNewHead(head: ProtoBlock): void {
|
|
@@ -1331,7 +1296,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1331
1296
|
|
|
1332
1297
|
const postState = this.regen.getStateSync(toRootHex(block.stateRoot)) ?? undefined;
|
|
1333
1298
|
|
|
1334
|
-
return computeBlockRewards(block, preState.clone(), postState?.clone());
|
|
1299
|
+
return computeBlockRewards(this.config, block, preState.clone(), postState?.clone());
|
|
1335
1300
|
}
|
|
1336
1301
|
|
|
1337
1302
|
async getAttestationsRewards(
|
|
@@ -1355,7 +1320,7 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1355
1320
|
throw Error(`State is not in cache for slot ${slot}`);
|
|
1356
1321
|
}
|
|
1357
1322
|
|
|
1358
|
-
const rewards = await computeAttestationsRewards(
|
|
1323
|
+
const rewards = await computeAttestationsRewards(this.config, this.pubkey2index, cachedState, validatorIds);
|
|
1359
1324
|
|
|
1360
1325
|
return {rewards, executionOptimistic, finalized};
|
|
1361
1326
|
}
|
|
@@ -1372,6 +1337,6 @@ export class BeaconChain implements IBeaconChain {
|
|
|
1372
1337
|
|
|
1373
1338
|
preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
|
|
1374
1339
|
|
|
1375
|
-
return computeSyncCommitteeRewards(block, preState.clone(), validatorIds);
|
|
1340
|
+
return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState.clone(), validatorIds);
|
|
1376
1341
|
}
|
|
1377
1342
|
}
|