@lodestar/beacon-node 1.42.0-dev.5f2fffc2ce → 1.42.0-dev.70938e1eec
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 +35 -16
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/chain/blocks/blockInput/types.d.ts +3 -3
- package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.d.ts.map +1 -1
- package/lib/chain/blocks/importBlock.js +18 -2
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +48 -0
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -0
- package/lib/chain/blocks/importExecutionPayload.js +159 -0
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts +3 -0
- package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/index.js +3 -0
- package/lib/chain/blocks/payloadEnvelopeInput/index.js.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +80 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +248 -0
- package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +29 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.js +11 -0
- package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +15 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +46 -0
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -0
- package/lib/chain/blocks/types.d.ts +7 -0
- package/lib/chain/blocks/types.d.ts.map +1 -1
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +12 -0
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -0
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +40 -0
- package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -0
- package/lib/chain/chain.d.ts +7 -2
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +28 -3
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.d.ts +12 -2
- package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/errors/executionPayloadEnvelope.js +3 -1
- package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/forkChoice/index.d.ts.map +1 -1
- package/lib/chain/forkChoice/index.js +0 -10
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/interface.d.ts +6 -3
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js +6 -1
- package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/interface.d.ts +2 -0
- package/lib/chain/regen/interface.d.ts.map +1 -1
- package/lib/chain/regen/interface.js +2 -0
- package/lib/chain/regen/interface.js.map +1 -1
- package/lib/chain/seenCache/index.d.ts +1 -1
- package/lib/chain/seenCache/index.d.ts.map +1 -1
- package/lib/chain/seenCache/index.js +1 -1
- package/lib/chain/seenCache/index.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +38 -0
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -0
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +76 -0
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -0
- package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadEnvelope.js +30 -19
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js +1 -1
- package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.js +1 -1
- package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
- package/lib/chain/validatorMonitor.d.ts +2 -1
- package/lib/chain/validatorMonitor.d.ts.map +1 -1
- package/lib/chain/validatorMonitor.js +4 -1
- package/lib/chain/validatorMonitor.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +2 -2
- package/lib/metrics/metrics/lodestar.d.ts +28 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +74 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +727 -0
- package/lib/network/gossip/topic.d.ts.map +1 -1
- package/lib/network/network.js +2 -2
- package/lib/network/network.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +14 -4
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +31 -3
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.js +1 -1
- package/lib/sync/backfill/backfill.d.ts +1 -1
- package/lib/sync/backfill/backfill.js +1 -1
- package/lib/sync/constants.d.ts +1 -1
- package/lib/sync/constants.js +1 -1
- package/lib/util/sszBytes.d.ts +4 -1
- package/lib/util/sszBytes.d.ts.map +1 -1
- package/lib/util/sszBytes.js +69 -12
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +15 -15
- package/src/api/impl/beacon/blocks/index.ts +36 -17
- package/src/chain/blocks/blockInput/types.ts +3 -3
- package/src/chain/blocks/importBlock.ts +36 -2
- package/src/chain/blocks/importExecutionPayload.ts +241 -0
- package/src/chain/blocks/payloadEnvelopeInput/index.ts +2 -0
- package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +336 -0
- package/src/chain/blocks/payloadEnvelopeInput/types.ts +33 -0
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +61 -0
- package/src/chain/blocks/types.ts +8 -0
- package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +55 -0
- package/src/chain/chain.ts +37 -3
- package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
- package/src/chain/forkChoice/index.ts +0 -10
- package/src/chain/interface.ts +6 -3
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/produceBlock/computeNewStateRoot.ts +6 -1
- package/src/chain/produceBlock/produceBlockBody.ts +1 -1
- package/src/chain/regen/interface.ts +2 -0
- package/src/chain/seenCache/index.ts +1 -1
- package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +106 -0
- package/src/chain/validation/executionPayloadEnvelope.ts +38 -25
- package/src/chain/validation/lightClientFinalityUpdate.ts +1 -1
- package/src/chain/validation/lightClientOptimisticUpdate.ts +1 -1
- package/src/chain/validatorMonitor.ts +11 -1
- package/src/execution/engine/interface.ts +2 -2
- package/src/metrics/metrics/lodestar.ts +77 -0
- package/src/network/network.ts +2 -2
- package/src/network/processor/extractSlotRootFns.ts +18 -5
- package/src/network/processor/gossipHandlers.ts +37 -1
- package/src/network/reqresp/ReqRespBeaconNode.ts +1 -1
- package/src/sync/backfill/backfill.ts +1 -1
- package/src/sync/constants.ts +1 -1
- package/src/util/sszBytes.ts +90 -10
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +0 -15
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +0 -1
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +0 -28
- package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +0 -1
- package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +0 -34
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { routes } from "@lodestar/api";
|
|
2
|
+
import { ForkName } from "@lodestar/params";
|
|
3
|
+
import { BeaconStateView, getExecutionPayloadEnvelopeSignatureSet, } from "@lodestar/state-transition";
|
|
4
|
+
import { processExecutionPayloadEnvelope } from "@lodestar/state-transition/block";
|
|
5
|
+
import { byteArrayEquals, fromHex, toRootHex } from "@lodestar/utils";
|
|
6
|
+
import { ExecutionPayloadStatus } from "../../execution/index.js";
|
|
7
|
+
import { isQueueErrorAborted } from "../../util/queue/index.js";
|
|
8
|
+
import { RegenCaller } from "../regen/interface.js";
|
|
9
|
+
const EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS = 64;
|
|
10
|
+
export { PayloadErrorCode };
|
|
11
|
+
var PayloadErrorCode;
|
|
12
|
+
(function (PayloadErrorCode) {
|
|
13
|
+
PayloadErrorCode["EXECUTION_ENGINE_INVALID"] = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID";
|
|
14
|
+
PayloadErrorCode["EXECUTION_ENGINE_ERROR"] = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR";
|
|
15
|
+
PayloadErrorCode["BLOCK_NOT_IN_FORK_CHOICE"] = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE";
|
|
16
|
+
PayloadErrorCode["STATE_TRANSITION_ERROR"] = "PAYLOAD_ERROR_STATE_TRANSITION_ERROR";
|
|
17
|
+
PayloadErrorCode["INVALID_SIGNATURE"] = "PAYLOAD_ERROR_INVALID_SIGNATURE";
|
|
18
|
+
})(PayloadErrorCode || (PayloadErrorCode = {}));
|
|
19
|
+
export class PayloadError extends Error {
|
|
20
|
+
type;
|
|
21
|
+
constructor(type, message) {
|
|
22
|
+
super(message ?? type.code);
|
|
23
|
+
this.type = type;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Import an execution payload envelope after all data is available.
|
|
28
|
+
*
|
|
29
|
+
* This function:
|
|
30
|
+
* 1. Gets the ProtoBlock from fork choice
|
|
31
|
+
* 2. Applies write-queue backpressure (waitForSpace) early, before verification
|
|
32
|
+
* 3. Regenerates the block state
|
|
33
|
+
* 4. Runs EL verification (notifyNewPayload) in parallel with signature verification and processExecutionPayloadEnvelope
|
|
34
|
+
* 5. Persists verified payload envelope to hot DB
|
|
35
|
+
* 6. Updates fork choice
|
|
36
|
+
* 7. Caches the post-execution payload state
|
|
37
|
+
* 8. Records metrics for column sources
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
export async function importExecutionPayload(payloadInput, opts = {}) {
|
|
41
|
+
const envelope = payloadInput.getPayloadEnvelope();
|
|
42
|
+
const blockRootHex = payloadInput.blockRootHex;
|
|
43
|
+
// 1. Get ProtoBlock for parent root lookup
|
|
44
|
+
const protoBlock = this.forkChoice.getBlockHexDefaultStatus(blockRootHex);
|
|
45
|
+
if (!protoBlock) {
|
|
46
|
+
throw new PayloadError({
|
|
47
|
+
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE,
|
|
48
|
+
blockRootHex,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// 2. Apply backpressure from the write queue early, before doing verification work.
|
|
52
|
+
// The actual DB write is deferred until after verification succeeds.
|
|
53
|
+
await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
|
|
54
|
+
// 3. Get pre-state for processExecutionPayloadEnvelope
|
|
55
|
+
// We need the block state (post-block, pre-payload) to process the envelope
|
|
56
|
+
const blockState = (await this.regen.getBlockSlotState(protoBlock, protoBlock.slot, { dontTransferCache: true }, RegenCaller.processBlock));
|
|
57
|
+
// 4. Run verification steps in parallel
|
|
58
|
+
// Note: No data availability check needed here - importExecutionPayload is only
|
|
59
|
+
// called when payloadInput.isComplete() is true, so all data is already available.
|
|
60
|
+
const [execResult, signatureValid, postPayloadResult] = await Promise.all([
|
|
61
|
+
this.executionEngine.notifyNewPayload(ForkName.gloas, envelope.message.payload, payloadInput.getVersionedHashes(), fromHex(protoBlock.parentRoot), envelope.message.executionRequests),
|
|
62
|
+
opts.validSignature === true
|
|
63
|
+
? Promise.resolve(true)
|
|
64
|
+
: (async () => {
|
|
65
|
+
const signatureSet = getExecutionPayloadEnvelopeSignatureSet(this.config, blockState.epochCtx.pubkeyCache, new BeaconStateView(blockState), envelope, payloadInput.proposerIndex);
|
|
66
|
+
return this.bls.verifySignatureSets([signatureSet]);
|
|
67
|
+
})(),
|
|
68
|
+
// Signature verified separately above.
|
|
69
|
+
// State root check is done separately below with better error typing (matching block pipeline pattern).
|
|
70
|
+
(async () => {
|
|
71
|
+
try {
|
|
72
|
+
return {
|
|
73
|
+
postPayloadState: processExecutionPayloadEnvelope(blockState, envelope, {
|
|
74
|
+
verifySignature: false,
|
|
75
|
+
verifyStateRoot: false,
|
|
76
|
+
}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
throw new PayloadError({
|
|
81
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
82
|
+
message: e.message,
|
|
83
|
+
}, `State transition error: ${e.message}`);
|
|
84
|
+
}
|
|
85
|
+
})(),
|
|
86
|
+
]);
|
|
87
|
+
// 4b. Check signature verification result
|
|
88
|
+
if (!signatureValid) {
|
|
89
|
+
throw new PayloadError({ code: PayloadErrorCode.INVALID_SIGNATURE });
|
|
90
|
+
}
|
|
91
|
+
// 5. Handle EL response
|
|
92
|
+
switch (execResult.status) {
|
|
93
|
+
case ExecutionPayloadStatus.VALID:
|
|
94
|
+
break;
|
|
95
|
+
case ExecutionPayloadStatus.INVALID:
|
|
96
|
+
throw new PayloadError({
|
|
97
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_INVALID,
|
|
98
|
+
execStatus: execResult.status,
|
|
99
|
+
errorMessage: execResult.validationError ?? "",
|
|
100
|
+
});
|
|
101
|
+
case ExecutionPayloadStatus.ACCEPTED:
|
|
102
|
+
case ExecutionPayloadStatus.SYNCING:
|
|
103
|
+
// TODO GLOAS: Handle optimistic import for payload - for now treat as error
|
|
104
|
+
throw new PayloadError({
|
|
105
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
|
|
106
|
+
execStatus: execResult.status,
|
|
107
|
+
errorMessage: execResult.validationError ?? "EL syncing, payload not yet validated",
|
|
108
|
+
});
|
|
109
|
+
case ExecutionPayloadStatus.INVALID_BLOCK_HASH:
|
|
110
|
+
case ExecutionPayloadStatus.ELERROR:
|
|
111
|
+
case ExecutionPayloadStatus.UNAVAILABLE:
|
|
112
|
+
throw new PayloadError({
|
|
113
|
+
code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
|
|
114
|
+
execStatus: execResult.status,
|
|
115
|
+
errorMessage: execResult.validationError ?? "",
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// 5b. Verify envelope state root matches post-state
|
|
119
|
+
const postPayloadState = postPayloadResult.postPayloadState;
|
|
120
|
+
const postPayloadStateRoot = postPayloadState.hashTreeRoot();
|
|
121
|
+
if (!byteArrayEquals(envelope.message.stateRoot, postPayloadStateRoot)) {
|
|
122
|
+
throw new PayloadError({
|
|
123
|
+
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
124
|
+
message: `Envelope state root mismatch expected=${toRootHex(envelope.message.stateRoot)} actual=${toRootHex(postPayloadStateRoot)}`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// 5c. Persist payload envelope to hot DB (performed asynchronously to avoid blocking)
|
|
128
|
+
this.unfinalizedPayloadEnvelopeWrites.push(payloadInput).catch((e) => {
|
|
129
|
+
if (!isQueueErrorAborted(e)) {
|
|
130
|
+
this.logger.error("Error pushing payload envelope to unfinalized write queue", { slot: payloadInput.slot, root: blockRootHex }, e);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
// 6. Update fork choice
|
|
134
|
+
this.forkChoice.onExecutionPayload(blockRootHex, payloadInput.getBlockHashHex(), envelope.message.payload.blockNumber, toRootHex(postPayloadStateRoot));
|
|
135
|
+
// 7. Cache payload state
|
|
136
|
+
// TODO GLOAS: Enable when PR #8868 merged (adds processPayloadState)
|
|
137
|
+
// this.regen.processPayloadState(postPayloadState);
|
|
138
|
+
// if epoch boundary also call
|
|
139
|
+
// this.regen.addCheckpointState(cp, checkpointState, true);
|
|
140
|
+
// 8. Record metrics for payload envelope and column sources
|
|
141
|
+
this.metrics?.importPayload.bySource.inc({ source: payloadInput.getPayloadEnvelopeSource().source });
|
|
142
|
+
for (const { source } of payloadInput.getSampledColumnsWithSource()) {
|
|
143
|
+
this.metrics?.importPayload.columnsBySource.inc({ source });
|
|
144
|
+
}
|
|
145
|
+
this.logger.verbose("Execution payload imported", {
|
|
146
|
+
slot: payloadInput.slot,
|
|
147
|
+
root: blockRootHex,
|
|
148
|
+
blockHash: payloadInput.getBlockHashHex(),
|
|
149
|
+
});
|
|
150
|
+
// 9. Emit event after payload is fully verified and imported to fork choice, only for recent enough payloads
|
|
151
|
+
const currentSlot = this.clock.currentSlot;
|
|
152
|
+
if (currentSlot - payloadInput.slot < EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS) {
|
|
153
|
+
this.emitter.emit(routes.events.EventType.executionPayloadAvailable, {
|
|
154
|
+
slot: payloadInput.slot,
|
|
155
|
+
blockRoot: blockRootHex,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=importExecutionPayload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importExecutionPayload.js","sourceRoot":"","sources":["../../../src/chain/blocks/importExecutionPayload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/chain/blocks/payloadEnvelopeInput/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/chain/blocks/payloadEnvelopeInput/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { DataColumnSidecars, RootHex, Slot, ValidatorIndex, deneb, gloas } from "@lodestar/types";
|
|
2
|
+
import { VersionedHashes } from "../../../execution/index.js";
|
|
3
|
+
import { AddPayloadEnvelopeProps, ColumnWithSource, CreateFromBlockProps, SourceMeta } from "./types.js";
|
|
4
|
+
export type PayloadEnvelopeInputState = {
|
|
5
|
+
hasPayload: false;
|
|
6
|
+
hasAllData: false;
|
|
7
|
+
hasComputedAllData: false;
|
|
8
|
+
} | {
|
|
9
|
+
hasPayload: false;
|
|
10
|
+
hasAllData: true;
|
|
11
|
+
hasComputedAllData: boolean;
|
|
12
|
+
} | {
|
|
13
|
+
hasPayload: true;
|
|
14
|
+
hasAllData: false;
|
|
15
|
+
hasComputedAllData: false;
|
|
16
|
+
payloadEnvelope: gloas.SignedExecutionPayloadEnvelope;
|
|
17
|
+
payloadEnvelopeSource: SourceMeta;
|
|
18
|
+
} | {
|
|
19
|
+
hasPayload: true;
|
|
20
|
+
hasAllData: true;
|
|
21
|
+
hasComputedAllData: boolean;
|
|
22
|
+
payloadEnvelope: gloas.SignedExecutionPayloadEnvelope;
|
|
23
|
+
payloadEnvelopeSource: SourceMeta;
|
|
24
|
+
timeCompleteSec: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Tracks bid + payload envelope + data columns for a Gloas block.
|
|
28
|
+
*
|
|
29
|
+
* Created during block import from signedExecutionPayloadBid in block body.
|
|
30
|
+
* Always has bid (required for creation).
|
|
31
|
+
*
|
|
32
|
+
* Completion requires: payload envelope + all sampled columns
|
|
33
|
+
*/
|
|
34
|
+
export declare class PayloadEnvelopeInput {
|
|
35
|
+
readonly blockRootHex: RootHex;
|
|
36
|
+
readonly slot: Slot;
|
|
37
|
+
readonly proposerIndex: ValidatorIndex;
|
|
38
|
+
readonly bid: gloas.ExecutionPayloadBid;
|
|
39
|
+
readonly versionedHashes: VersionedHashes;
|
|
40
|
+
private columnsCache;
|
|
41
|
+
private readonly sampledColumns;
|
|
42
|
+
private readonly custodyColumns;
|
|
43
|
+
private timeCreatedSec;
|
|
44
|
+
private readonly payloadEnvelopeDataPromise;
|
|
45
|
+
private readonly columnsDataPromise;
|
|
46
|
+
state: PayloadEnvelopeInputState;
|
|
47
|
+
private constructor();
|
|
48
|
+
static createFromBlock(props: CreateFromBlockProps): PayloadEnvelopeInput;
|
|
49
|
+
getBid(): gloas.ExecutionPayloadBid;
|
|
50
|
+
getBuilderIndex(): ValidatorIndex;
|
|
51
|
+
getBlockHashHex(): RootHex;
|
|
52
|
+
getBlobKzgCommitments(): deneb.BlobKzgCommitments;
|
|
53
|
+
addPayloadEnvelope(props: AddPayloadEnvelopeProps): void;
|
|
54
|
+
addColumn(columnWithSource: ColumnWithSource): void;
|
|
55
|
+
getVersionedHashes(): VersionedHashes;
|
|
56
|
+
hasPayloadEnvelope(): boolean;
|
|
57
|
+
getPayloadEnvelope(): gloas.SignedExecutionPayloadEnvelope;
|
|
58
|
+
getPayloadEnvelopeSource(): SourceMeta;
|
|
59
|
+
getSampledColumns(): gloas.DataColumnSidecars;
|
|
60
|
+
getSampledColumnsWithSource(): ColumnWithSource[];
|
|
61
|
+
getCustodyColumns(): gloas.DataColumnSidecars;
|
|
62
|
+
hasComputedAllData(): boolean;
|
|
63
|
+
waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<DataColumnSidecars>;
|
|
64
|
+
getTimeCreated(): number;
|
|
65
|
+
getTimeComplete(): number;
|
|
66
|
+
isComplete(): boolean;
|
|
67
|
+
waitForData(): Promise<gloas.SignedExecutionPayloadEnvelope>;
|
|
68
|
+
getSerializedCacheKeys(): object[];
|
|
69
|
+
getLogMeta(): {
|
|
70
|
+
slot: number;
|
|
71
|
+
blockRoot: string;
|
|
72
|
+
hasPayload: boolean;
|
|
73
|
+
hasAllData: boolean;
|
|
74
|
+
hasComputedAllData: boolean;
|
|
75
|
+
isComplete: boolean;
|
|
76
|
+
columnsCount: number;
|
|
77
|
+
sampledColumnsCount: number;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=payloadEnvelopeInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payloadEnvelopeInput.d.ts","sourceRoot":"","sources":["../../../../src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { NUMBER_OF_COLUMNS } from "@lodestar/params";
|
|
2
|
+
import { toRootHex, withTimeout } from "@lodestar/utils";
|
|
3
|
+
import { kzgCommitmentToVersionedHash } from "../../../util/blobs.js";
|
|
4
|
+
function createPromise() {
|
|
5
|
+
let resolve;
|
|
6
|
+
let reject;
|
|
7
|
+
const promise = new Promise((_resolve, _reject) => {
|
|
8
|
+
resolve = _resolve;
|
|
9
|
+
reject = _reject;
|
|
10
|
+
});
|
|
11
|
+
return { promise, resolve, reject };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Tracks bid + payload envelope + data columns for a Gloas block.
|
|
15
|
+
*
|
|
16
|
+
* Created during block import from signedExecutionPayloadBid in block body.
|
|
17
|
+
* Always has bid (required for creation).
|
|
18
|
+
*
|
|
19
|
+
* Completion requires: payload envelope + all sampled columns
|
|
20
|
+
*/
|
|
21
|
+
export class PayloadEnvelopeInput {
|
|
22
|
+
blockRootHex;
|
|
23
|
+
slot;
|
|
24
|
+
proposerIndex;
|
|
25
|
+
bid;
|
|
26
|
+
versionedHashes;
|
|
27
|
+
columnsCache = new Map();
|
|
28
|
+
sampledColumns;
|
|
29
|
+
custodyColumns;
|
|
30
|
+
timeCreatedSec;
|
|
31
|
+
payloadEnvelopeDataPromise;
|
|
32
|
+
columnsDataPromise;
|
|
33
|
+
state;
|
|
34
|
+
constructor(props) {
|
|
35
|
+
this.blockRootHex = props.blockRootHex;
|
|
36
|
+
this.slot = props.slot;
|
|
37
|
+
this.proposerIndex = props.proposerIndex;
|
|
38
|
+
this.bid = props.bid;
|
|
39
|
+
this.versionedHashes = props.bid.blobKzgCommitments.map(kzgCommitmentToVersionedHash);
|
|
40
|
+
this.sampledColumns = props.sampledColumns;
|
|
41
|
+
this.custodyColumns = props.custodyColumns;
|
|
42
|
+
this.timeCreatedSec = props.timeCreatedSec;
|
|
43
|
+
this.payloadEnvelopeDataPromise = createPromise();
|
|
44
|
+
this.columnsDataPromise = createPromise();
|
|
45
|
+
const noBlobs = props.bid.blobKzgCommitments.length === 0;
|
|
46
|
+
const noSampledColumns = props.sampledColumns.length === 0;
|
|
47
|
+
const hasAllData = noBlobs || noSampledColumns;
|
|
48
|
+
if (hasAllData) {
|
|
49
|
+
this.state = { hasPayload: false, hasAllData: true, hasComputedAllData: true };
|
|
50
|
+
this.columnsDataPromise.resolve(this.getSampledColumns());
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
this.state = { hasPayload: false, hasAllData: false, hasComputedAllData: false };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
static createFromBlock(props) {
|
|
57
|
+
const bid = props.block.message.body.signedExecutionPayloadBid.message;
|
|
58
|
+
return new PayloadEnvelopeInput({
|
|
59
|
+
blockRootHex: props.blockRootHex,
|
|
60
|
+
slot: props.block.message.slot,
|
|
61
|
+
proposerIndex: props.block.message.proposerIndex,
|
|
62
|
+
bid,
|
|
63
|
+
sampledColumns: props.sampledColumns,
|
|
64
|
+
custodyColumns: props.custodyColumns,
|
|
65
|
+
timeCreatedSec: props.timeCreatedSec,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getBid() {
|
|
69
|
+
return this.bid;
|
|
70
|
+
}
|
|
71
|
+
getBuilderIndex() {
|
|
72
|
+
return this.bid.builderIndex;
|
|
73
|
+
}
|
|
74
|
+
getBlockHashHex() {
|
|
75
|
+
return toRootHex(this.bid.blockHash);
|
|
76
|
+
}
|
|
77
|
+
getBlobKzgCommitments() {
|
|
78
|
+
return this.bid.blobKzgCommitments;
|
|
79
|
+
}
|
|
80
|
+
addPayloadEnvelope(props) {
|
|
81
|
+
if (this.state.hasPayload) {
|
|
82
|
+
throw new Error(`Payload envelope already set for block ${this.blockRootHex}`);
|
|
83
|
+
}
|
|
84
|
+
if (toRootHex(props.envelope.message.beaconBlockRoot) !== this.blockRootHex) {
|
|
85
|
+
throw new Error("Payload envelope beacon_block_root mismatch");
|
|
86
|
+
}
|
|
87
|
+
const source = {
|
|
88
|
+
source: props.source,
|
|
89
|
+
seenTimestampSec: props.seenTimestampSec,
|
|
90
|
+
peerIdStr: props.peerIdStr,
|
|
91
|
+
};
|
|
92
|
+
if (this.state.hasAllData) {
|
|
93
|
+
// Complete state
|
|
94
|
+
this.state = {
|
|
95
|
+
hasPayload: true,
|
|
96
|
+
hasAllData: true,
|
|
97
|
+
hasComputedAllData: this.state.hasComputedAllData,
|
|
98
|
+
payloadEnvelope: props.envelope,
|
|
99
|
+
payloadEnvelopeSource: source,
|
|
100
|
+
timeCompleteSec: props.seenTimestampSec,
|
|
101
|
+
};
|
|
102
|
+
this.payloadEnvelopeDataPromise.resolve(props.envelope);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Has payload, waiting for columns
|
|
106
|
+
this.state = {
|
|
107
|
+
hasPayload: true,
|
|
108
|
+
hasAllData: false,
|
|
109
|
+
hasComputedAllData: false,
|
|
110
|
+
payloadEnvelope: props.envelope,
|
|
111
|
+
payloadEnvelopeSource: source,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
addColumn(columnWithSource) {
|
|
116
|
+
const { columnSidecar, seenTimestampSec } = columnWithSource;
|
|
117
|
+
this.columnsCache.set(columnSidecar.index, columnWithSource);
|
|
118
|
+
const sampledColumns = this.getSampledColumns();
|
|
119
|
+
const hasAllData =
|
|
120
|
+
// already hasAllData
|
|
121
|
+
this.state.hasAllData ||
|
|
122
|
+
// has all sampled columns
|
|
123
|
+
sampledColumns.length === this.sampledColumns.length ||
|
|
124
|
+
// has enough columns to reconstruct the rest
|
|
125
|
+
this.columnsCache.size >= NUMBER_OF_COLUMNS / 2;
|
|
126
|
+
const hasComputedAllData =
|
|
127
|
+
// has all sampled columns
|
|
128
|
+
sampledColumns.length === this.sampledColumns.length;
|
|
129
|
+
if (!hasAllData) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (hasComputedAllData) {
|
|
133
|
+
this.columnsDataPromise.resolve(sampledColumns);
|
|
134
|
+
}
|
|
135
|
+
if (this.state.hasPayload) {
|
|
136
|
+
// Complete state
|
|
137
|
+
this.state = {
|
|
138
|
+
hasPayload: true,
|
|
139
|
+
hasAllData: true,
|
|
140
|
+
hasComputedAllData: hasComputedAllData || this.state.hasComputedAllData,
|
|
141
|
+
payloadEnvelope: this.state.payloadEnvelope,
|
|
142
|
+
payloadEnvelopeSource: this.state.payloadEnvelopeSource,
|
|
143
|
+
timeCompleteSec: seenTimestampSec,
|
|
144
|
+
};
|
|
145
|
+
this.payloadEnvelopeDataPromise.resolve(this.state.payloadEnvelope);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// No payload yet, all data ready
|
|
149
|
+
this.state = {
|
|
150
|
+
hasPayload: false,
|
|
151
|
+
hasAllData: true,
|
|
152
|
+
hasComputedAllData: hasComputedAllData || this.state.hasComputedAllData,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
getVersionedHashes() {
|
|
157
|
+
return this.versionedHashes;
|
|
158
|
+
}
|
|
159
|
+
hasPayloadEnvelope() {
|
|
160
|
+
return this.state.hasPayload;
|
|
161
|
+
}
|
|
162
|
+
getPayloadEnvelope() {
|
|
163
|
+
if (!this.state.hasPayload)
|
|
164
|
+
throw new Error("Payload envelope not set");
|
|
165
|
+
return this.state.payloadEnvelope;
|
|
166
|
+
}
|
|
167
|
+
getPayloadEnvelopeSource() {
|
|
168
|
+
if (!this.state.hasPayload)
|
|
169
|
+
throw new Error("Payload envelope source not set");
|
|
170
|
+
return this.state.payloadEnvelopeSource;
|
|
171
|
+
}
|
|
172
|
+
getSampledColumns() {
|
|
173
|
+
const columns = [];
|
|
174
|
+
for (const index of this.sampledColumns) {
|
|
175
|
+
const column = this.columnsCache.get(index);
|
|
176
|
+
if (column) {
|
|
177
|
+
columns.push(column.columnSidecar);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return columns;
|
|
181
|
+
}
|
|
182
|
+
getSampledColumnsWithSource() {
|
|
183
|
+
const columns = [];
|
|
184
|
+
for (const index of this.sampledColumns) {
|
|
185
|
+
const column = this.columnsCache.get(index);
|
|
186
|
+
if (column) {
|
|
187
|
+
columns.push(column);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return columns;
|
|
191
|
+
}
|
|
192
|
+
getCustodyColumns() {
|
|
193
|
+
const columns = [];
|
|
194
|
+
for (const index of this.custodyColumns) {
|
|
195
|
+
const column = this.columnsCache.get(index);
|
|
196
|
+
if (column) {
|
|
197
|
+
columns.push(column.columnSidecar);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return columns;
|
|
201
|
+
}
|
|
202
|
+
hasComputedAllData() {
|
|
203
|
+
return this.state.hasComputedAllData;
|
|
204
|
+
}
|
|
205
|
+
waitForComputedAllData(timeout, signal) {
|
|
206
|
+
if (this.state.hasComputedAllData) {
|
|
207
|
+
return Promise.resolve(this.getSampledColumns());
|
|
208
|
+
}
|
|
209
|
+
return withTimeout(() => this.columnsDataPromise.promise, timeout, signal);
|
|
210
|
+
}
|
|
211
|
+
getTimeCreated() {
|
|
212
|
+
return this.timeCreatedSec;
|
|
213
|
+
}
|
|
214
|
+
getTimeComplete() {
|
|
215
|
+
if (!this.state.hasPayload || !this.state.hasAllData)
|
|
216
|
+
throw new Error("Not yet complete");
|
|
217
|
+
return this.state.timeCompleteSec;
|
|
218
|
+
}
|
|
219
|
+
isComplete() {
|
|
220
|
+
return this.state.hasPayload && this.state.hasAllData;
|
|
221
|
+
}
|
|
222
|
+
async waitForData() {
|
|
223
|
+
return this.payloadEnvelopeDataPromise.promise;
|
|
224
|
+
}
|
|
225
|
+
getSerializedCacheKeys() {
|
|
226
|
+
const objects = [];
|
|
227
|
+
if (this.state.hasPayload) {
|
|
228
|
+
objects.push(this.state.payloadEnvelope);
|
|
229
|
+
}
|
|
230
|
+
for (const { columnSidecar } of this.columnsCache.values()) {
|
|
231
|
+
objects.push(columnSidecar);
|
|
232
|
+
}
|
|
233
|
+
return objects;
|
|
234
|
+
}
|
|
235
|
+
getLogMeta() {
|
|
236
|
+
return {
|
|
237
|
+
slot: this.slot,
|
|
238
|
+
blockRoot: this.blockRootHex,
|
|
239
|
+
hasPayload: this.state.hasPayload,
|
|
240
|
+
hasAllData: this.state.hasAllData,
|
|
241
|
+
hasComputedAllData: this.state.hasComputedAllData,
|
|
242
|
+
isComplete: this.isComplete(),
|
|
243
|
+
columnsCount: this.columnsCache.size,
|
|
244
|
+
sampledColumnsCount: this.sampledColumns.length,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=payloadEnvelopeInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payloadEnvelopeInput.js","sourceRoot":"","sources":["../../../../src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ForkPostGloas } from "@lodestar/params";
|
|
2
|
+
import { ColumnIndex, RootHex, SignedBeaconBlock, gloas } from "@lodestar/types";
|
|
3
|
+
export declare enum PayloadEnvelopeInputSource {
|
|
4
|
+
gossip = "gossip",
|
|
5
|
+
api = "api",
|
|
6
|
+
engine = "engine",
|
|
7
|
+
byRange = "req_resp_by_range",
|
|
8
|
+
byRoot = "req_resp_by_root",
|
|
9
|
+
recovery = "recovery"
|
|
10
|
+
}
|
|
11
|
+
export type SourceMeta = {
|
|
12
|
+
source: PayloadEnvelopeInputSource;
|
|
13
|
+
seenTimestampSec: number;
|
|
14
|
+
peerIdStr?: string;
|
|
15
|
+
};
|
|
16
|
+
export type ColumnWithSource = SourceMeta & {
|
|
17
|
+
columnSidecar: gloas.DataColumnSidecar;
|
|
18
|
+
};
|
|
19
|
+
export type CreateFromBlockProps = {
|
|
20
|
+
blockRootHex: RootHex;
|
|
21
|
+
block: SignedBeaconBlock<ForkPostGloas>;
|
|
22
|
+
sampledColumns: ColumnIndex[];
|
|
23
|
+
custodyColumns: ColumnIndex[];
|
|
24
|
+
timeCreatedSec: number;
|
|
25
|
+
};
|
|
26
|
+
export type AddPayloadEnvelopeProps = SourceMeta & {
|
|
27
|
+
envelope: gloas.SignedExecutionPayloadEnvelope;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/chain/blocks/payloadEnvelopeInput/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAE/E,oBAAY,0BAA0B;IACpC,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,OAAO,sBAAsB;IAC7B,MAAM,qBAAqB;IAC3B,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,0BAA0B,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG;IAC1C,aAAa,EAAE,KAAK,CAAC,iBAAiB,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACxC,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG;IACjD,QAAQ,EAAE,KAAK,CAAC,8BAA8B,CAAC;CAChD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { PayloadEnvelopeInputSource };
|
|
2
|
+
var PayloadEnvelopeInputSource;
|
|
3
|
+
(function (PayloadEnvelopeInputSource) {
|
|
4
|
+
PayloadEnvelopeInputSource["gossip"] = "gossip";
|
|
5
|
+
PayloadEnvelopeInputSource["api"] = "api";
|
|
6
|
+
PayloadEnvelopeInputSource["engine"] = "engine";
|
|
7
|
+
PayloadEnvelopeInputSource["byRange"] = "req_resp_by_range";
|
|
8
|
+
PayloadEnvelopeInputSource["byRoot"] = "req_resp_by_root";
|
|
9
|
+
PayloadEnvelopeInputSource["recovery"] = "recovery";
|
|
10
|
+
})(PayloadEnvelopeInputSource || (PayloadEnvelopeInputSource = {}));
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/chain/blocks/payloadEnvelopeInput/types.ts"],"names":[],"mappings":"SAGY,0BAA0B;AAAtC,IAAY,0BAOX;AAPD,WAAY,0BAA0B;IACpC,+CAAiB,CAAA;IACjB,yCAAW,CAAA;IACX,+CAAiB,CAAA;IACjB,2DAA6B,CAAA;IAC7B,yDAA2B,CAAA;IAC3B,mDAAqB,CAAA;AAAC,CACxB,EAPY,0BAA0B,KAA1B,0BAA0B,QAOrC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Metrics } from "../../metrics/metrics.js";
|
|
2
|
+
import { JobItemQueue } from "../../util/queue/index.js";
|
|
3
|
+
import type { BeaconChain } from "../chain.js";
|
|
4
|
+
import { PayloadEnvelopeInput } from "../seenCache/seenPayloadEnvelopeInput.js";
|
|
5
|
+
import { ImportPayloadOpts } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* PayloadEnvelopeProcessor processes payload envelope jobs in a queued fashion, one after the other.
|
|
8
|
+
*/
|
|
9
|
+
export declare class PayloadEnvelopeProcessor {
|
|
10
|
+
readonly jobQueue: JobItemQueue<[PayloadEnvelopeInput, ImportPayloadOpts], void>;
|
|
11
|
+
private readonly importStatus;
|
|
12
|
+
constructor(chain: BeaconChain, metrics: Metrics | null, signal: AbortSignal);
|
|
13
|
+
processPayloadEnvelopeJob(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=payloadEnvelopeProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payloadEnvelopeProcessor.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/payloadEnvelopeProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAC,oBAAoB,EAAC,MAAM,0CAA0C,CAAC;AAE9E,OAAO,EAAC,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAW7C;;GAEG;AACH,qBAAa,wBAAwB;IACnC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;IACjF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoE;IAEjG,YAAY,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAS3E;IAEK,yBAAyB,CAAC,YAAY,EAAE,oBAAoB,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB/G;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { JobItemQueue } from "../../util/queue/index.js";
|
|
2
|
+
import { importExecutionPayload } from "./importExecutionPayload.js";
|
|
3
|
+
// TODO GLOAS: Set to be equal to DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES for now
|
|
4
|
+
const QUEUE_MAX_LENGTH = 16;
|
|
5
|
+
var PayloadEnvelopeImportStatus;
|
|
6
|
+
(function (PayloadEnvelopeImportStatus) {
|
|
7
|
+
PayloadEnvelopeImportStatus["queued"] = "queued";
|
|
8
|
+
PayloadEnvelopeImportStatus["importing"] = "importing";
|
|
9
|
+
PayloadEnvelopeImportStatus["imported"] = "imported";
|
|
10
|
+
})(PayloadEnvelopeImportStatus || (PayloadEnvelopeImportStatus = {}));
|
|
11
|
+
/**
|
|
12
|
+
* PayloadEnvelopeProcessor processes payload envelope jobs in a queued fashion, one after the other.
|
|
13
|
+
*/
|
|
14
|
+
export class PayloadEnvelopeProcessor {
|
|
15
|
+
jobQueue;
|
|
16
|
+
importStatus = new WeakMap();
|
|
17
|
+
constructor(chain, metrics, signal) {
|
|
18
|
+
this.jobQueue = new JobItemQueue((payloadInput, opts) => {
|
|
19
|
+
this.importStatus.set(payloadInput, PayloadEnvelopeImportStatus.importing);
|
|
20
|
+
return importExecutionPayload.call(chain, payloadInput, opts);
|
|
21
|
+
}, { maxLength: QUEUE_MAX_LENGTH, noYieldIfOneItem: true, signal }, metrics?.payloadEnvelopeProcessorQueue ?? undefined);
|
|
22
|
+
}
|
|
23
|
+
async processPayloadEnvelopeJob(payloadInput, opts = {}) {
|
|
24
|
+
if (!payloadInput.isComplete()) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (this.importStatus.get(payloadInput) !== undefined) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
await this.jobQueue.waitForSpace();
|
|
31
|
+
// Re-check after await, as another call may have queued this payload.
|
|
32
|
+
if (this.importStatus.get(payloadInput) !== undefined) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.importStatus.set(payloadInput, PayloadEnvelopeImportStatus.queued);
|
|
36
|
+
try {
|
|
37
|
+
await this.jobQueue.push(payloadInput, opts);
|
|
38
|
+
this.importStatus.set(payloadInput, PayloadEnvelopeImportStatus.imported);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
this.importStatus.delete(payloadInput);
|
|
42
|
+
throw e;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=payloadEnvelopeProcessor.js.map
|