@lodestar/beacon-node 1.43.0-dev.6b7eebbf6d → 1.43.0-dev.6f485b1b61
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 +16 -5
- 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/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 -2
- package/lib/api/impl/validator/index.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 +16 -28
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +23 -6
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +57 -24
- 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 +58 -25
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +12 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +28 -2
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +17 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +2 -2
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +4 -3
- 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 +2 -2
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +12 -8
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +8 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +1 -10
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +5 -3
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +42 -12
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +0 -11
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +0 -4
- package/lib/chain/emitter.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/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/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 +5 -3
- 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 +31 -13
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +11 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +47 -15
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +1 -0
- 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.map +1 -1
- package/lib/chain/regen/queued.js +1 -4
- package/lib/chain/regen/queued.js.map +1 -1
- package/lib/chain/regen/regen.d.ts.map +1 -1
- package/lib/chain/regen/regen.js +1 -4
- 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 +24 -7
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +69 -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/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/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/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 +10 -0
- 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 +5 -0
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +38 -16
- 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.js +2 -2
- 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 +35 -5
- package/lib/sync/range/batch.d.ts.map +1 -1
- package/lib/sync/range/batch.js +240 -59
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +19 -4
- package/lib/sync/range/chain.d.ts.map +1 -1
- package/lib/sync/range/chain.js +64 -11
- 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 +31 -9
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +13 -0
- package/lib/sync/sync.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 +29 -1
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +738 -61
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/downloadByRange.d.ts +67 -10
- package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
- package/lib/sync/utils/downloadByRange.js +211 -26
- 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 +8 -6
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +16 -15
- package/src/api/impl/beacon/blocks/index.ts +21 -5
- package/src/api/impl/beacon/pool/index.ts +83 -1
- 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 +82 -1
- package/src/chain/blocks/blockInput/blockInput.ts +4 -1
- package/src/chain/blocks/importBlock.ts +16 -48
- package/src/chain/blocks/importExecutionPayload.ts +76 -30
- package/src/chain/blocks/index.ts +71 -22
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +37 -3
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +18 -0
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +2 -2
- package/src/chain/blocks/types.ts +4 -3
- 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 +16 -8
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +7 -4
- package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +8 -17
- package/src/chain/chain.ts +55 -10
- package/src/chain/emitter.ts +0 -11
- package/src/chain/errors/blockError.ts +4 -1
- package/src/chain/errors/executionPayloadBid.ts +6 -0
- package/src/chain/errors/index.ts +1 -0
- package/src/chain/errors/proposerPreferences.ts +47 -0
- package/src/chain/initState.ts +9 -1
- package/src/chain/interface.ts +9 -1
- package/src/chain/opPools/payloadAttestationPool.ts +29 -8
- package/src/chain/prepareNextSlot.ts +36 -14
- package/src/chain/produceBlock/produceBlockBody.ts +57 -14
- package/src/chain/regen/interface.ts +1 -0
- package/src/chain/regen/queued.ts +2 -7
- package/src/chain/regen/regen.ts +2 -7
- package/src/chain/seenCache/index.ts +1 -0
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +89 -21
- package/src/chain/seenCache/seenProposerPreferences.ts +32 -0
- package/src/chain/validation/block.ts +1 -0
- package/src/chain/validation/executionPayloadBid.ts +25 -8
- package/src/chain/validation/proposerPreferences.ts +110 -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 +11 -0
- package/src/network/processor/gossipHandlers.ts +53 -17
- 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 +2 -2
- package/src/sync/constants.ts +4 -4
- package/src/sync/range/batch.ts +320 -67
- package/src/sync/range/chain.ts +89 -14
- package/src/sync/range/range.ts +34 -9
- package/src/sync/sync.ts +13 -1
- package/src/sync/types.ts +72 -0
- package/src/sync/unknownBlock.ts +928 -65
- package/src/sync/utils/downloadByRange.ts +378 -39
- package/src/sync/utils/downloadByRoot.ts +24 -2
- package/src/sync/utils/pendingBlocksTree.ts +0 -15
- package/src/util/sszBytes.ts +8 -6
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {routes} from "@lodestar/api";
|
|
2
|
-
import {ExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
|
|
3
|
-
import {isStatePostGloas} from "@lodestar/state-transition";
|
|
4
|
-
import {
|
|
2
|
+
import {ExecutionStatus, PayloadExecutionStatus, getSafeExecutionBlockHash} from "@lodestar/fork-choice";
|
|
3
|
+
import {DataAvailabilityStatus, isStatePostGloas} from "@lodestar/state-transition";
|
|
4
|
+
import {isErrorAborted} from "@lodestar/utils";
|
|
5
|
+
import {ZERO_HASH_HEX} from "../../constants/index.js";
|
|
5
6
|
import {ExecutionPayloadStatus} from "../../execution/index.js";
|
|
6
7
|
import {isQueueErrorAborted} from "../../util/queue/index.js";
|
|
7
8
|
import {BeaconChain} from "../chain.js";
|
|
@@ -20,6 +21,7 @@ export enum PayloadErrorCode {
|
|
|
20
21
|
EXECUTION_ENGINE_INVALID = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID",
|
|
21
22
|
EXECUTION_ENGINE_ERROR = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR",
|
|
22
23
|
BLOCK_NOT_IN_FORK_CHOICE = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE",
|
|
24
|
+
MISS_BLOCK_STATE = "PAYLOAD_ERROR_MISS_BLOCK_STATE",
|
|
23
25
|
ENVELOPE_VERIFICATION_ERROR = "PAYLOAD_ERROR_ENVELOPE_VERIFICATION_ERROR",
|
|
24
26
|
INVALID_SIGNATURE = "PAYLOAD_ERROR_INVALID_SIGNATURE",
|
|
25
27
|
}
|
|
@@ -39,6 +41,10 @@ export type PayloadErrorType =
|
|
|
39
41
|
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE;
|
|
40
42
|
blockRootHex: string;
|
|
41
43
|
}
|
|
44
|
+
| {
|
|
45
|
+
code: PayloadErrorCode.MISS_BLOCK_STATE;
|
|
46
|
+
blockRootHex: string;
|
|
47
|
+
}
|
|
42
48
|
| {
|
|
43
49
|
code: PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR;
|
|
44
50
|
message: string;
|
|
@@ -60,7 +66,6 @@ function toForkChoiceExecutionStatus(status: ExecutionPayloadStatus): PayloadExe
|
|
|
60
66
|
switch (status) {
|
|
61
67
|
case ExecutionPayloadStatus.VALID:
|
|
62
68
|
return ExecutionStatus.Valid;
|
|
63
|
-
// TODO GLOAS: Handle optimistic import for payload
|
|
64
69
|
case ExecutionPayloadStatus.SYNCING:
|
|
65
70
|
case ExecutionPayloadStatus.ACCEPTED:
|
|
66
71
|
return ExecutionStatus.Syncing;
|
|
@@ -75,21 +80,24 @@ function toForkChoiceExecutionStatus(status: ExecutionPayloadStatus): PayloadExe
|
|
|
75
80
|
* The envelope is only verified here, no state mutation. State effects from the payload
|
|
76
81
|
* are applied on the next block via processParentExecutionPayload.
|
|
77
82
|
*
|
|
83
|
+
* The DA wait must have run upstream (range sync awaits DA in `verifyBlocksInEpoch` for the
|
|
84
|
+
* whole segment; gossip / API path uses the `processExecutionPayload` wrapper below).
|
|
85
|
+
*
|
|
78
86
|
* Steps:
|
|
79
87
|
* 1. Emit `execution_payload_available` event for payload attestation
|
|
80
88
|
* 2. Get the ProtoBlock from fork choice
|
|
81
|
-
* 3.
|
|
82
|
-
* 4.
|
|
83
|
-
* 5.
|
|
84
|
-
* 6.
|
|
85
|
-
* 7.
|
|
89
|
+
* 3. Regenerate state for envelope verification
|
|
90
|
+
* 4. Verify envelope (fields against state, signature, and EL in parallel where possible)
|
|
91
|
+
* 5. Persist verified payload envelope to hot DB (waits for write-queue space for backpressure)
|
|
92
|
+
* 6. Update fork choice (transitions the block's PENDING variant to FULL)
|
|
93
|
+
* 7. Queue notifyForkchoiceUpdate to engine api
|
|
86
94
|
* 8. Record metrics for payload envelope and column sources
|
|
87
95
|
* 9. Emit `execution_payload` event
|
|
88
96
|
*/
|
|
89
97
|
export async function importExecutionPayload(
|
|
90
98
|
this: BeaconChain,
|
|
91
99
|
payloadInput: PayloadEnvelopeInput,
|
|
92
|
-
|
|
100
|
+
dataAvailabilityStatus: DataAvailabilityStatus,
|
|
93
101
|
opts: ImportPayloadOpts = {}
|
|
94
102
|
): Promise<void> {
|
|
95
103
|
const signedEnvelope = payloadInput.getPayloadEnvelope();
|
|
@@ -119,17 +127,20 @@ export async function importExecutionPayload(
|
|
|
119
127
|
});
|
|
120
128
|
}
|
|
121
129
|
|
|
122
|
-
// 3.
|
|
123
|
-
|
|
124
|
-
|
|
130
|
+
// 3. Regenerate state for envelope verification
|
|
131
|
+
const blockState = await this.regen
|
|
132
|
+
.getBlockSlotState(protoBlock, protoBlock.slot, {dontTransferCache: true}, RegenCaller.processBlock)
|
|
133
|
+
.catch(() =>
|
|
134
|
+
// only happen at the 1st batch of skipped slot checkpoint sync
|
|
135
|
+
this.regen.getClosestHeadState(protoBlock)
|
|
136
|
+
);
|
|
125
137
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
);
|
|
138
|
+
if (blockState == null) {
|
|
139
|
+
throw new PayloadError({
|
|
140
|
+
code: PayloadErrorCode.MISS_BLOCK_STATE,
|
|
141
|
+
blockRootHex: protoBlock.blockRoot,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
133
144
|
if (!isStatePostGloas(blockState)) {
|
|
134
145
|
throw new PayloadError({
|
|
135
146
|
code: PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR,
|
|
@@ -137,7 +148,7 @@ export async function importExecutionPayload(
|
|
|
137
148
|
});
|
|
138
149
|
}
|
|
139
150
|
|
|
140
|
-
//
|
|
151
|
+
// 4. Verify envelope fields against state first to fail fast before the EL + BLS work.
|
|
141
152
|
// When validSignature is true, gossip/API has already verified both the signature and the
|
|
142
153
|
// executionRequestsRoot, so we skip those checks here.
|
|
143
154
|
try {
|
|
@@ -154,13 +165,13 @@ export async function importExecutionPayload(
|
|
|
154
165
|
);
|
|
155
166
|
}
|
|
156
167
|
|
|
157
|
-
//
|
|
168
|
+
// 4a. Run EL and signature verification in parallel
|
|
158
169
|
const [execResult, signatureValid] = await Promise.all([
|
|
159
170
|
this.executionEngine.notifyNewPayload(
|
|
160
171
|
fork,
|
|
161
172
|
envelope.payload,
|
|
162
173
|
payloadInput.getVersionedHashes(),
|
|
163
|
-
|
|
174
|
+
envelope.parentBeaconBlockRoot,
|
|
164
175
|
envelope.executionRequests
|
|
165
176
|
),
|
|
166
177
|
|
|
@@ -176,12 +187,12 @@ export async function importExecutionPayload(
|
|
|
176
187
|
),
|
|
177
188
|
]);
|
|
178
189
|
|
|
179
|
-
//
|
|
190
|
+
// 4b. Check signature verification result
|
|
180
191
|
if (!signatureValid) {
|
|
181
192
|
throw new PayloadError({code: PayloadErrorCode.INVALID_SIGNATURE});
|
|
182
193
|
}
|
|
183
194
|
|
|
184
|
-
//
|
|
195
|
+
// 4c. Handle EL response
|
|
185
196
|
switch (execResult.status) {
|
|
186
197
|
case ExecutionPayloadStatus.VALID:
|
|
187
198
|
break;
|
|
@@ -207,7 +218,7 @@ export async function importExecutionPayload(
|
|
|
207
218
|
});
|
|
208
219
|
}
|
|
209
220
|
|
|
210
|
-
//
|
|
221
|
+
// 5. Persist payload envelope to hot DB. Wait for write-queue space here to apply backpressure
|
|
211
222
|
// on the import pipeline during sync, then perform the write asynchronously to avoid blocking.
|
|
212
223
|
await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
|
|
213
224
|
this.unfinalizedPayloadEnvelopeWrites.push(payloadInput).catch((e) => {
|
|
@@ -220,9 +231,27 @@ export async function importExecutionPayload(
|
|
|
220
231
|
}
|
|
221
232
|
});
|
|
222
233
|
|
|
223
|
-
//
|
|
234
|
+
// 6. Update fork choice, transitions the block's PENDING variant to FULL
|
|
224
235
|
const execStatus = toForkChoiceExecutionStatus(execResult.status);
|
|
225
|
-
this.forkChoice.onExecutionPayload(
|
|
236
|
+
this.forkChoice.onExecutionPayload(
|
|
237
|
+
blockRootHex,
|
|
238
|
+
blockHashHex,
|
|
239
|
+
envelope.payload.blockNumber,
|
|
240
|
+
execStatus,
|
|
241
|
+
dataAvailabilityStatus
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
// 7. Queue notifyForkchoiceUpdate to engine api
|
|
245
|
+
const head = this.forkChoice.getHead();
|
|
246
|
+
if (!this.opts.disableImportExecutionFcU && blockRootHex === head.blockRoot) {
|
|
247
|
+
const safeBlockHash = getSafeExecutionBlockHash(this.forkChoice);
|
|
248
|
+
const finalizedBlockHash = this.forkChoice.getFinalizedBlock().executionPayloadBlockHash ?? ZERO_HASH_HEX;
|
|
249
|
+
this.executionEngine.notifyForkchoiceUpdate(fork, blockHashHex, safeBlockHash, finalizedBlockHash).catch((e) => {
|
|
250
|
+
if (!isErrorAborted(e) && !isQueueErrorAborted(e)) {
|
|
251
|
+
this.logger.error("Error pushing notifyForkchoiceUpdate()", {blockHashHex, finalizedBlockHash}, e);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
226
255
|
|
|
227
256
|
// 8. Record metrics for payload envelope and column sources
|
|
228
257
|
this.metrics?.importPayload.bySource.inc({source: payloadInput.getPayloadEnvelopeSource().source});
|
|
@@ -237,8 +266,7 @@ export async function importExecutionPayload(
|
|
|
237
266
|
builderIndex: envelope.builderIndex,
|
|
238
267
|
blockHash: blockHashHex,
|
|
239
268
|
blockRoot: blockRootHex,
|
|
240
|
-
|
|
241
|
-
executionOptimistic: false,
|
|
269
|
+
executionOptimistic: execStatus === ExecutionStatus.Syncing,
|
|
242
270
|
});
|
|
243
271
|
}
|
|
244
272
|
|
|
@@ -249,3 +277,21 @@ export async function importExecutionPayload(
|
|
|
249
277
|
blockHash: blockHashHex,
|
|
250
278
|
});
|
|
251
279
|
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Process an execution payload envelope end-to-end: wait for DA, then import.
|
|
283
|
+
*
|
|
284
|
+
* Used by the PayloadEnvelopeProcessor queue (gossip / API / unknown-payload sync) — i.e.
|
|
285
|
+
* callers that have NOT already awaited DA themselves. Range sync's inline dispatch in
|
|
286
|
+
* processBlocks skips this wrapper and calls `importExecutionPayload` directly, since
|
|
287
|
+
* `verifyBlocksInEpoch` already awaited DA for the segment.
|
|
288
|
+
*/
|
|
289
|
+
export async function processExecutionPayload(
|
|
290
|
+
this: BeaconChain,
|
|
291
|
+
payloadInput: PayloadEnvelopeInput,
|
|
292
|
+
signal: AbortSignal,
|
|
293
|
+
opts: ImportPayloadOpts = {}
|
|
294
|
+
): Promise<void> {
|
|
295
|
+
const {dataAvailabilityStatuses} = await verifyPayloadsDataAvailability([payloadInput], signal);
|
|
296
|
+
await importExecutionPayload.call(this, payloadInput, dataAvailabilityStatuses[0], opts);
|
|
297
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {SignedBeaconBlock} from "@lodestar/types";
|
|
1
|
+
import {SignedBeaconBlock, Slot} from "@lodestar/types";
|
|
2
2
|
import {isErrorAborted, toRootHex} from "@lodestar/utils";
|
|
3
3
|
import {Metrics} from "../../metrics/metrics.js";
|
|
4
4
|
import {nextEventLoop} from "../../util/eventLoop.js";
|
|
@@ -8,6 +8,8 @@ import {BlockError, BlockErrorCode, isBlockErrorAborted} from "../errors/index.j
|
|
|
8
8
|
import {BlockProcessOpts} from "../options.js";
|
|
9
9
|
import {IBlockInput} from "./blockInput/types.js";
|
|
10
10
|
import {importBlock} from "./importBlock.js";
|
|
11
|
+
import {importExecutionPayload} from "./importExecutionPayload.js";
|
|
12
|
+
import {PayloadEnvelopeInput} from "./payloadEnvelopeInput/payloadEnvelopeInput.js";
|
|
11
13
|
import {FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
|
|
12
14
|
import {assertLinearChainSegment} from "./utils/chainSegment.js";
|
|
13
15
|
import {verifyBlocksInEpoch} from "./verifyBlock.js";
|
|
@@ -21,20 +23,24 @@ const QUEUE_MAX_LENGTH = 256;
|
|
|
21
23
|
* BlockProcessor processes block jobs in a queued fashion, one after the other.
|
|
22
24
|
*/
|
|
23
25
|
export class BlockProcessor {
|
|
24
|
-
readonly jobQueue: JobItemQueue<[IBlockInput[], ImportBlockOpts], void>;
|
|
26
|
+
readonly jobQueue: JobItemQueue<[IBlockInput[], Map<Slot, PayloadEnvelopeInput> | null, ImportBlockOpts], void>;
|
|
25
27
|
|
|
26
28
|
constructor(chain: BeaconChain, metrics: Metrics | null, opts: BlockProcessOpts, signal: AbortSignal) {
|
|
27
|
-
this.jobQueue = new JobItemQueue<[IBlockInput[], ImportBlockOpts], void>(
|
|
28
|
-
(job, importOpts) => {
|
|
29
|
-
return processBlocks.call(chain, job, {...opts, ...importOpts});
|
|
29
|
+
this.jobQueue = new JobItemQueue<[IBlockInput[], Map<Slot, PayloadEnvelopeInput> | null, ImportBlockOpts], void>(
|
|
30
|
+
(job, payloadEnvelopes, importOpts) => {
|
|
31
|
+
return processBlocks.call(chain, job, payloadEnvelopes, {...opts, ...importOpts});
|
|
30
32
|
},
|
|
31
33
|
{maxLength: QUEUE_MAX_LENGTH, noYieldIfOneItem: true, signal},
|
|
32
34
|
metrics?.blockProcessorQueue ?? undefined
|
|
33
35
|
);
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
async processBlocksJob(
|
|
37
|
-
|
|
38
|
+
async processBlocksJob(
|
|
39
|
+
job: IBlockInput[],
|
|
40
|
+
payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
|
|
41
|
+
opts: ImportBlockOpts = {}
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
await this.jobQueue.push(job, payloadEnvelopes, opts);
|
|
38
44
|
}
|
|
39
45
|
}
|
|
40
46
|
|
|
@@ -51,18 +57,15 @@ export class BlockProcessor {
|
|
|
51
57
|
export async function processBlocks(
|
|
52
58
|
this: BeaconChain,
|
|
53
59
|
blocks: IBlockInput[],
|
|
60
|
+
payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
|
|
54
61
|
opts: BlockProcessOpts & ImportBlockOpts
|
|
55
62
|
): Promise<void> {
|
|
56
63
|
if (blocks.length === 0) {
|
|
57
64
|
return; // TODO: or throw?
|
|
58
65
|
}
|
|
59
66
|
|
|
60
|
-
if (blocks.length > 1) {
|
|
61
|
-
assertLinearChainSegment(this.config, blocks);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
67
|
try {
|
|
65
|
-
const {relevantBlocks, parentSlots, parentBlock} = verifyBlocksSanityChecks(this, blocks, opts);
|
|
68
|
+
const {relevantBlocks, parentSlots, parentBlock} = verifyBlocksSanityChecks(this, blocks, payloadEnvelopes, opts);
|
|
66
69
|
|
|
67
70
|
// No relevant blocks, skip verifyBlocksInEpoch()
|
|
68
71
|
if (relevantBlocks.length === 0 || parentBlock === null) {
|
|
@@ -70,10 +73,31 @@ export async function processBlocks(
|
|
|
70
73
|
return;
|
|
71
74
|
}
|
|
72
75
|
|
|
76
|
+
const {warnings: orphanedPayloads} = assertLinearChainSegment(
|
|
77
|
+
this.config,
|
|
78
|
+
relevantBlocks,
|
|
79
|
+
payloadEnvelopes,
|
|
80
|
+
parentBlock
|
|
81
|
+
);
|
|
82
|
+
if (orphanedPayloads != null) {
|
|
83
|
+
for (const orphaned of orphanedPayloads) {
|
|
84
|
+
this.logger.debug("Orphaned payload envelope in chain segment", {
|
|
85
|
+
slot: orphaned.slot,
|
|
86
|
+
blockRoot: orphaned.payloadEnvelopeInput.blockRootHex,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
73
91
|
// Fully verify a block to be imported immediately after. Does not produce any side-effects besides adding intermediate
|
|
74
92
|
// states in the state cache through regen.
|
|
75
|
-
const {
|
|
76
|
-
|
|
93
|
+
const {
|
|
94
|
+
postStates,
|
|
95
|
+
blockDAStatuses,
|
|
96
|
+
payloadDAStatuses,
|
|
97
|
+
proposerBalanceDeltas,
|
|
98
|
+
segmentExecStatus,
|
|
99
|
+
indexedAttestationsByBlock,
|
|
100
|
+
} = await verifyBlocksInEpoch.call(this, parentBlock, relevantBlocks, payloadEnvelopes, opts);
|
|
77
101
|
|
|
78
102
|
// If segmentExecStatus has lvhForkchoice then, the entire segment should be invalid
|
|
79
103
|
// and we need to further propagate
|
|
@@ -85,24 +109,49 @@ export async function processBlocks(
|
|
|
85
109
|
}
|
|
86
110
|
|
|
87
111
|
const {executionStatuses} = segmentExecStatus;
|
|
88
|
-
const
|
|
89
|
-
|
|
112
|
+
const verifiedBlocksBySlot = new Map<Slot, FullyVerifiedBlock>();
|
|
113
|
+
for (let i = 0; i < relevantBlocks.length; i++) {
|
|
114
|
+
const block = relevantBlocks[i];
|
|
115
|
+
verifiedBlocksBySlot.set(block.getBlock().message.slot, {
|
|
90
116
|
blockInput: block,
|
|
91
117
|
postState: postStates[i],
|
|
92
118
|
parentBlockSlot: parentSlots[i],
|
|
93
119
|
executionStatus: executionStatuses[i],
|
|
94
120
|
// start supporting optimistic syncing/processing
|
|
95
|
-
dataAvailabilityStatus:
|
|
121
|
+
dataAvailabilityStatus: blockDAStatuses[i],
|
|
96
122
|
proposerBalanceDelta: proposerBalanceDeltas[i],
|
|
97
123
|
indexedAttestations: indexedAttestationsByBlock[i],
|
|
98
124
|
// TODO: Make this param mandatory and capture in gossip
|
|
99
125
|
seenTimestampSec: opts.seenTimestampSec ?? Math.floor(Date.now() / 1000),
|
|
100
|
-
})
|
|
101
|
-
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const slotSet = new Set<Slot>(blocks.map((b) => b.getBlock().message.slot));
|
|
130
|
+
if (payloadEnvelopes) {
|
|
131
|
+
for (const slot of payloadEnvelopes.keys()) slotSet.add(slot);
|
|
132
|
+
}
|
|
133
|
+
const slots = Array.from(slotSet).sort((a, b) => a - b);
|
|
134
|
+
for (const slot of slots) {
|
|
135
|
+
const fullyVerifiedBlock = verifiedBlocksBySlot.get(slot);
|
|
136
|
+
if (fullyVerifiedBlock !== undefined) {
|
|
137
|
+
// TODO: Consider batching importBlock too if it takes significant time
|
|
138
|
+
await importBlock.call(this, fullyVerifiedBlock, opts);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const payloadInput = payloadEnvelopes?.get(slot);
|
|
142
|
+
if (payloadInput?.hasPayloadEnvelope()) {
|
|
143
|
+
if (!payloadInput.isComplete()) {
|
|
144
|
+
// we validated DA before reaching this
|
|
145
|
+
throw new Error(`Payload envelope for slot ${slot} not complete after DA verification`);
|
|
146
|
+
}
|
|
147
|
+
// we already awaited DA in verifyBlocksInEpoch for this segment
|
|
148
|
+
const payloadDA = payloadDAStatuses.get(slot);
|
|
149
|
+
if (payloadDA === undefined) {
|
|
150
|
+
throw new Error(`Missing payload DA status for slot ${slot}`);
|
|
151
|
+
}
|
|
152
|
+
await importExecutionPayload.call(this, payloadInput, payloadDA, {validSignature: false});
|
|
153
|
+
}
|
|
102
154
|
|
|
103
|
-
for (const fullyVerifiedBlock of fullyVerifiedBlocks) {
|
|
104
|
-
// TODO: Consider batching importBlock too if it takes significant time
|
|
105
|
-
await importBlock.call(this, fullyVerifiedBlock, opts);
|
|
106
155
|
await nextEventLoop();
|
|
107
156
|
}
|
|
108
157
|
} catch (e) {
|
|
@@ -4,7 +4,13 @@ import {toRootHex, withTimeout} from "@lodestar/utils";
|
|
|
4
4
|
import {VersionedHashes} from "../../../execution/index.js";
|
|
5
5
|
import {kzgCommitmentToVersionedHash} from "../../../util/blobs.js";
|
|
6
6
|
import {MissingColumnMeta} from "../blockInput/types.js";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
AddPayloadEnvelopeProps,
|
|
9
|
+
ColumnWithSource,
|
|
10
|
+
CreateFromBidProps,
|
|
11
|
+
CreateFromBlockProps,
|
|
12
|
+
SourceMeta,
|
|
13
|
+
} from "./types.js";
|
|
8
14
|
|
|
9
15
|
export type PayloadEnvelopeInputState =
|
|
10
16
|
| {
|
|
@@ -64,6 +70,7 @@ export class PayloadEnvelopeInput {
|
|
|
64
70
|
readonly proposerIndex: ValidatorIndex;
|
|
65
71
|
readonly bid: gloas.ExecutionPayloadBid;
|
|
66
72
|
readonly versionedHashes: VersionedHashes;
|
|
73
|
+
readonly daOutOfRange: boolean;
|
|
67
74
|
|
|
68
75
|
private columnsCache = new Map<ColumnIndex, ColumnWithSource>();
|
|
69
76
|
|
|
@@ -87,6 +94,7 @@ export class PayloadEnvelopeInput {
|
|
|
87
94
|
sampledColumns: ColumnIndex[];
|
|
88
95
|
custodyColumns: ColumnIndex[];
|
|
89
96
|
timeCreatedSec: number;
|
|
97
|
+
daOutOfRange: boolean;
|
|
90
98
|
}) {
|
|
91
99
|
this.blockRootHex = props.blockRootHex;
|
|
92
100
|
this.slot = props.slot;
|
|
@@ -97,13 +105,14 @@ export class PayloadEnvelopeInput {
|
|
|
97
105
|
this.sampledColumns = props.sampledColumns;
|
|
98
106
|
this.custodyColumns = props.custodyColumns;
|
|
99
107
|
this.timeCreatedSec = props.timeCreatedSec;
|
|
108
|
+
this.daOutOfRange = props.daOutOfRange;
|
|
100
109
|
this.payloadEnvelopeDataPromise = createPromise();
|
|
101
110
|
this.allDataPromise = createPromise();
|
|
102
111
|
this.columnsDataPromise = createPromise();
|
|
103
112
|
|
|
104
113
|
const noBlobs = props.bid.blobKzgCommitments.length === 0;
|
|
105
114
|
const noSampledColumns = props.sampledColumns.length === 0;
|
|
106
|
-
const hasAllData = noBlobs || noSampledColumns;
|
|
115
|
+
const hasAllData = props.daOutOfRange || noBlobs || noSampledColumns;
|
|
107
116
|
|
|
108
117
|
if (hasAllData) {
|
|
109
118
|
this.state = {hasPayload: false, hasAllData: true, hasComputedAllData: true};
|
|
@@ -125,6 +134,27 @@ export class PayloadEnvelopeInput {
|
|
|
125
134
|
sampledColumns: props.sampledColumns,
|
|
126
135
|
custodyColumns: props.custodyColumns,
|
|
127
136
|
timeCreatedSec: props.timeCreatedSec,
|
|
137
|
+
daOutOfRange: props.daOutOfRange,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Create a `PayloadEnvelopeInput` from a state's `latestExecutionPayloadBid` (the bid
|
|
143
|
+
* recorded in beacon state for the latest imported block). Used when seeding the cache
|
|
144
|
+
* for a checkpoint anchor block — we have the bid via state but not the full
|
|
145
|
+
* SignedBeaconBlock body.
|
|
146
|
+
*/
|
|
147
|
+
static createFromBid(props: CreateFromBidProps): PayloadEnvelopeInput {
|
|
148
|
+
return new PayloadEnvelopeInput({
|
|
149
|
+
blockRootHex: props.blockRootHex,
|
|
150
|
+
slot: props.slot,
|
|
151
|
+
forkName: props.forkName,
|
|
152
|
+
proposerIndex: props.proposerIndex,
|
|
153
|
+
bid: props.bid,
|
|
154
|
+
sampledColumns: props.sampledColumns,
|
|
155
|
+
custodyColumns: props.custodyColumns,
|
|
156
|
+
timeCreatedSec: props.timeCreatedSec,
|
|
157
|
+
daOutOfRange: props.daOutOfRange,
|
|
128
158
|
});
|
|
129
159
|
}
|
|
130
160
|
|
|
@@ -152,6 +182,7 @@ export class PayloadEnvelopeInput {
|
|
|
152
182
|
throw new Error("Payload envelope beacon_block_root mismatch");
|
|
153
183
|
}
|
|
154
184
|
|
|
185
|
+
// TODO GLOAS: track source by metrics, maybe inside the seen cache
|
|
155
186
|
const source: SourceMeta = {
|
|
156
187
|
source: props.source,
|
|
157
188
|
seenTimestampSec: props.seenTimestampSec,
|
|
@@ -306,8 +337,11 @@ export class PayloadEnvelopeInput {
|
|
|
306
337
|
return this.state.hasAllData;
|
|
307
338
|
}
|
|
308
339
|
|
|
340
|
+
/**
|
|
341
|
+
* Strictly checks missing sampled columns. Does NOT short-circuit on `state.hasAllData`.
|
|
342
|
+
*/
|
|
309
343
|
getMissingSampledColumnMeta(): MissingColumnMeta {
|
|
310
|
-
if (this.state.
|
|
344
|
+
if (this.state.hasComputedAllData) {
|
|
311
345
|
return {missing: [], versionedHashes: this.versionedHashes};
|
|
312
346
|
}
|
|
313
347
|
|
|
@@ -27,6 +27,24 @@ export type CreateFromBlockProps = {
|
|
|
27
27
|
sampledColumns: ColumnIndex[];
|
|
28
28
|
custodyColumns: ColumnIndex[];
|
|
29
29
|
timeCreatedSec: number;
|
|
30
|
+
daOutOfRange: boolean;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Used to seed an entry from a state's `latestExecutionPayloadBid` (e.g., when initializing
|
|
35
|
+
* the chain from a checkpoint anchor state — we have the bid via the state but not the
|
|
36
|
+
* full SignedBeaconBlock).
|
|
37
|
+
*/
|
|
38
|
+
export type CreateFromBidProps = {
|
|
39
|
+
blockRootHex: RootHex;
|
|
40
|
+
slot: number;
|
|
41
|
+
forkName: ForkName;
|
|
42
|
+
proposerIndex: number;
|
|
43
|
+
bid: gloas.ExecutionPayloadBid;
|
|
44
|
+
sampledColumns: ColumnIndex[];
|
|
45
|
+
custodyColumns: ColumnIndex[];
|
|
46
|
+
timeCreatedSec: number;
|
|
47
|
+
daOutOfRange: boolean;
|
|
30
48
|
};
|
|
31
49
|
|
|
32
50
|
export type AddPayloadEnvelopeProps = SourceMeta & {
|
|
@@ -2,7 +2,7 @@ import {Metrics} from "../../metrics/metrics.js";
|
|
|
2
2
|
import {JobItemQueue} from "../../util/queue/index.js";
|
|
3
3
|
import type {BeaconChain} from "../chain.js";
|
|
4
4
|
import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
|
|
5
|
-
import {
|
|
5
|
+
import {processExecutionPayload} from "./importExecutionPayload.js";
|
|
6
6
|
import {ImportPayloadOpts} from "./types.js";
|
|
7
7
|
|
|
8
8
|
// TODO GLOAS: Set to be equal to DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES for now
|
|
@@ -30,7 +30,7 @@ export class PayloadEnvelopeProcessor {
|
|
|
30
30
|
this.jobQueue = new JobItemQueue<[PayloadEnvelopeInput, ImportPayloadOpts], void>(
|
|
31
31
|
(payloadInput, opts) => {
|
|
32
32
|
this.importStatus.set(payloadInput, PayloadEnvelopeImportStatus.importing);
|
|
33
|
-
return
|
|
33
|
+
return processExecutionPayload.call(chain, payloadInput, signal, opts);
|
|
34
34
|
},
|
|
35
35
|
{maxLength: QUEUE_MAX_LENGTH, noYieldIfOneItem: true, signal},
|
|
36
36
|
metrics?.payloadEnvelopeProcessorQueue ?? undefined
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type {ChainForkConfig} from "@lodestar/config";
|
|
2
|
-
import {BlockExecutionStatus} from "@lodestar/fork-choice";
|
|
2
|
+
import type {BlockExecutionStatus, PayloadExecutionStatus} from "@lodestar/fork-choice";
|
|
3
3
|
import {ForkSeq} from "@lodestar/params";
|
|
4
4
|
import {DataAvailabilityStatus, IBeaconStateView, computeEpochAtSlot} from "@lodestar/state-transition";
|
|
5
5
|
import type {IndexedAttestation, Slot, fulu} from "@lodestar/types";
|
|
@@ -94,7 +94,8 @@ export type ImportBlockOpts = {
|
|
|
94
94
|
*
|
|
95
95
|
* `executionStatus` reflects the outcome of execution payload verification at block-import time:
|
|
96
96
|
* - pre-gloas: Valid | Syncing | PreMerge (from EL notifyNewPayload against the in-block payload)
|
|
97
|
-
* - post-gloas:
|
|
97
|
+
* - post-gloas: inherited from parent's chain (Valid/Syncing) by importBlock; payload arrives
|
|
98
|
+
* separately as an envelope and creates the FULL variant later via onExecutionPayload
|
|
98
99
|
*/
|
|
99
100
|
export type FullyVerifiedBlock = {
|
|
100
101
|
blockInput: IBlockInput;
|
|
@@ -107,5 +108,5 @@ export type FullyVerifiedBlock = {
|
|
|
107
108
|
/** Seen timestamp seconds */
|
|
108
109
|
seenTimestampSec: number;
|
|
109
110
|
/** If the execution payload couldn't be verified because of EL syncing status, used in optimistic sync */
|
|
110
|
-
executionStatus: BlockExecutionStatus;
|
|
111
|
+
executionStatus: BlockExecutionStatus | PayloadExecutionStatus;
|
|
111
112
|
};
|