@lodestar/beacon-node 1.43.0-dev.ade910fc78 → 1.43.0-dev.b05ea98d04
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 +17 -9
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +45 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -2
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts.map +1 -1
- package/lib/api/impl/debug/index.js +0 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/lodestar/index.js +1 -1
- 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 +68 -5
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts +1 -1
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +1 -2
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/archiveStore/interface.d.ts +4 -4
- package/lib/chain/archiveStore/interface.d.ts.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +2 -4
- package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
- package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
- package/lib/chain/blocks/blockInput/blockInput.js +4 -1
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +34 -54
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +28 -14
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +89 -89
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts +5 -3
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +59 -26
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +7 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +29 -2
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +7 -5
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +16 -21
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/utils/chainSegment.d.ts +23 -2
- package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
- package/lib/chain/blocks/utils/chainSegment.js +89 -12
- package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
- package/lib/chain/blocks/verifyBlock.d.ts +5 -3
- package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlock.js +50 -7
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
- package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
- package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +79 -0
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +30 -0
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +8 -6
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +43 -43
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +16 -15
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +5 -4
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/attestationError.d.ts +8 -1
- package/lib/chain/errors/attestationError.d.ts.map +1 -1
- package/lib/chain/errors/attestationError.js +4 -0
- package/lib/chain/errors/attestationError.js.map +1 -1
- package/lib/chain/errors/blockError.d.ts +8 -1
- package/lib/chain/errors/blockError.d.ts.map +1 -1
- package/lib/chain/errors/blockError.js +2 -0
- package/lib/chain/errors/blockError.js.map +1 -1
- package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
- package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadBid.js +1 -0
- package/lib/chain/errors/executionPayloadBid.js.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
- package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.d.ts.map +1 -1
- package/lib/chain/errors/index.js +1 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/errors/proposerPreferences.d.ts +40 -0
- package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
- package/lib/chain/errors/proposerPreferences.js +14 -0
- package/lib/chain/errors/proposerPreferences.js.map +1 -0
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +11 -15
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/initState.d.ts.map +1 -1
- package/lib/chain/initState.js +6 -1
- package/lib/chain/initState.js.map +1 -1
- package/lib/chain/interface.d.ts +7 -5
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts +3 -2
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +26 -4
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +47 -23
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts +3 -9
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +5 -32
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +13 -8
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +68 -25
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/errors.d.ts +1 -11
- package/lib/chain/regen/errors.d.ts.map +1 -1
- package/lib/chain/regen/errors.js +0 -2
- package/lib/chain/regen/errors.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +7 -11
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +1 -0
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/regen/queued.d.ts +6 -10
- package/lib/chain/regen/queued.d.ts.map +1 -1
- package/lib/chain/regen/queued.js +4 -14
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts +0 -5
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +1 -12
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/seenCache/index.d.ts +1 -0
- package/lib/chain/seenCache/index.d.ts.map +1 -1
- package/lib/chain/seenCache/index.js +1 -0
- package/lib/chain/seenCache/index.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +22 -6
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +53 -17
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
- package/lib/chain/seenCache/seenProposerPreferences.d.ts +16 -0
- package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
- package/lib/chain/seenCache/seenProposerPreferences.js +26 -0
- package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +1 -7
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -9
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/stateCache/types.d.ts +0 -6
- package/lib/chain/stateCache/types.d.ts.map +1 -1
- package/lib/chain/stateCache/types.js.map +1 -1
- package/lib/chain/validation/aggregateAndProof.js +12 -0
- package/lib/chain/validation/aggregateAndProof.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts.map +1 -1
- package/lib/chain/validation/attestation.js +12 -0
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/chain/validation/block.d.ts.map +1 -1
- package/lib/chain/validation/block.js +1 -0
- package/lib/chain/validation/block.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +24 -9
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +21 -11
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
- package/lib/chain/validation/payloadAttestationMessage.js +4 -3
- package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
- package/lib/chain/validation/proposerPreferences.d.ts +8 -0
- package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
- package/lib/chain/validation/proposerPreferences.js +91 -0
- package/lib/chain/validation/proposerPreferences.js.map +1 -0
- package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
- package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
- package/lib/execution/engine/http.d.ts.map +1 -1
- package/lib/execution/engine/http.js +21 -14
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +1 -0
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/mock.d.ts.map +1 -1
- package/lib/execution/engine/mock.js +6 -0
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +20 -0
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +18 -0
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +1 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +4 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +7 -1
- package/lib/network/gossip/interface.d.ts.map +1 -1
- package/lib/network/gossip/interface.js +1 -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 +12 -1
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +13 -2
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/gossip/topic.js +6 -0
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +1 -0
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/network.d.ts +1 -0
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +6 -1
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +60 -22
- 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 +5 -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 +6 -5
- 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 +14 -6
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
- package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +6 -4
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/constants.d.ts +3 -1
- package/lib/sync/constants.d.ts.map +1 -1
- package/lib/sync/constants.js +3 -4
- package/lib/sync/constants.js.map +1 -1
- package/lib/sync/range/batch.d.ts +28 -2
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +146 -44
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +12 -2
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +53 -9
- 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 +17 -6
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/types.d.ts +34 -0
- package/lib/sync/types.d.ts.map +1 -1
- package/lib/sync/types.js +34 -0
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +22 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +604 -53
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +46 -10
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +162 -24
- package/lib/sync/utils/downloadByRange.js.map +1 -1
- package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRoot.js +16 -2
- package/lib/sync/utils/downloadByRoot.js.map +1 -1
- package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
- package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
- package/lib/sync/utils/pendingBlocksTree.js +0 -9
- package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +20 -5
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +17 -16
- package/src/api/impl/beacon/blocks/index.ts +22 -9
- package/src/api/impl/beacon/pool/index.ts +83 -1
- package/src/api/impl/beacon/state/utils.ts +2 -2
- package/src/api/impl/debug/index.ts +0 -1
- package/src/api/impl/lodestar/index.ts +1 -1
- package/src/api/impl/validator/index.ts +84 -6
- package/src/chain/GetBlobsTracker.ts +1 -2
- package/src/chain/archiveStore/archiveStore.ts +5 -5
- package/src/chain/archiveStore/interface.ts +4 -4
- package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +6 -8
- package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
- package/src/chain/blocks/blockInput/blockInput.ts +4 -1
- package/src/chain/blocks/importBlock.ts +34 -79
- package/src/chain/blocks/importExecutionPayload.ts +110 -102
- package/src/chain/blocks/index.ts +74 -24
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +37 -2
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +1 -0
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +7 -6
- package/src/chain/blocks/types.ts +16 -26
- package/src/chain/blocks/utils/chainSegment.ts +114 -17
- package/src/chain/blocks/verifyBlock.ts +70 -9
- package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
- package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
- package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +134 -0
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +41 -0
- package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
- package/src/chain/chain.ts +61 -58
- package/src/chain/emitter.ts +15 -14
- package/src/chain/errors/attestationError.ts +6 -1
- package/src/chain/errors/blockError.ts +4 -1
- package/src/chain/errors/executionPayloadBid.ts +6 -0
- package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
- package/src/chain/errors/index.ts +1 -0
- package/src/chain/errors/proposerPreferences.ts +47 -0
- package/src/chain/forkChoice/index.ts +8 -20
- package/src/chain/initState.ts +9 -1
- package/src/chain/interface.ts +11 -3
- package/src/chain/opPools/payloadAttestationPool.ts +29 -8
- package/src/chain/prepareNextSlot.ts +55 -24
- package/src/chain/produceBlock/computeNewStateRoot.ts +6 -43
- package/src/chain/produceBlock/produceBlockBody.ts +91 -27
- package/src/chain/regen/errors.ts +1 -6
- package/src/chain/regen/interface.ts +7 -11
- package/src/chain/regen/queued.ts +8 -21
- package/src/chain/regen/regen.ts +2 -15
- package/src/chain/seenCache/index.ts +1 -0
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +71 -20
- package/src/chain/seenCache/seenProposerPreferences.ts +32 -0
- package/src/chain/stateCache/persistentCheckpointsCache.ts +5 -15
- package/src/chain/stateCache/types.ts +0 -3
- package/src/chain/validation/aggregateAndProof.ts +13 -0
- package/src/chain/validation/attestation.ts +13 -0
- package/src/chain/validation/block.ts +1 -0
- package/src/chain/validation/executionPayloadBid.ts +25 -8
- package/src/chain/validation/executionPayloadEnvelope.ts +22 -12
- package/src/chain/validation/payloadAttestationMessage.ts +5 -3
- package/src/chain/validation/proposerPreferences.ts +110 -0
- package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
- package/src/execution/engine/http.ts +21 -14
- package/src/execution/engine/interface.ts +1 -0
- package/src/execution/engine/mock.ts +8 -1
- package/src/execution/engine/types.ts +41 -0
- package/src/metrics/metrics/lodestar.ts +4 -0
- package/src/network/gossip/interface.ts +6 -0
- package/src/network/gossip/scoringParameters.ts +14 -1
- package/src/network/gossip/topic.ts +6 -0
- package/src/network/interface.ts +1 -0
- package/src/network/network.ts +12 -1
- package/src/network/processor/gossipHandlers.ts +79 -27
- package/src/network/processor/gossipQueues/index.ts +5 -0
- package/src/network/processor/index.ts +6 -5
- package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
- package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
- package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
- package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
- package/src/node/nodejs.ts +6 -4
- package/src/sync/constants.ts +4 -4
- package/src/sync/range/batch.ts +204 -49
- package/src/sync/range/chain.ts +69 -11
- package/src/sync/range/range.ts +18 -6
- package/src/sync/types.ts +72 -0
- package/src/sync/unknownBlock.ts +762 -57
- package/src/sync/utils/downloadByRange.ts +272 -39
- package/src/sync/utils/downloadByRoot.ts +24 -2
- package/src/sync/utils/pendingBlocksTree.ts +0 -15
- package/src/util/sszBytes.ts +25 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { routes } from "@lodestar/api";
|
|
2
|
-
import {
|
|
2
|
+
import { getSafeExecutionBlockHash } from "@lodestar/fork-choice";
|
|
3
3
|
import { ForkSeq, SLOTS_PER_EPOCH, isForkPostBellatrix } from "@lodestar/params";
|
|
4
|
-
import { StateHashTreeRootSource, computeEpochAtSlot, computeTimeAtSlot, isStatePostBellatrix, } from "@lodestar/state-transition";
|
|
4
|
+
import { StateHashTreeRootSource, computeEpochAtSlot, computeTimeAtSlot, isStatePostBellatrix, isStatePostGloas, } from "@lodestar/state-transition";
|
|
5
5
|
import { fromHex, isErrorAborted, sleep } from "@lodestar/utils";
|
|
6
6
|
import { GENESIS_SLOT, ZERO_HASH_HEX } from "../constants/constants.js";
|
|
7
7
|
import { BuilderStatus } from "../execution/builder/http.js";
|
|
@@ -64,6 +64,8 @@ export class PrepareNextSlotScheduler {
|
|
|
64
64
|
// calling updateHead() here before we produce a block to reduce reorg possibility
|
|
65
65
|
const headBlock = this.chain.recomputeForkChoiceHead(ForkchoiceCaller.prepareNextSlot);
|
|
66
66
|
const { slot: headSlot, blockRoot: headRoot } = headBlock;
|
|
67
|
+
// may be updated below if we predict a proposer-boost-reorg
|
|
68
|
+
let updatedHead = headBlock;
|
|
67
69
|
// PS: previously this was comparing slots, but that gave no leway on the skipped
|
|
68
70
|
// slots on epoch bounday. Making it more fluid.
|
|
69
71
|
if (prepareSlot - headSlot > PREPARE_EPOCH_LIMIT * SLOTS_PER_EPOCH) {
|
|
@@ -98,7 +100,6 @@ export class PrepareNextSlotScheduler {
|
|
|
98
100
|
const proposerIndex = prepareState.getBeaconProposer(prepareSlot);
|
|
99
101
|
const feeRecipient = this.chain.beaconProposerCache.get(proposerIndex);
|
|
100
102
|
let updatedPrepareState = prepareState;
|
|
101
|
-
let updatedHeadRoot = headRoot;
|
|
102
103
|
if (feeRecipient) {
|
|
103
104
|
// If we are proposing next slot, we need to predict if we can proposer-boost-reorg or not
|
|
104
105
|
const proposerHead = this.chain.predictProposerHead(clockSlot);
|
|
@@ -115,7 +116,7 @@ export class PrepareNextSlotScheduler {
|
|
|
115
116
|
updatedPrepareState = await this.chain.regen.getBlockSlotState(proposerHead, prepareSlot,
|
|
116
117
|
// only transfer cache if epoch transition because that's the state we will use to stateTransition() the 1st block of epoch
|
|
117
118
|
{ dontTransferCache: !isEpochTransition }, RegenCaller.predictProposerHead);
|
|
118
|
-
|
|
119
|
+
updatedHead = proposerHead;
|
|
119
120
|
}
|
|
120
121
|
// Update the builder status, if enabled shoot an api call to check status
|
|
121
122
|
this.chain.updateBuilderStatus(clockSlot);
|
|
@@ -124,38 +125,65 @@ export class PrepareNextSlotScheduler {
|
|
|
124
125
|
this.logger.error("Builder disabled as the check status api failed", { prepareSlot }, e);
|
|
125
126
|
});
|
|
126
127
|
}
|
|
128
|
+
}
|
|
129
|
+
if (!isStatePostBellatrix(updatedPrepareState)) {
|
|
130
|
+
throw new Error("Expected Bellatrix state for payload attributes");
|
|
131
|
+
}
|
|
132
|
+
let parentBlockHash;
|
|
133
|
+
// Apply parent payload once here as it's reused by EL prep and SSE emit below
|
|
134
|
+
let stateAfterParentPayload = updatedPrepareState;
|
|
135
|
+
if (isStatePostGloas(updatedPrepareState)) {
|
|
136
|
+
if (this.chain.forkChoice.shouldExtendPayload(updatedHead.blockRoot)) {
|
|
137
|
+
parentBlockHash = updatedPrepareState.latestExecutionPayloadBid.blockHash;
|
|
138
|
+
// Skip applying parent payload unless we're proposing the next slot or have to emit payload_attributes events
|
|
139
|
+
if (feeRecipient !== undefined || this.chain.opts.emitPayloadAttributes === true) {
|
|
140
|
+
const parentExecutionRequests = await this.chain.getParentExecutionRequests(updatedHead.slot, updatedHead.blockRoot);
|
|
141
|
+
stateAfterParentPayload = updatedPrepareState.withParentPayloadApplied(parentExecutionRequests);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
parentBlockHash = updatedPrepareState.latestExecutionPayloadBid.parentBlockHash;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
parentBlockHash = updatedPrepareState.latestExecutionPayloadHeader.blockHash;
|
|
150
|
+
}
|
|
151
|
+
if (feeRecipient) {
|
|
127
152
|
const preparationTime = computeTimeAtSlot(this.config, prepareSlot, this.chain.genesisTime) - Date.now() / 1000;
|
|
128
153
|
this.metrics?.blockPayload.payloadAdvancePrepTime.observe(preparationTime);
|
|
129
|
-
if (!isStatePostBellatrix(updatedPrepareState)) {
|
|
130
|
-
throw new Error("Expected Bellatrix state for payload preparation");
|
|
131
|
-
}
|
|
132
154
|
const safeBlockHash = getSafeExecutionBlockHash(this.chain.forkChoice);
|
|
133
155
|
const finalizedBlockHash = this.chain.forkChoice.getFinalizedBlock().executionPayloadBlockHash ?? ZERO_HASH_HEX;
|
|
134
156
|
// awaiting here instead of throwing an async call because there is no other task
|
|
135
|
-
// left for scheduler and this gives nice
|
|
157
|
+
// left for scheduler and this gives nice semantics to catch and log errors in the
|
|
136
158
|
// try/catch wrapper here.
|
|
137
159
|
await prepareExecutionPayload(this.chain, this.logger, fork, // State is of execution type
|
|
138
|
-
fromHex(
|
|
160
|
+
fromHex(updatedHead.blockRoot), parentBlockHash, safeBlockHash, finalizedBlockHash, stateAfterParentPayload, feeRecipient);
|
|
139
161
|
this.logger.verbose("PrepareNextSlotScheduler prepared new payload", {
|
|
140
162
|
prepareSlot,
|
|
141
163
|
proposerIndex,
|
|
142
164
|
feeRecipient,
|
|
143
165
|
});
|
|
144
166
|
}
|
|
145
|
-
if (
|
|
146
|
-
|
|
167
|
+
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
168
|
+
// Cutoff = slot of the parent of the block we'll actually build on (post-reorg).
|
|
169
|
+
// Steady state: cache holds just 2 entries — head (parent for next-slot production)
|
|
170
|
+
// and head.parent (proposer-boost-reorg fallback). Anything older is evicted.
|
|
171
|
+
const updatedHeadParent = this.chain.forkChoice.getBlockHexDefaultStatus(updatedHead.parentRoot);
|
|
172
|
+
if (updatedHeadParent) {
|
|
173
|
+
this.chain.seenPayloadEnvelopeInputCache.pruneBelowParent(updatedHeadParent);
|
|
174
|
+
}
|
|
147
175
|
}
|
|
148
176
|
this.computeStateHashTreeRoot(updatedPrepareState, isEpochTransition);
|
|
149
|
-
// If emitPayloadAttributes is true emit a SSE payloadAttributes event
|
|
150
|
-
|
|
177
|
+
// If emitPayloadAttributes is true emit a SSE payloadAttributes event for
|
|
178
|
+
// every slot. Without the flag, only emit the event if we are proposing in the next slot.
|
|
179
|
+
if ((feeRecipient || this.chain.opts.emitPayloadAttributes === true) &&
|
|
151
180
|
this.chain.emitter.listenerCount(routes.events.EventType.payloadAttributes)) {
|
|
152
181
|
const data = getPayloadAttributesForSSE(fork, this.chain, {
|
|
153
|
-
prepareState:
|
|
182
|
+
prepareState: stateAfterParentPayload,
|
|
154
183
|
prepareSlot,
|
|
155
|
-
parentBlockRoot: fromHex(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
feeRecipient: "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
184
|
+
parentBlockRoot: fromHex(updatedHead.blockRoot),
|
|
185
|
+
parentBlockHash,
|
|
186
|
+
feeRecipient: feeRecipient ?? "0x0000000000000000000000000000000000000000",
|
|
159
187
|
});
|
|
160
188
|
this.chain.emitter.emit(routes.events.EventType.payloadAttributes, { data, version: fork });
|
|
161
189
|
}
|
|
@@ -168,11 +196,7 @@ export class PrepareNextSlotScheduler {
|
|
|
168
196
|
// + if next slot is a skipped slot, it'd help getting target checkpoint state faster to validate attestations
|
|
169
197
|
if (isEpochTransition) {
|
|
170
198
|
this.metrics?.precomputeNextEpochTransition.count.inc({ result: "success" }, 1);
|
|
171
|
-
|
|
172
|
-
// Pre-Gloas: payloadStatus is always FULL → payloadPresent = true
|
|
173
|
-
// Post-Gloas: FULL → true, EMPTY → false, PENDING → false (conservative, treat as block state)
|
|
174
|
-
const payloadPresent = headBlock.payloadStatus === PayloadStatus.FULL;
|
|
175
|
-
const previousHits = this.chain.regen.updatePreComputedCheckpoint(headRoot, nextEpoch, payloadPresent);
|
|
199
|
+
const previousHits = this.chain.regen.updatePreComputedCheckpoint(headRoot, nextEpoch);
|
|
176
200
|
if (previousHits === 0) {
|
|
177
201
|
this.metrics?.precomputeNextEpochTransition.waste.inc();
|
|
178
202
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareNextSlot.js","sourceRoot":"","sources":["../../src/chain/prepareNextSlot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAErC,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"prepareNextSlot.js","sourceRoot":"","sources":["../../src/chain/prepareNextSlot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAErC,OAAO,EAAC,yBAAyB,EAAC,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAoB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAClG,OAAO,EAGL,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAS,OAAO,EAAE,cAAc,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAC,0BAA0B,EAAE,uBAAuB,EAAC,MAAM,oCAAoC,CAAC;AACvG,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,sCAAsC;AACtC,6GAA6G;AAC7G,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,yDAAyD;AACzD,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B;;;;;;;;;;GAUG;AACH,MAAM,OAAO,wBAAwB;IAEhB,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IALzB,YACmB,KAAmB,EACnB,MAAuB,EACvB,OAAuB,EACvB,MAAc,EACd,MAAmB,EACpC;qBALiB,KAAK;sBACL,MAAM;uBACN,OAAO;sBACP,MAAM;sBACN,MAAM;QAEvB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC1B,OAAO,EACP,GAAG,EAAE,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAAA,CAChE,EACD,EAAC,IAAI,EAAE,IAAI,EAAC,CACb,CAAC;IAAA,CACH;IAED;;OAEG;IACH,kBAAkB,GAAG,KAAK,EAAE,SAAe,EAAiB,EAAE,CAAC;QAC7D,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,iBAAiB,GAAG,YAAY,KAAK,SAAS,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAElD,qCAAqC;QACrC,+DAA+D;QAC/D,IAAI,WAAW,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,2FAA2F;YAC3F,iCAAiC;YACjC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAExF,kFAAkF;YAClF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACvF,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAC,GAAG,SAAS,CAAC;YACxD,4DAA4D;YAC5D,IAAI,WAAW,GAAG,SAAS,CAAC;YAE5B,iFAAiF;YACjF,gDAAgD;YAChD,IAAI,WAAW,GAAG,QAAQ,GAAG,mBAAmB,GAAG,eAAe,EAAE,CAAC;gBACnE,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,MAAM,EAAE,MAAM,EAAC,EAAE,CAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0EAA0E,EAAE;oBAC5F,SAAS;oBACT,QAAQ;oBACR,SAAS;iBACV,CAAC,CAAC;gBAEH,OAAO;YACT,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE;gBAChD,SAAS;gBACT,WAAW;gBACX,QAAQ;gBACR,QAAQ;gBACR,iBAAiB;aAClB,CAAC,CAAC;YACH,MAAM,8BAA8B,GAAG,iBAAiB;gBACtD,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,QAAQ,CAAC,UAAU,EAAE;gBACnE,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,8CAA8C;YAC9C,mFAAmF;YACnF,wFAAwF;YACxF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAC3D,SAAS,EACT,WAAW;YACX,8HAA8H;YAC9H,0HAA0H;YAC1H,8FAA8F;YAC9F,EAAC,iBAAiB,EAAE,CAAC,iBAAiB,EAAC,EACvC,WAAW,CAAC,eAAe,CAC5B,CAAC;YAEF,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAG,YAAY,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBAClE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACvE,IAAI,mBAAmB,GAAG,YAAY,CAAC;gBAEvC,IAAI,YAAY,EAAE,CAAC;oBACjB,0FAA0F;oBAC1F,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;oBAC/D,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAC,GAAG,YAAY,CAAC;oBAE3E,2EAA2E;oBAC3E,IAAI,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;wBACnE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,uDAAuD,EAAE;4BAC3E,gBAAgB;4BAChB,gBAAgB;4BAChB,QAAQ;4BACR,QAAQ;yBACT,CAAC,CAAC;wBACH,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC;wBACrC,mBAAmB,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAC5D,YAAY,EACZ,WAAW;wBACX,2HAA2H;wBAC3H,EAAC,iBAAiB,EAAE,CAAC,iBAAiB,EAAC,EACvC,WAAW,CAAC,mBAAmB,CAChC,CAAC;wBACF,WAAW,GAAG,YAAY,CAAC;oBAC7B,CAAC;oBAED,0EAA0E;oBAC1E,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;oBAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;wBAClE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;4BACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE,EAAC,WAAW,EAAC,EAAE,CAAU,CAAC,CAAC;wBAAA,CACjG,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACrE,CAAC;gBAED,IAAI,eAAwB,CAAC;gBAC7B,8EAA8E;gBAC9E,IAAI,uBAAuB,GAA8B,mBAAmB,CAAC;gBAC7E,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;wBACrE,eAAe,GAAG,mBAAmB,CAAC,yBAAyB,CAAC,SAAS,CAAC;wBAC1E,8GAA8G;wBAC9G,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;4BACjF,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,0BAA0B,CACzE,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,SAAS,CACtB,CAAC;4BACF,uBAAuB,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,uBAAuB,CAAC,CAAC;wBAClG,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,eAAe,GAAG,mBAAmB,CAAC,yBAAyB,CAAC,eAAe,CAAC;oBAClF,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,eAAe,GAAG,mBAAmB,CAAC,4BAA4B,CAAC,SAAS,CAAC;gBAC/E,CAAC;gBAED,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,eAAe,GACnB,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;oBAC1F,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;oBAE3E,MAAM,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACvE,MAAM,kBAAkB,GACtB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,yBAAyB,IAAI,aAAa,CAAC;oBAEvF,iFAAiF;oBACjF,kFAAkF;oBAClF,0BAA0B;oBAC1B,MAAM,uBAAuB,CAC3B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAyB,EAAE,6BAA6B;oBACxD,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,EAC9B,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,CACb,CAAC;oBACF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,+CAA+C,EAAE;wBACnE,WAAW;wBACX,aAAa;wBACb,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnC,iFAAiF;oBACjF,oFAAoF;oBACpF,8EAA8E;oBAC9E,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,wBAAwB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;oBACjG,IAAI,iBAAiB,EAAE,CAAC;wBACtB,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;oBAC/E,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;gBAEtE,0EAA0E;gBAC1E,0FAA0F;gBAC1F,IACE,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,IAAI,CAAC;oBAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAC3E,CAAC;oBACD,MAAM,IAAI,GAAG,0BAA0B,CAAC,IAAyB,EAAE,IAAI,CAAC,KAAK,EAAE;wBAC7E,YAAY,EAAE,uBAAuB;wBACrC,WAAW;wBACX,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;wBAC/C,eAAe;wBACf,YAAY,EAAE,YAAY,IAAI,4CAA4C;qBAC3E,CAAC,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;YACjE,CAAC;YAED,0HAA0H;YAC1H,2EAA2E;YAC3E,+GAA+G;YAC/G,IAAI,iBAAiB,EAAE,CAAC;gBACtB,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,MAAM,EAAE,SAAS,EAAC,EAAE,CAAC,CAAC,CAAC;gBAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACvF,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC1D,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;gBAExE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qDAAqD,EAAE;oBACzE,SAAS;oBACT,QAAQ;oBACR,WAAW;oBACX,YAAY;oBACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;iBAC/B,CAAC,CAAC;gBAEH,8BAA8B,EAAE,EAAE,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,MAAM,EAAE,OAAO,EAAC,EAAE,CAAC,CAAC,CAAC;gBAC5E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAC,EAAE,CAAU,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;IAAA,CACF,CAAC;IAEF,wBAAwB,CAAC,KAAuB,EAAE,iBAA0B,EAAQ;QAClF,2IAA2I;QAC3I,wDAAwD;QACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,UAAU,CAAC;YACvE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,eAAe;SAC/G,CAAC,CAAC;QACH,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,iBAAiB,EAAE,EAAE,CAAC;IAAA,CACvB;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IBeaconStateView
|
|
2
|
-
import { BeaconBlock, BlindedBeaconBlock, Gwei, Root
|
|
1
|
+
import { IBeaconStateView } from "@lodestar/state-transition";
|
|
2
|
+
import { BeaconBlock, BlindedBeaconBlock, Gwei, Root } from "@lodestar/types";
|
|
3
3
|
import { Metrics } from "../../metrics/index.js";
|
|
4
4
|
/**
|
|
5
5
|
* Instead of running fastStateTransition(), only need to process block since
|
|
@@ -9,12 +9,6 @@ import { Metrics } from "../../metrics/index.js";
|
|
|
9
9
|
export declare function computeNewStateRoot(metrics: Metrics | null, state: IBeaconStateView, block: BeaconBlock | BlindedBeaconBlock): {
|
|
10
10
|
newStateRoot: Root;
|
|
11
11
|
proposerReward: Gwei;
|
|
12
|
-
|
|
12
|
+
postState: IBeaconStateView;
|
|
13
13
|
};
|
|
14
|
-
/**
|
|
15
|
-
* Compute the state root after processing an execution payload envelope.
|
|
16
|
-
* Similar to `computeNewStateRoot` but for payload envelope processing.
|
|
17
|
-
*
|
|
18
|
-
*/
|
|
19
|
-
export declare function computePayloadEnvelopeStateRoot(metrics: Metrics | null, postBlockState: IBeaconStateViewGloas, envelope: gloas.ExecutionPayloadEnvelope): Root;
|
|
20
14
|
//# sourceMappingURL=computeNewStateRoot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeNewStateRoot.d.ts","sourceRoot":"","sources":["../../../src/chain/produceBlock/computeNewStateRoot.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"computeNewStateRoot.d.ts","sourceRoot":"","sources":["../../../src/chain/produceBlock/computeNewStateRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,EAEjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAE5E,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,WAAW,GAAG,kBAAkB,GACtC;IAAC,YAAY,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,gBAAgB,CAAA;CAAC,CAiCzE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataAvailabilityStatus, ExecutionPayloadStatus,
|
|
1
|
+
import { DataAvailabilityStatus, ExecutionPayloadStatus, StateHashTreeRootSource, } from "@lodestar/state-transition";
|
|
2
2
|
import { ZERO_HASH } from "../../constants/index.js";
|
|
3
3
|
/**
|
|
4
4
|
* Instead of running fastStateTransition(), only need to process block since
|
|
@@ -8,7 +8,7 @@ import { ZERO_HASH } from "../../constants/index.js";
|
|
|
8
8
|
export function computeNewStateRoot(metrics, state, block) {
|
|
9
9
|
// Set signature to zero to re-use stateTransition() function which requires the SignedBeaconBlock type
|
|
10
10
|
const blockEmptySig = { message: block, signature: ZERO_HASH };
|
|
11
|
-
const
|
|
11
|
+
const postState = state.stateTransition(blockEmptySig, {
|
|
12
12
|
// ExecutionPayloadStatus.valid: Assume payload valid, it has been produced by a trusted EL
|
|
13
13
|
executionPayloadStatus: ExecutionPayloadStatus.valid,
|
|
14
14
|
// DataAvailabilityStatus.available: Assume the blobs to be available, have just been produced by trusted EL
|
|
@@ -22,40 +22,13 @@ export function computeNewStateRoot(metrics, state, block) {
|
|
|
22
22
|
// Preserve cache in source state, since the resulting state is not added to the state cache
|
|
23
23
|
dontTransferCache: true,
|
|
24
24
|
}, { metrics });
|
|
25
|
-
const { attestations, syncAggregate, slashing } =
|
|
25
|
+
const { attestations, syncAggregate, slashing } = postState.proposerRewards;
|
|
26
26
|
const proposerReward = BigInt(attestations + syncAggregate + slashing);
|
|
27
27
|
const hashTreeRootTimer = metrics?.stateHashTreeRootTime.startTimer({
|
|
28
28
|
source: StateHashTreeRootSource.computeNewStateRoot,
|
|
29
29
|
});
|
|
30
|
-
const newStateRoot =
|
|
30
|
+
const newStateRoot = postState.hashTreeRoot();
|
|
31
31
|
hashTreeRootTimer?.();
|
|
32
|
-
return { newStateRoot, proposerReward,
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Compute the state root after processing an execution payload envelope.
|
|
36
|
-
* Similar to `computeNewStateRoot` but for payload envelope processing.
|
|
37
|
-
*
|
|
38
|
-
*/
|
|
39
|
-
export function computePayloadEnvelopeStateRoot(metrics, postBlockState, envelope) {
|
|
40
|
-
const signedEnvelope = {
|
|
41
|
-
message: envelope,
|
|
42
|
-
signature: G2_POINT_AT_INFINITY,
|
|
43
|
-
};
|
|
44
|
-
const processEnvelopeTimer = metrics?.blockPayload.executionPayloadEnvelopeProcessingTime.startTimer();
|
|
45
|
-
const postPayloadState = postBlockState.processExecutionPayloadEnvelope(signedEnvelope, {
|
|
46
|
-
// Signature is zero-ed (G2_POINT_AT_INFINITY), skip verification
|
|
47
|
-
verifySignature: false,
|
|
48
|
-
// State root is being computed here, the envelope doesn't have it yet
|
|
49
|
-
verifyStateRoot: false,
|
|
50
|
-
// Preserve cache in source state, since the resulting state is not added to the state cache
|
|
51
|
-
dontTransferCache: true,
|
|
52
|
-
});
|
|
53
|
-
processEnvelopeTimer?.();
|
|
54
|
-
const hashTreeRootTimer = metrics?.stateHashTreeRootTime.startTimer({
|
|
55
|
-
source: StateHashTreeRootSource.computePayloadEnvelopeStateRoot,
|
|
56
|
-
});
|
|
57
|
-
const stateRoot = postPayloadState.hashTreeRoot();
|
|
58
|
-
hashTreeRootTimer?.();
|
|
59
|
-
return stateRoot;
|
|
32
|
+
return { newStateRoot, proposerReward, postState };
|
|
60
33
|
}
|
|
61
34
|
//# sourceMappingURL=computeNewStateRoot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeNewStateRoot.js","sourceRoot":"","sources":["../../../src/chain/produceBlock/computeNewStateRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"computeNewStateRoot.js","sourceRoot":"","sources":["../../../src/chain/produceBlock/computeNewStateRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EAEtB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAGnD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAuB,EACvB,KAAuB,EACvB,KAAuC,EACkC;IACzE,uGAAuG;IACvG,MAAM,aAAa,GAAG,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAC,CAAC;IAE7D,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CACrC,aAAa,EACb;QACE,2FAA2F;QAC3F,sBAAsB,EAAE,sBAAsB,CAAC,KAAK;QACpD,4GAA4G;QAC5G,sBAAsB,EAAE,sBAAsB,CAAC,SAAS;QACxD,uFAAuF;QACvF,eAAe,EAAE,KAAK;QACtB,8DAA8D;QAC9D,cAAc,EAAE,KAAK;QACrB,4EAA4E;QAC5E,gBAAgB,EAAE,KAAK;QACvB,4FAA4F;QAC5F,iBAAiB,EAAE,IAAI;KACxB,EACD,EAAC,OAAO,EAAC,CACV,CAAC;IAEF,MAAM,EAAC,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAC,GAAG,SAAS,CAAC,eAAe,CAAC;IAC1E,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,GAAG,aAAa,GAAG,QAAQ,CAAC,CAAC;IAEvE,MAAM,iBAAiB,GAAG,OAAO,EAAE,qBAAqB,CAAC,UAAU,CAAC;QAClE,MAAM,EAAE,uBAAuB,CAAC,mBAAmB;KACpD,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;IAC9C,iBAAiB,EAAE,EAAE,CAAC;IAEtB,OAAO,EAAC,YAAY,EAAE,cAAc,EAAE,SAAS,EAAC,CAAC;AAAA,CAClD"}
|
|
@@ -45,12 +45,7 @@ export type ProduceFullGloas = {
|
|
|
45
45
|
executionRequests: electra.ExecutionRequests;
|
|
46
46
|
blobsBundle: BlobsBundle<ForkPostGloas>;
|
|
47
47
|
cells: fulu.Cell[][];
|
|
48
|
-
|
|
49
|
-
* Cached payload envelope state root computed during block production.
|
|
50
|
-
* This is the state root after running `processExecutionPayloadEnvelope` on the
|
|
51
|
-
* post-block state, and later used to construct the `ExecutionPayloadEnvelope`.
|
|
52
|
-
*/
|
|
53
|
-
payloadEnvelopeStateRoot: Root;
|
|
48
|
+
parentBlockRoot: Root;
|
|
54
49
|
};
|
|
55
50
|
export type ProduceFullFulu = {
|
|
56
51
|
type: BlockType.Full;
|
|
@@ -96,17 +91,27 @@ export declare function produceBlockBody<T extends BlockType>(this: BeaconChain,
|
|
|
96
91
|
export declare function prepareExecutionPayload(chain: {
|
|
97
92
|
executionEngine: IExecutionEngine;
|
|
98
93
|
config: ChainForkConfig;
|
|
99
|
-
}, logger: Logger, fork: ForkPostBellatrix, parentBlockRoot: Root,
|
|
94
|
+
}, logger: Logger, fork: ForkPostBellatrix, parentBlockRoot: Root, parentBlockHash: Bytes32, safeBlockHash: RootHex, finalizedBlockHash: RootHex,
|
|
95
|
+
/**
|
|
96
|
+
* Post-gloas, when extending a full parent, callers must apply
|
|
97
|
+
* parent execution payload first (see `withParentPayloadApplied`).
|
|
98
|
+
*/
|
|
99
|
+
state: IBeaconStateViewBellatrix, suggestedFeeRecipient: string): Promise<{
|
|
100
100
|
prepType: PayloadPreparationType;
|
|
101
101
|
payloadId: PayloadId;
|
|
102
102
|
}>;
|
|
103
103
|
export declare function getPayloadAttributesForSSE(fork: ForkPostBellatrix, chain: {
|
|
104
104
|
config: ChainForkConfig;
|
|
105
105
|
forkChoice: IForkChoice;
|
|
106
|
-
}, { prepareState, prepareSlot, parentBlockRoot, feeRecipient }: {
|
|
106
|
+
}, { prepareState, prepareSlot, parentBlockRoot, parentBlockHash, feeRecipient }: {
|
|
107
|
+
/**
|
|
108
|
+
* Post-gloas, when extending a full parent, callers must apply
|
|
109
|
+
* parent execution payload first (see `withParentPayloadApplied`).
|
|
110
|
+
*/
|
|
107
111
|
prepareState: IBeaconStateViewBellatrix;
|
|
108
112
|
prepareSlot: Slot;
|
|
109
113
|
parentBlockRoot: Root;
|
|
114
|
+
parentBlockHash: Bytes32;
|
|
110
115
|
feeRecipient: string;
|
|
111
116
|
}): SSEPayloadAttributes;
|
|
112
117
|
export declare function produceCommonBlockBody<T extends BlockType>(this: BeaconChain, blockType: T, currentState: IBeaconStateView, { randaoReveal, graffiti, slot, parentBlock }: BlockAttributes): Promise<CommonBlockBody>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"produceBlockBody.d.ts","sourceRoot":"","sources":["../../../src/chain/produceBlock/produceBlockBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,WAAW,EAAE,UAAU,EAA4B,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAEL,QAAQ,EACR,iBAAiB,EAEjB,aAAa,EACb,YAAY,EACZ,aAAa,EAMd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,gBAAgB,EAChB,KAAK,yBAAyB,
|
|
1
|
+
{"version":3,"file":"produceBlockBody.d.ts","sourceRoot":"","sources":["../../../src/chain/produceBlock/produceBlockBody.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { getSafeExecutionBlockHash } from "@lodestar/fork-choice";
|
|
2
2
|
import { BUILDER_INDEX_SELF_BUILD, ForkSeq, isForkPostAltair, isForkPostBellatrix, isForkPostGloas, } from "@lodestar/params";
|
|
3
|
-
import { G2_POINT_AT_INFINITY, computeTimeAtSlot,
|
|
4
|
-
import {
|
|
3
|
+
import { G2_POINT_AT_INFINITY, computeTimeAtSlot, isStatePostBellatrix, isStatePostCapella, isStatePostGloas, } from "@lodestar/state-transition";
|
|
4
|
+
import { ssz, } from "@lodestar/types";
|
|
5
|
+
import { byteArrayEquals, fromHex, sleep, toHex, toPubkeyHex, toRootHex } from "@lodestar/utils";
|
|
5
6
|
import { ZERO_HASH_HEX } from "../../constants/index.js";
|
|
6
7
|
import { numToQuantity } from "../../execution/engine/utils.js";
|
|
7
8
|
import { getExpectedGasLimit, } from "../../execution/index.js";
|
|
@@ -74,7 +75,21 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
74
75
|
feeRecipient,
|
|
75
76
|
});
|
|
76
77
|
// Get execution payload from EL
|
|
77
|
-
|
|
78
|
+
let parentBlockHash;
|
|
79
|
+
let parentExecutionRequests;
|
|
80
|
+
// Apply parent payload once here as it's reused by EL prep and voluntary exit filtering below
|
|
81
|
+
let stateAfterParentPayload = currentState;
|
|
82
|
+
const isExtendingPayload = this.forkChoice.shouldExtendPayload(toRootHex(parentBlockRoot));
|
|
83
|
+
if (isExtendingPayload) {
|
|
84
|
+
parentBlockHash = currentState.latestExecutionPayloadBid.blockHash;
|
|
85
|
+
parentExecutionRequests = await this.getParentExecutionRequests(parentBlock.slot, parentBlock.blockRoot);
|
|
86
|
+
stateAfterParentPayload = currentState.withParentPayloadApplied(parentExecutionRequests);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
parentBlockHash = currentState.latestExecutionPayloadBid.parentBlockHash;
|
|
90
|
+
parentExecutionRequests = ssz.electra.ExecutionRequests.defaultValue();
|
|
91
|
+
}
|
|
92
|
+
const prepareRes = await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, parentBlockHash, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, stateAfterParentPayload, feeRecipient);
|
|
78
93
|
const { prepType, payloadId } = prepareRes;
|
|
79
94
|
Object.assign(logMeta, { executionPayloadPrepType: prepType });
|
|
80
95
|
if (prepType !== PayloadPreparationType.Cached) {
|
|
@@ -98,8 +113,8 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
98
113
|
}
|
|
99
114
|
// Create self-build execution payload bid
|
|
100
115
|
const bid = {
|
|
101
|
-
parentBlockHash
|
|
102
|
-
parentBlockRoot
|
|
116
|
+
parentBlockHash,
|
|
117
|
+
parentBlockRoot,
|
|
103
118
|
blockHash: executionPayload.blockHash,
|
|
104
119
|
prevRandao: currentState.getRandaoMix(currentState.epoch),
|
|
105
120
|
feeRecipient: executionPayload.feeRecipient,
|
|
@@ -109,6 +124,7 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
109
124
|
value: 0,
|
|
110
125
|
executionPayment: 0,
|
|
111
126
|
blobKzgCommitments: blobsBundle.commitments,
|
|
127
|
+
executionRequestsRoot: ssz.electra.ExecutionRequests.hashTreeRoot(executionRequests),
|
|
112
128
|
};
|
|
113
129
|
const signedBid = {
|
|
114
130
|
message: bid,
|
|
@@ -117,8 +133,14 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
117
133
|
const commonBlockBody = await commonBlockBodyPromise;
|
|
118
134
|
const gloasBody = Object.assign({}, commonBlockBody);
|
|
119
135
|
gloasBody.signedExecutionPayloadBid = signedBid;
|
|
120
|
-
|
|
121
|
-
gloasBody.
|
|
136
|
+
gloasBody.payloadAttestations = this.payloadAttestationPool.getPayloadAttestationsForBlock(parentBlock.blockRoot, blockSlot - 1);
|
|
137
|
+
gloasBody.parentExecutionRequests = parentExecutionRequests;
|
|
138
|
+
// Drop voluntary exits that parent_execution_requests have invalidated (e.g. a withdrawal
|
|
139
|
+
// request initiating an exit on the same validator). Op pool selected against the unapplied
|
|
140
|
+
// state, so re-validate against the post-apply state to avoid producing an invalid block.
|
|
141
|
+
if (isExtendingPayload && commonBlockBody.voluntaryExits.length > 0) {
|
|
142
|
+
gloasBody.voluntaryExits = commonBlockBody.voluntaryExits.filter((signedVoluntaryExit) => stateAfterParentPayload.isValidVoluntaryExit(signedVoluntaryExit, false));
|
|
143
|
+
}
|
|
122
144
|
blockBody = gloasBody;
|
|
123
145
|
// Store execution payload data required to construct execution payload envelope later
|
|
124
146
|
const gloasResult = produceResult;
|
|
@@ -126,6 +148,7 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
126
148
|
gloasResult.executionRequests = executionRequests;
|
|
127
149
|
gloasResult.blobsBundle = blobsBundle;
|
|
128
150
|
gloasResult.cells = cells;
|
|
151
|
+
gloasResult.parentBlockRoot = fromHex(parentBlock.blockRoot);
|
|
129
152
|
const fetchedTime = Date.now() / 1000 - computeTimeAtSlot(this.config, blockSlot, this.genesisTime);
|
|
130
153
|
this.metrics?.blockPayload.payloadFetchedTime.observe({ prepType }, fetchedTime);
|
|
131
154
|
this.logger.verbose("Produced block with self-build bid", {
|
|
@@ -166,7 +189,7 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
166
189
|
// tests because merge-mock requires an fcU to be issued prior to fetch payload
|
|
167
190
|
// header.
|
|
168
191
|
if (executionBuilder.issueLocalFcUWithFeeRecipient !== undefined) {
|
|
169
|
-
await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, currentState, executionBuilder.issueLocalFcUWithFeeRecipient);
|
|
192
|
+
await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, currentState.latestExecutionPayloadHeader.blockHash, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, currentState, executionBuilder.issueLocalFcUWithFeeRecipient);
|
|
170
193
|
}
|
|
171
194
|
// For MeV boost integration, this is where the execution header will be
|
|
172
195
|
// fetched from the payload id and a blinded block will be produced instead of
|
|
@@ -249,7 +272,7 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
249
272
|
feeRecipient,
|
|
250
273
|
});
|
|
251
274
|
// https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/deneb/validator.md#constructing-the-beaconblockbody
|
|
252
|
-
const prepareRes = await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, currentState, feeRecipient);
|
|
275
|
+
const prepareRes = await prepareExecutionPayload(this, this.logger, fork, parentBlockRoot, currentState.latestExecutionPayloadHeader.blockHash, safeBlockHash, finalizedBlockHash ?? ZERO_HASH_HEX, currentState, feeRecipient);
|
|
253
276
|
const { prepType, payloadId } = prepareRes;
|
|
254
277
|
Object.assign(logMeta, { executionPayloadPrepType: prepType });
|
|
255
278
|
if (prepType !== PayloadPreparationType.Cached) {
|
|
@@ -381,12 +404,16 @@ export async function produceBlockBody(blockType, currentState, blockAttr) {
|
|
|
381
404
|
/**
|
|
382
405
|
* Produce ExecutionPayload for post-merge.
|
|
383
406
|
*/
|
|
384
|
-
export async function prepareExecutionPayload(chain, logger, fork, parentBlockRoot, safeBlockHash, finalizedBlockHash,
|
|
385
|
-
|
|
407
|
+
export async function prepareExecutionPayload(chain, logger, fork, parentBlockRoot, parentBlockHash, safeBlockHash, finalizedBlockHash,
|
|
408
|
+
/**
|
|
409
|
+
* Post-gloas, when extending a full parent, callers must apply
|
|
410
|
+
* parent execution payload first (see `withParentPayloadApplied`).
|
|
411
|
+
*/
|
|
412
|
+
state, suggestedFeeRecipient) {
|
|
386
413
|
const timestamp = computeTimeAtSlot(chain.config, state.slot, state.genesisTime);
|
|
387
414
|
const prevRandao = state.getRandaoMix(state.epoch);
|
|
388
415
|
const payloadIdCached = chain.executionEngine.payloadIdCache.get({
|
|
389
|
-
headBlockHash: toRootHex(
|
|
416
|
+
headBlockHash: toRootHex(parentBlockHash),
|
|
390
417
|
finalizedBlockHash,
|
|
391
418
|
timestamp: numToQuantity(timestamp),
|
|
392
419
|
prevRandao: toHex(prevRandao),
|
|
@@ -414,9 +441,10 @@ export async function prepareExecutionPayload(chain, logger, fork, parentBlockRo
|
|
|
414
441
|
prepareState: state,
|
|
415
442
|
prepareSlot: state.slot,
|
|
416
443
|
parentBlockRoot,
|
|
444
|
+
parentBlockHash,
|
|
417
445
|
feeRecipient: suggestedFeeRecipient,
|
|
418
446
|
});
|
|
419
|
-
payloadId = await chain.executionEngine.notifyForkchoiceUpdate(fork, toRootHex(
|
|
447
|
+
payloadId = await chain.executionEngine.notifyForkchoiceUpdate(fork, toRootHex(parentBlockHash), safeBlockHash, finalizedBlockHash, attributes);
|
|
420
448
|
logger.verbose("Prepared payload id from execution engine", { payloadId });
|
|
421
449
|
}
|
|
422
450
|
// Should never happen, notifyForkchoiceUpdate() with payload attributes always
|
|
@@ -436,17 +464,17 @@ async function prepareExecutionPayloadHeader(chain, fork, state, proposerPubKey)
|
|
|
436
464
|
const parentHash = state.latestExecutionPayloadHeader.blockHash;
|
|
437
465
|
return chain.executionBuilder.getHeader(fork, state.slot, parentHash, proposerPubKey);
|
|
438
466
|
}
|
|
439
|
-
export function getPayloadAttributesForSSE(fork, chain, { prepareState, prepareSlot, parentBlockRoot, feeRecipient, }) {
|
|
440
|
-
const parentHash = prepareState.latestBlockHash;
|
|
467
|
+
export function getPayloadAttributesForSSE(fork, chain, { prepareState, prepareSlot, parentBlockRoot, parentBlockHash, feeRecipient, }) {
|
|
441
468
|
const payloadAttributes = preparePayloadAttributes(fork, chain, {
|
|
442
469
|
prepareState,
|
|
443
470
|
prepareSlot,
|
|
444
471
|
parentBlockRoot,
|
|
472
|
+
parentBlockHash,
|
|
445
473
|
feeRecipient,
|
|
446
474
|
});
|
|
447
475
|
let parentBlockNumber;
|
|
448
476
|
if (isForkPostGloas(fork)) {
|
|
449
|
-
const parentBlock = chain.forkChoice.getBlockHexAndBlockHash(toRootHex(parentBlockRoot), toRootHex(
|
|
477
|
+
const parentBlock = chain.forkChoice.getBlockHexAndBlockHash(toRootHex(parentBlockRoot), toRootHex(parentBlockHash));
|
|
450
478
|
if (parentBlock?.executionPayloadBlockHash == null) {
|
|
451
479
|
throw Error(`Parent block not found in fork choice root=${toRootHex(parentBlockRoot)}`);
|
|
452
480
|
}
|
|
@@ -460,12 +488,12 @@ export function getPayloadAttributesForSSE(fork, chain, { prepareState, prepareS
|
|
|
460
488
|
proposalSlot: prepareSlot,
|
|
461
489
|
parentBlockNumber,
|
|
462
490
|
parentBlockRoot,
|
|
463
|
-
parentBlockHash
|
|
491
|
+
parentBlockHash,
|
|
464
492
|
payloadAttributes,
|
|
465
493
|
};
|
|
466
494
|
return ssePayloadAttributes;
|
|
467
495
|
}
|
|
468
|
-
function preparePayloadAttributes(fork, chain, { prepareState, prepareSlot, parentBlockRoot, feeRecipient, }) {
|
|
496
|
+
function preparePayloadAttributes(fork, chain, { prepareState, prepareSlot, parentBlockRoot, parentBlockHash, feeRecipient, }) {
|
|
469
497
|
const timestamp = computeTimeAtSlot(chain.config, prepareSlot, prepareState.genesisTime);
|
|
470
498
|
const prevRandao = prepareState.getRandaoMix(prepareState.epoch);
|
|
471
499
|
const payloadAttributes = {
|
|
@@ -477,13 +505,25 @@ function preparePayloadAttributes(fork, chain, { prepareState, prepareSlot, pare
|
|
|
477
505
|
if (!isStatePostCapella(prepareState)) {
|
|
478
506
|
throw new Error("Expected Capella state for withdrawals");
|
|
479
507
|
}
|
|
480
|
-
if (isStatePostGloas(prepareState)
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
508
|
+
if (isStatePostGloas(prepareState)) {
|
|
509
|
+
const isExtendingPayload = byteArrayEquals(parentBlockHash, prepareState.latestExecutionPayloadBid.blockHash);
|
|
510
|
+
if (isExtendingPayload) {
|
|
511
|
+
// applyParentExecutionPayload sets latestBlockHash = parentBid.blockHash, so a mismatch
|
|
512
|
+
// here means the caller did not apply parent payload to prepareState
|
|
513
|
+
if (!byteArrayEquals(prepareState.latestBlockHash, prepareState.latestExecutionPayloadBid.blockHash)) {
|
|
514
|
+
throw new Error("Expected state with parent execution payload applied for withdrawals");
|
|
515
|
+
}
|
|
516
|
+
payloadAttributes.withdrawals =
|
|
517
|
+
prepareState.getExpectedWithdrawals().expectedWithdrawals;
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
// When the parent block is empty, state.payloadExpectedWithdrawals holds a batch
|
|
521
|
+
// already deducted from CL balances but never credited on the EL (the envelope
|
|
522
|
+
// was not delivered). The next payload must carry those same withdrawals to
|
|
523
|
+
// restore CL/EL consistency, otherwise validators permanently lose that balance.
|
|
524
|
+
payloadAttributes.withdrawals =
|
|
525
|
+
prepareState.payloadExpectedWithdrawals;
|
|
526
|
+
}
|
|
487
527
|
}
|
|
488
528
|
else {
|
|
489
529
|
// withdrawals logic is now fork aware as it changes on electra fork post capella
|
|
@@ -494,6 +534,9 @@ function preparePayloadAttributes(fork, chain, { prepareState, prepareSlot, pare
|
|
|
494
534
|
if (ForkSeq[fork] >= ForkSeq.deneb) {
|
|
495
535
|
payloadAttributes.parentBeaconBlockRoot = parentBlockRoot;
|
|
496
536
|
}
|
|
537
|
+
if (ForkSeq[fork] >= ForkSeq.gloas) {
|
|
538
|
+
payloadAttributes.slotNumber = prepareSlot;
|
|
539
|
+
}
|
|
497
540
|
return payloadAttributes;
|
|
498
541
|
}
|
|
499
542
|
export async function produceCommonBlockBody(blockType, currentState, { randaoReveal, graffiti, slot, parentBlock }) {
|