@lodestar/beacon-node 1.43.0-dev.ca1fc40294 → 1.43.0-dev.d166e3b6f7
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/chain/blocks/importExecutionPayload.d.ts +14 -13
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +59 -74
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/index.d.ts.map +1 -1
- package/lib/chain/blocks/index.js +0 -1
- package/lib/chain/blocks/index.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +14 -20
- package/lib/chain/blocks/types.d.ts.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 +76 -0
- package/lib/chain/blocks/verifyExecutionPayloadEnvelope.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 +2 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js +7 -0
- package/lib/chain/chain.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/forkChoice/index.js +2 -2
- package/lib/chain/forkChoice/index.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -1
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/prepareNextSlot.d.ts.map +1 -1
- package/lib/chain/prepareNextSlot.js +30 -10
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
- package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +27 -12
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +11 -4
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +20 -18
- package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -1
- 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 +11 -1
- package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
- package/package.json +16 -15
- package/src/chain/blocks/importExecutionPayload.ts +73 -93
- package/src/chain/blocks/index.ts +0 -1
- package/src/chain/blocks/types.ts +14 -25
- package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +129 -0
- package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
- package/src/chain/chain.ts +12 -0
- package/src/chain/errors/executionPayloadBid.ts +6 -0
- package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
- package/src/chain/forkChoice/index.ts +2 -2
- package/src/chain/interface.ts +2 -0
- package/src/chain/prepareNextSlot.ts +42 -12
- package/src/chain/produceBlock/produceBlockBody.ts +30 -10
- package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +22 -20
- package/src/chain/validation/executionPayloadBid.ts +14 -0
- package/src/chain/validation/executionPayloadEnvelope.ts +12 -2
|
@@ -6,7 +6,7 @@ export declare enum PayloadErrorCode {
|
|
|
6
6
|
EXECUTION_ENGINE_INVALID = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID",
|
|
7
7
|
EXECUTION_ENGINE_ERROR = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR",
|
|
8
8
|
BLOCK_NOT_IN_FORK_CHOICE = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE",
|
|
9
|
-
|
|
9
|
+
ENVELOPE_VERIFICATION_ERROR = "PAYLOAD_ERROR_ENVELOPE_VERIFICATION_ERROR",
|
|
10
10
|
INVALID_SIGNATURE = "PAYLOAD_ERROR_INVALID_SIGNATURE"
|
|
11
11
|
}
|
|
12
12
|
export type PayloadErrorType = {
|
|
@@ -21,7 +21,7 @@ export type PayloadErrorType = {
|
|
|
21
21
|
code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE;
|
|
22
22
|
blockRootHex: string;
|
|
23
23
|
} | {
|
|
24
|
-
code: PayloadErrorCode.
|
|
24
|
+
code: PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR;
|
|
25
25
|
message: string;
|
|
26
26
|
} | {
|
|
27
27
|
code: PayloadErrorCode.INVALID_SIGNATURE;
|
|
@@ -33,18 +33,19 @@ export declare class PayloadError extends Error {
|
|
|
33
33
|
/**
|
|
34
34
|
* Import an execution payload envelope after all data is available.
|
|
35
35
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* 2. Gets the ProtoBlock from fork choice
|
|
39
|
-
* 3. Applies write-queue backpressure (waitForSpace) early, before verification
|
|
40
|
-
* 4. Regenerates the block state
|
|
41
|
-
* 5. Runs EL verification (notifyNewPayload) in parallel with signature verification and processExecutionPayloadEnvelope
|
|
42
|
-
* 6. Persists verified payload envelope to hot DB
|
|
43
|
-
* 7. Updates fork choice
|
|
44
|
-
* 8. Caches the post-execution payload state
|
|
45
|
-
* 9. Records metrics for column sources
|
|
46
|
-
* 10. Emits `execution_payload` for recent enough payloads after successful import
|
|
36
|
+
* The envelope is only verified here, no state mutation. State effects from the payload
|
|
37
|
+
* are applied on the next block via processParentExecutionPayload.
|
|
47
38
|
*
|
|
39
|
+
* Steps:
|
|
40
|
+
* 1. Emit `execution_payload_available` event for payload attestation
|
|
41
|
+
* 2. Get the ProtoBlock from fork choice
|
|
42
|
+
* 3. Wait for data columns to be available
|
|
43
|
+
* 4. Regenerate state for envelope verification
|
|
44
|
+
* 5. Verify envelope (fields against state, signature, and EL in parallel where possible)
|
|
45
|
+
* 6. Persist verified payload envelope to hot DB (waits for write-queue space for backpressure)
|
|
46
|
+
* 7. Update fork choice (transitions the block's PENDING variant to FULL)
|
|
47
|
+
* 8. Record metrics for payload envelope and column sources
|
|
48
|
+
* 9. Emit `execution_payload` event
|
|
48
49
|
*/
|
|
49
50
|
export declare function importExecutionPayload(this: BeaconChain, payloadInput: PayloadEnvelopeInput, signal: AbortSignal, opts?: ImportPayloadOpts): Promise<void>;
|
|
50
51
|
//# sourceMappingURL=importExecutionPayload.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importExecutionPayload.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/importExecutionPayload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"importExecutionPayload.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/importExecutionPayload.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAExC,OAAO,EAAC,oBAAoB,EAAC,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAC,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAS7C,oBAAY,gBAAgB;IAC1B,wBAAwB,2CAA2C;IACnE,sBAAsB,yCAAyC;IAC/D,wBAAwB,2CAA2C;IACnE,2BAA2B,8CAA8C;IACzE,iBAAiB,oCAAoC;CACtD;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE,IAAI,EAAE,gBAAgB,CAAC,wBAAwB,CAAC;IAChD,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC,sBAAsB,CAAC;IAC9C,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC,wBAAwB,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC,2BAA2B,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;CAC1C,CAAC;AAEN,qBAAa,YAAa,SAAQ,KAAK;IACrC,IAAI,EAAE,gBAAgB,CAAC;IAEvB,YAAY,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAGnD;CACF;AAeD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,oBAAoB,EAClC,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA6Jf"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { routes } from "@lodestar/api";
|
|
2
2
|
import { ExecutionStatus } from "@lodestar/fork-choice";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { fromHex, toRootHex } from "@lodestar/utils";
|
|
3
|
+
import { isStatePostGloas } from "@lodestar/state-transition";
|
|
4
|
+
import { fromHex } from "@lodestar/utils";
|
|
6
5
|
import { ExecutionPayloadStatus } from "../../execution/index.js";
|
|
7
6
|
import { isQueueErrorAborted } from "../../util/queue/index.js";
|
|
8
7
|
import { RegenCaller } from "../regen/interface.js";
|
|
8
|
+
import { verifyExecutionPayloadEnvelope, verifyExecutionPayloadEnvelopeSignature, } from "./verifyExecutionPayloadEnvelope.js";
|
|
9
9
|
import { verifyPayloadsDataAvailability } from "./verifyPayloadsDataAvailability.js";
|
|
10
10
|
const EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS = 64;
|
|
11
11
|
export { PayloadErrorCode };
|
|
@@ -14,7 +14,7 @@ var PayloadErrorCode;
|
|
|
14
14
|
PayloadErrorCode["EXECUTION_ENGINE_INVALID"] = "PAYLOAD_ERROR_EXECUTION_ENGINE_INVALID";
|
|
15
15
|
PayloadErrorCode["EXECUTION_ENGINE_ERROR"] = "PAYLOAD_ERROR_EXECUTION_ENGINE_ERROR";
|
|
16
16
|
PayloadErrorCode["BLOCK_NOT_IN_FORK_CHOICE"] = "PAYLOAD_ERROR_BLOCK_NOT_IN_FORK_CHOICE";
|
|
17
|
-
PayloadErrorCode["
|
|
17
|
+
PayloadErrorCode["ENVELOPE_VERIFICATION_ERROR"] = "PAYLOAD_ERROR_ENVELOPE_VERIFICATION_ERROR";
|
|
18
18
|
PayloadErrorCode["INVALID_SIGNATURE"] = "PAYLOAD_ERROR_INVALID_SIGNATURE";
|
|
19
19
|
})(PayloadErrorCode || (PayloadErrorCode = {}));
|
|
20
20
|
export class PayloadError extends Error {
|
|
@@ -39,32 +39,34 @@ function toForkChoiceExecutionStatus(status) {
|
|
|
39
39
|
/**
|
|
40
40
|
* Import an execution payload envelope after all data is available.
|
|
41
41
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* 2. Gets the ProtoBlock from fork choice
|
|
45
|
-
* 3. Applies write-queue backpressure (waitForSpace) early, before verification
|
|
46
|
-
* 4. Regenerates the block state
|
|
47
|
-
* 5. Runs EL verification (notifyNewPayload) in parallel with signature verification and processExecutionPayloadEnvelope
|
|
48
|
-
* 6. Persists verified payload envelope to hot DB
|
|
49
|
-
* 7. Updates fork choice
|
|
50
|
-
* 8. Caches the post-execution payload state
|
|
51
|
-
* 9. Records metrics for column sources
|
|
52
|
-
* 10. Emits `execution_payload` for recent enough payloads after successful import
|
|
42
|
+
* The envelope is only verified here, no state mutation. State effects from the payload
|
|
43
|
+
* are applied on the next block via processParentExecutionPayload.
|
|
53
44
|
*
|
|
45
|
+
* Steps:
|
|
46
|
+
* 1. Emit `execution_payload_available` event for payload attestation
|
|
47
|
+
* 2. Get the ProtoBlock from fork choice
|
|
48
|
+
* 3. Wait for data columns to be available
|
|
49
|
+
* 4. Regenerate state for envelope verification
|
|
50
|
+
* 5. Verify envelope (fields against state, signature, and EL in parallel where possible)
|
|
51
|
+
* 6. Persist verified payload envelope to hot DB (waits for write-queue space for backpressure)
|
|
52
|
+
* 7. Update fork choice (transitions the block's PENDING variant to FULL)
|
|
53
|
+
* 8. Record metrics for payload envelope and column sources
|
|
54
|
+
* 9. Emit `execution_payload` event
|
|
54
55
|
*/
|
|
55
56
|
export async function importExecutionPayload(payloadInput, signal, opts = {}) {
|
|
56
57
|
const signedEnvelope = payloadInput.getPayloadEnvelope();
|
|
57
58
|
const envelope = signedEnvelope.message;
|
|
59
|
+
const slot = envelope.payload.slotNumber;
|
|
58
60
|
const blockRootHex = payloadInput.blockRootHex;
|
|
59
61
|
const blockHashHex = payloadInput.getBlockHashHex();
|
|
60
|
-
const fork = this.config.getForkName(
|
|
61
|
-
// 1. Emit `execution_payload_available` event at the start of import. At this point the
|
|
62
|
-
// is already complete, so the payload and required data are available for
|
|
63
|
-
// This event
|
|
64
|
-
// it before getting a response from the
|
|
65
|
-
if (this.clock.currentSlot -
|
|
62
|
+
const fork = this.config.getForkName(slot);
|
|
63
|
+
// 1. Emit `execution_payload_available` event at the start of import. At this point the
|
|
64
|
+
// payload input is already complete, so the payload and required data are available for
|
|
65
|
+
// payload attestation. This event only signals availability (not validity), so we can emit
|
|
66
|
+
// it before getting a response from the EL on whether the payload is valid or not.
|
|
67
|
+
if (this.clock.currentSlot - slot < EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS) {
|
|
66
68
|
this.emitter.emit(routes.events.EventType.executionPayloadAvailable, {
|
|
67
|
-
slot
|
|
69
|
+
slot,
|
|
68
70
|
blockRoot: blockRootHex,
|
|
69
71
|
});
|
|
70
72
|
}
|
|
@@ -76,54 +78,43 @@ export async function importExecutionPayload(payloadInput, signal, opts = {}) {
|
|
|
76
78
|
blockRootHex,
|
|
77
79
|
});
|
|
78
80
|
}
|
|
79
|
-
// 3. Wait for data columns to be available
|
|
81
|
+
// 3. Wait for data columns to be available.
|
|
80
82
|
// The helper is shared with future gloas sync services; take the single-item batch form here.
|
|
81
83
|
await verifyPayloadsDataAvailability([payloadInput], signal);
|
|
82
|
-
// 4.
|
|
83
|
-
// The actual DB write is deferred until after verification succeeds.
|
|
84
|
-
await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
|
|
85
|
-
// 5. Get pre-state for processExecutionPayloadEnvelope
|
|
86
|
-
// We need the block state (post-block, pre-payload) to process the envelope
|
|
84
|
+
// 4. Regenerate state for envelope verification
|
|
87
85
|
const blockState = await this.regen.getBlockSlotState(protoBlock, protoBlock.slot, { dontTransferCache: true }, RegenCaller.processBlock);
|
|
88
86
|
if (!isStatePostGloas(blockState)) {
|
|
89
87
|
throw new PayloadError({
|
|
90
|
-
code: PayloadErrorCode.
|
|
91
|
-
message: `Expected gloas+
|
|
88
|
+
code: PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR,
|
|
89
|
+
message: `Expected gloas+ state for payload import, got fork=${blockState.forkName}`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// 5. Verify envelope fields against state first to fail fast before the EL + BLS work.
|
|
93
|
+
// When validSignature is true, gossip/API has already verified both the signature and the
|
|
94
|
+
// executionRequestsRoot, so we skip those checks here.
|
|
95
|
+
try {
|
|
96
|
+
verifyExecutionPayloadEnvelope(this.config, blockState, envelope, {
|
|
97
|
+
verifyExecutionRequestsRoot: !opts.validSignature,
|
|
92
98
|
});
|
|
93
99
|
}
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
catch (e) {
|
|
101
|
+
throw new PayloadError({
|
|
102
|
+
code: PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR,
|
|
103
|
+
message: e.message,
|
|
104
|
+
}, `Envelope verification error: ${e.message}`);
|
|
105
|
+
}
|
|
106
|
+
// 5a. Run EL and signature verification in parallel
|
|
107
|
+
const [execResult, signatureValid] = await Promise.all([
|
|
96
108
|
this.executionEngine.notifyNewPayload(fork, envelope.payload, payloadInput.getVersionedHashes(), fromHex(protoBlock.parentRoot), envelope.executionRequests),
|
|
97
109
|
opts.validSignature === true
|
|
98
110
|
? Promise.resolve(true)
|
|
99
|
-
: (
|
|
100
|
-
const signatureSet = getExecutionPayloadEnvelopeSignatureSet(this.config, this.pubkeyCache, blockState, signedEnvelope, payloadInput.proposerIndex);
|
|
101
|
-
return this.bls.verifySignatureSets([signatureSet]);
|
|
102
|
-
})(),
|
|
103
|
-
// Signature verified separately above.
|
|
104
|
-
// State root check is done separately below with better error typing (matching block pipeline pattern).
|
|
105
|
-
(async () => {
|
|
106
|
-
try {
|
|
107
|
-
return {
|
|
108
|
-
postPayloadState: blockState.processExecutionPayloadEnvelope(signedEnvelope, {
|
|
109
|
-
verifySignature: false,
|
|
110
|
-
verifyStateRoot: false,
|
|
111
|
-
}),
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
catch (e) {
|
|
115
|
-
throw new PayloadError({
|
|
116
|
-
code: PayloadErrorCode.STATE_TRANSITION_ERROR,
|
|
117
|
-
message: e.message,
|
|
118
|
-
}, `State transition error: ${e.message}`);
|
|
119
|
-
}
|
|
120
|
-
})(),
|
|
111
|
+
: verifyExecutionPayloadEnvelopeSignature(this.config, blockState, this.pubkeyCache, signedEnvelope, payloadInput.proposerIndex, this.bls),
|
|
121
112
|
]);
|
|
122
|
-
//
|
|
113
|
+
// 5b. Check signature verification result
|
|
123
114
|
if (!signatureValid) {
|
|
124
115
|
throw new PayloadError({ code: PayloadErrorCode.INVALID_SIGNATURE });
|
|
125
116
|
}
|
|
126
|
-
//
|
|
117
|
+
// 5c. Handle EL response
|
|
127
118
|
switch (execResult.status) {
|
|
128
119
|
case ExecutionPayloadStatus.VALID:
|
|
129
120
|
break;
|
|
@@ -145,32 +136,26 @@ export async function importExecutionPayload(payloadInput, signal, opts = {}) {
|
|
|
145
136
|
errorMessage: execResult.validationError ?? "",
|
|
146
137
|
});
|
|
147
138
|
}
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// 6. Persist payload envelope to hot DB (performed asynchronously to avoid blocking)
|
|
139
|
+
// 6. Persist payload envelope to hot DB. Wait for write-queue space here to apply backpressure
|
|
140
|
+
// on the import pipeline during sync, then perform the write asynchronously to avoid blocking.
|
|
141
|
+
await this.unfinalizedPayloadEnvelopeWrites.waitForSpace();
|
|
152
142
|
this.unfinalizedPayloadEnvelopeWrites.push(payloadInput).catch((e) => {
|
|
153
143
|
if (!isQueueErrorAborted(e)) {
|
|
154
|
-
this.logger.error("Error pushing payload envelope to unfinalized write queue", { slot
|
|
144
|
+
this.logger.error("Error pushing payload envelope to unfinalized write queue", { slot, blockRoot: blockRootHex }, e);
|
|
155
145
|
}
|
|
156
146
|
});
|
|
157
|
-
// 7. Update fork choice
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
if (postPayloadState.slot % SLOTS_PER_EPOCH === 0) {
|
|
162
|
-
const { checkpoint } = postPayloadState.computeAnchorCheckpoint();
|
|
163
|
-
this.regen.addCheckpointState(checkpoint, postPayloadState);
|
|
164
|
-
}
|
|
165
|
-
// 9. Record metrics for payload envelope and column sources
|
|
147
|
+
// 7. Update fork choice, transitions the block's PENDING variant to FULL
|
|
148
|
+
const execStatus = toForkChoiceExecutionStatus(execResult.status);
|
|
149
|
+
this.forkChoice.onExecutionPayload(blockRootHex, blockHashHex, envelope.payload.blockNumber, execStatus);
|
|
150
|
+
// 8. Record metrics for payload envelope and column sources
|
|
166
151
|
this.metrics?.importPayload.bySource.inc({ source: payloadInput.getPayloadEnvelopeSource().source });
|
|
167
152
|
for (const { source } of payloadInput.getSampledColumnsWithSource()) {
|
|
168
153
|
this.metrics?.importPayload.columnsBySource.inc({ source });
|
|
169
154
|
}
|
|
170
|
-
//
|
|
171
|
-
if (this.clock.currentSlot -
|
|
155
|
+
// 9. Emit event after payload is fully verified and imported to fork choice, only for recent enough payloads
|
|
156
|
+
if (this.clock.currentSlot - slot < EVENTSTREAM_EMIT_RECENT_EXECUTION_PAYLOAD_SLOTS) {
|
|
172
157
|
this.emitter.emit(routes.events.EventType.executionPayload, {
|
|
173
|
-
slot
|
|
158
|
+
slot,
|
|
174
159
|
builderIndex: envelope.builderIndex,
|
|
175
160
|
blockHash: blockHashHex,
|
|
176
161
|
blockRoot: blockRootHex,
|
|
@@ -179,7 +164,7 @@ export async function importExecutionPayload(payloadInput, signal, opts = {}) {
|
|
|
179
164
|
});
|
|
180
165
|
}
|
|
181
166
|
this.logger.verbose("Execution payload imported", {
|
|
182
|
-
slot
|
|
167
|
+
slot,
|
|
183
168
|
builderIndex: envelope.builderIndex,
|
|
184
169
|
blockRoot: blockRootHex,
|
|
185
170
|
blockHash: blockHashHex,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importExecutionPayload.js","sourceRoot":"","sources":["../../../src/chain/blocks/importExecutionPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,eAAe,EAAyB,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"importExecutionPayload.js","sourceRoot":"","sources":["../../../src/chain/blocks/importExecutionPayload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAsB,MAAM,2BAA2B,CAAC;AAC5E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAqB,eAAe,EAAC,MAAM,YAAY,CAAC;AAK/D,OAAO,EAAC,oBAAoB,EAAE,KAAK,eAAe,EAAC,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IAExE,YAAY,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAQnG;IAEK,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF;CACF;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,EAAE,EACrB,IAAI,EAAE,gBAAgB,GAAG,eAAe,GACvC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAsB,MAAM,2BAA2B,CAAC;AAC5E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAqB,eAAe,EAAC,MAAM,YAAY,CAAC;AAK/D,OAAO,EAAC,oBAAoB,EAAE,KAAK,eAAe,EAAC,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IAExE,YAAY,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAQnG;IAEK,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF;CACF;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,EAAE,EACrB,IAAI,EAAE,gBAAgB,GAAG,eAAe,GACvC,OAAO,CAAC,IAAI,CAAC,CA6Ff"}
|
|
@@ -61,7 +61,6 @@ export async function processBlocks(blocks, opts) {
|
|
|
61
61
|
const fullyVerifiedBlocks = relevantBlocks.map((block, i) => ({
|
|
62
62
|
blockInput: block,
|
|
63
63
|
postState: postStates[i],
|
|
64
|
-
postPayloadState: null,
|
|
65
64
|
parentBlockSlot: parentSlots[i],
|
|
66
65
|
executionStatus: executionStatuses[i],
|
|
67
66
|
// start supporting optimistic syncing/processing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chain/blocks/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chain/blocks/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChainForkConfig } from "@lodestar/config";
|
|
2
|
-
import { BlockExecutionStatus
|
|
2
|
+
import { BlockExecutionStatus } from "@lodestar/fork-choice";
|
|
3
3
|
import { DataAvailabilityStatus, IBeaconStateView } from "@lodestar/state-transition";
|
|
4
4
|
import type { IndexedAttestation, Slot, fulu } from "@lodestar/types";
|
|
5
5
|
import { IBlockInput } from "./blockInput/types.js";
|
|
@@ -30,8 +30,9 @@ export declare enum BlobSidecarValidation {
|
|
|
30
30
|
}
|
|
31
31
|
export type ImportPayloadOpts = {
|
|
32
32
|
/**
|
|
33
|
-
* Set to true
|
|
34
|
-
*
|
|
33
|
+
* Set to true when the envelope was already validated upstream (e.g., gossip/API validation):
|
|
34
|
+
* signature is trusted and execution_requests_root was already verified against the bid.
|
|
35
|
+
* When false/undefined, both are verified during import.
|
|
35
36
|
*/
|
|
36
37
|
validSignature?: boolean;
|
|
37
38
|
};
|
|
@@ -73,7 +74,14 @@ export type ImportBlockOpts = {
|
|
|
73
74
|
/** Seen timestamp seconds */
|
|
74
75
|
seenTimestampSec?: number;
|
|
75
76
|
};
|
|
76
|
-
|
|
77
|
+
/**
|
|
78
|
+
* A wrapper around a `SignedBeaconBlock` that indicates that this block is fully verified and ready to import.
|
|
79
|
+
*
|
|
80
|
+
* `executionStatus` reflects the outcome of execution payload verification at block-import time:
|
|
81
|
+
* - pre-gloas: Valid | Syncing | PreMerge (from EL notifyNewPayload against the in-block payload)
|
|
82
|
+
* - post-gloas: PayloadSeparated (payload arrives separately as an envelope and is imported later)
|
|
83
|
+
*/
|
|
84
|
+
export type FullyVerifiedBlock = {
|
|
77
85
|
blockInput: IBlockInput;
|
|
78
86
|
postState: IBeaconStateView;
|
|
79
87
|
parentBlockSlot: Slot;
|
|
@@ -83,22 +91,8 @@ type FullyVerifiedBlockBase = {
|
|
|
83
91
|
indexedAttestations: IndexedAttestation[];
|
|
84
92
|
/** Seen timestamp seconds */
|
|
85
93
|
seenTimestampSec: number;
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* A wrapper around a `SignedBeaconBlock` that indicates that this block is fully verified and ready to import.
|
|
89
|
-
*
|
|
90
|
-
* Discriminated union on `postPayloadState`:
|
|
91
|
-
* - `null` → block has no pre-verified envelope; `executionStatus` is any `BlockExecutionStatus`
|
|
92
|
-
* - non-null → envelope was pre-verified during state transition; `executionStatus` is narrowed to
|
|
93
|
-
* `Valid | Syncing` (matching what `forkChoice.onExecutionPayload` expects)
|
|
94
|
-
*/
|
|
95
|
-
export type FullyVerifiedBlock = FullyVerifiedBlockBase & ({
|
|
96
|
-
postPayloadState: null;
|
|
97
|
-
/** If the execution payload couldn't be verified because of EL syncing status, used in optimistic sync or for merge block */
|
|
94
|
+
/** If the execution payload couldn't be verified because of EL syncing status, used in optimistic sync */
|
|
98
95
|
executionStatus: BlockExecutionStatus;
|
|
99
|
-
}
|
|
100
|
-
postPayloadState: IBeaconStateView;
|
|
101
|
-
executionStatus: PayloadExecutionStatus;
|
|
102
|
-
});
|
|
96
|
+
};
|
|
103
97
|
export {};
|
|
104
98
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAC,oBAAoB,EAAC,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAC,sBAAsB,EAAE,gBAAgB,EAAqB,MAAM,4BAA4B,CAAC;AACxG,OAAO,KAAK,EAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAElD,oBAAY,iBAAiB;IAC3B,KAAK,UAAU;IACf,IAAI,SAAS;IACb,UAAU,gBAAgB;CAC3B;AAED,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC;IACnC,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAMrG;AAED,oBAAY,oBAAoB;IAC9B,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED,oBAAY,qBAAqB;IAC/B,gFAAgF;IAChF,UAAU,IAAA;IACV;;;;OAIG;IACH,IAAI,IAAA;CACL;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAC1C,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,WAAW,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,eAAe,EAAE,IAAI,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,4FAA4F;IAC5F,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,0GAA0G;IAC1G,eAAe,EAAE,oBAAoB,CAAC;CACvC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BeaconConfig } from "@lodestar/config";
|
|
2
|
+
import { type IBeaconStateViewGloas, type PubkeyCache } from "@lodestar/state-transition";
|
|
3
|
+
import { gloas } from "@lodestar/types";
|
|
4
|
+
import { IBlsVerifier } from "../bls/index.js";
|
|
5
|
+
export type VerifyExecutionPayloadEnvelopeOpts = {
|
|
6
|
+
verifyExecutionRequestsRoot?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Verify execution payload envelope fields against the post-block state.
|
|
10
|
+
*
|
|
11
|
+
* Signature verification and the execution engine call (`verify_and_notify_new_payload`) are
|
|
12
|
+
* performed outside this function, see `verifyExecutionPayloadEnvelopeSignature` and
|
|
13
|
+
* `importExecutionPayload` which run both in parallel with this check.
|
|
14
|
+
*
|
|
15
|
+
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.5/specs/gloas/fork-choice.md#new-verify_execution_payload_envelope
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifyExecutionPayloadEnvelope(config: BeaconConfig, state: IBeaconStateViewGloas, envelope: gloas.ExecutionPayloadEnvelope, opts?: VerifyExecutionPayloadEnvelopeOpts): void;
|
|
18
|
+
/**
|
|
19
|
+
* Verify the BLS signature of an execution payload envelope.
|
|
20
|
+
*
|
|
21
|
+
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.5/specs/gloas/fork-choice.md#new-verify_execution_payload_envelope_signature
|
|
22
|
+
*/
|
|
23
|
+
export declare function verifyExecutionPayloadEnvelopeSignature(config: BeaconConfig, state: IBeaconStateViewGloas, pubkeyCache: PubkeyCache, signedEnvelope: gloas.SignedExecutionPayloadEnvelope, proposerIndex: number, bls: IBlsVerifier): Promise<boolean>;
|
|
24
|
+
//# sourceMappingURL=verifyExecutionPayloadEnvelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyExecutionPayloadEnvelope.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/verifyExecutionPayloadEnvelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAGjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,KAAK,EAAM,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,MAAM,MAAM,kCAAkC,GAAG;IAC/C,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,KAAK,CAAC,wBAAwB,EACxC,IAAI,CAAC,EAAE,kCAAkC,GACxC,IAAI,CA4EN;AAED;;;;GAIG;AACH,wBAAsB,uCAAuC,CAC3D,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,qBAAqB,EAC5B,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,KAAK,CAAC,8BAA8B,EACpD,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { computeTimeAtSlot, getExecutionPayloadEnvelopeSignatureSet, } from "@lodestar/state-transition";
|
|
2
|
+
import { ssz } from "@lodestar/types";
|
|
3
|
+
import { byteArrayEquals, toHex, toRootHex } from "@lodestar/utils";
|
|
4
|
+
/**
|
|
5
|
+
* Verify execution payload envelope fields against the post-block state.
|
|
6
|
+
*
|
|
7
|
+
* Signature verification and the execution engine call (`verify_and_notify_new_payload`) are
|
|
8
|
+
* performed outside this function, see `verifyExecutionPayloadEnvelopeSignature` and
|
|
9
|
+
* `importExecutionPayload` which run both in parallel with this check.
|
|
10
|
+
*
|
|
11
|
+
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.5/specs/gloas/fork-choice.md#new-verify_execution_payload_envelope
|
|
12
|
+
*/
|
|
13
|
+
export function verifyExecutionPayloadEnvelope(config, state, envelope, opts) {
|
|
14
|
+
const { verifyExecutionRequestsRoot = true } = opts ?? {};
|
|
15
|
+
const payload = envelope.payload;
|
|
16
|
+
// Verify consistency with the beacon block.
|
|
17
|
+
// Compute header root on a copy of latestBlockHeader to avoid mutating state.
|
|
18
|
+
const headerValue = { ...state.latestBlockHeader };
|
|
19
|
+
if (byteArrayEquals(headerValue.stateRoot, ssz.Root.defaultValue())) {
|
|
20
|
+
headerValue.stateRoot = state.hashTreeRoot();
|
|
21
|
+
}
|
|
22
|
+
const headerRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(headerValue);
|
|
23
|
+
if (!byteArrayEquals(envelope.beaconBlockRoot, headerRoot)) {
|
|
24
|
+
throw new Error(`Envelope's block is not the latest block header envelope=${toRootHex(envelope.beaconBlockRoot)} latestBlockHeader=${toRootHex(headerRoot)}`);
|
|
25
|
+
}
|
|
26
|
+
// Verify consistency with the committed bid
|
|
27
|
+
const bid = state.latestExecutionPayloadBid;
|
|
28
|
+
if (envelope.builderIndex !== bid.builderIndex) {
|
|
29
|
+
throw new Error(`Builder index mismatch between envelope and committed bid envelope=${envelope.builderIndex} bid=${bid.builderIndex}`);
|
|
30
|
+
}
|
|
31
|
+
if (!byteArrayEquals(bid.prevRandao, payload.prevRandao)) {
|
|
32
|
+
throw new Error(`Prev randao mismatch between bid and payload bid=${toHex(bid.prevRandao)} payload=${toHex(payload.prevRandao)}`);
|
|
33
|
+
}
|
|
34
|
+
if (Number(bid.gasLimit) !== payload.gasLimit) {
|
|
35
|
+
throw new Error(`Gas limit mismatch between payload and bid payload=${payload.gasLimit} bid=${Number(bid.gasLimit)}`);
|
|
36
|
+
}
|
|
37
|
+
if (!byteArrayEquals(bid.blockHash, payload.blockHash)) {
|
|
38
|
+
throw new Error(`Block hash mismatch between payload and bid payload=${toRootHex(payload.blockHash)} bid=${toRootHex(bid.blockHash)}`);
|
|
39
|
+
}
|
|
40
|
+
// Verify execution_requests_root matches bid commitment.
|
|
41
|
+
// Can be skipped if already verified during gossip validation.
|
|
42
|
+
if (verifyExecutionRequestsRoot) {
|
|
43
|
+
const requestsRoot = ssz.electra.ExecutionRequests.hashTreeRoot(envelope.executionRequests);
|
|
44
|
+
if (!byteArrayEquals(requestsRoot, bid.executionRequestsRoot)) {
|
|
45
|
+
throw new Error(`Execution requests root mismatch envelope=${toRootHex(requestsRoot)} bid=${toRootHex(bid.executionRequestsRoot)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Verify the execution payload is valid
|
|
49
|
+
if (payload.slotNumber !== state.slot) {
|
|
50
|
+
throw new Error(`Slot mismatch between payload and state payload=${payload.slotNumber} state=${state.slot}`);
|
|
51
|
+
}
|
|
52
|
+
if (!byteArrayEquals(payload.parentHash, state.latestBlockHash)) {
|
|
53
|
+
throw new Error(`Parent hash mismatch between payload and state payload=${toRootHex(payload.parentHash)} state=${toRootHex(state.latestBlockHash)}`);
|
|
54
|
+
}
|
|
55
|
+
const expectedTimestamp = computeTimeAtSlot(config, state.slot, state.genesisTime);
|
|
56
|
+
if (payload.timestamp !== expectedTimestamp) {
|
|
57
|
+
throw new Error(`Timestamp mismatch between payload and state payload=${payload.timestamp} state=${expectedTimestamp}`);
|
|
58
|
+
}
|
|
59
|
+
// Verify consistency with expected withdrawals
|
|
60
|
+
const payloadWithdrawalsRoot = ssz.capella.Withdrawals.hashTreeRoot(payload.withdrawals);
|
|
61
|
+
const expectedWithdrawalsRoot = ssz.capella.Withdrawals.hashTreeRoot(state.payloadExpectedWithdrawals);
|
|
62
|
+
if (!byteArrayEquals(payloadWithdrawalsRoot, expectedWithdrawalsRoot)) {
|
|
63
|
+
throw new Error(`Withdrawals mismatch between payload and expected payload=${toRootHex(payloadWithdrawalsRoot)} expected=${toRootHex(expectedWithdrawalsRoot)}`);
|
|
64
|
+
}
|
|
65
|
+
// Execution engine verification (verify_and_notify_new_payload) is done externally by the caller
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Verify the BLS signature of an execution payload envelope.
|
|
69
|
+
*
|
|
70
|
+
* Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.5/specs/gloas/fork-choice.md#new-verify_execution_payload_envelope_signature
|
|
71
|
+
*/
|
|
72
|
+
export async function verifyExecutionPayloadEnvelopeSignature(config, state, pubkeyCache, signedEnvelope, proposerIndex, bls) {
|
|
73
|
+
const signatureSet = getExecutionPayloadEnvelopeSignatureSet(config, pubkeyCache, state, signedEnvelope, proposerIndex);
|
|
74
|
+
return bls.verifySignatureSets([signatureSet]);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=verifyExecutionPayloadEnvelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyExecutionPayloadEnvelope.js","sourceRoot":"","sources":["../../../src/chain/blocks/verifyExecutionPayloadEnvelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { PayloadEnvelopeInput } from "../seenCache/seenPayloadEnvelopeInput.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Persists payload envelope data to DB. This operation must be eventually completed if a payload is imported.
|
|
5
5
|
*
|
|
6
|
-
* TODO GLOAS: Persist envelope metadata (
|
|
6
|
+
* TODO GLOAS: Persist envelope metadata (executionRequests, builderIndex, etc.) without the full
|
|
7
7
|
* execution payload body — only keep the blockHash reference. The EL already stores the payload.
|
|
8
8
|
* See https://github.com/ChainSafe/lodestar/issues/5671
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writePayloadEnvelopeInputToDb.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/writePayloadEnvelopeInputToDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,oBAAoB,EAAC,MAAM,0CAA0C,CAAC;AAG9E;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"writePayloadEnvelopeInputToDb.d.ts","sourceRoot":"","sources":["../../../src/chain/blocks/writePayloadEnvelopeInputToDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,oBAAoB,EAAC,MAAM,0CAA0C,CAAC;AAG9E;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,oBAAoB,GACjC,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
|
@@ -2,7 +2,7 @@ import { writeDataColumnsToDb } from "./writeBlockInputToDb.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* Persists payload envelope data to DB. This operation must be eventually completed if a payload is imported.
|
|
4
4
|
*
|
|
5
|
-
* TODO GLOAS: Persist envelope metadata (
|
|
5
|
+
* TODO GLOAS: Persist envelope metadata (executionRequests, builderIndex, etc.) without the full
|
|
6
6
|
* execution payload body — only keep the blockHash reference. The EL already stores the payload.
|
|
7
7
|
* See https://github.com/ChainSafe/lodestar/issues/5671
|
|
8
8
|
*/
|
|
@@ -21,20 +21,11 @@ export async function writePayloadEnvelopeInputToDb(payloadInput) {
|
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
23
|
export async function persistPayloadEnvelopeInput(payloadInput) {
|
|
24
|
-
await writePayloadEnvelopeInputToDb
|
|
25
|
-
.call(this, payloadInput)
|
|
26
|
-
.catch((e) => {
|
|
24
|
+
await writePayloadEnvelopeInputToDb.call(this, payloadInput).catch((e) => {
|
|
27
25
|
this.logger.error("Error persisting payload envelope in hot db", {
|
|
28
26
|
slot: payloadInput.slot,
|
|
29
27
|
root: payloadInput.blockRootHex,
|
|
30
28
|
}, e);
|
|
31
|
-
})
|
|
32
|
-
.finally(() => {
|
|
33
|
-
this.seenPayloadEnvelopeInputCache.prune(payloadInput.blockRootHex);
|
|
34
|
-
this.logger.debug("Pruned payload envelope input", {
|
|
35
|
-
slot: payloadInput.slot,
|
|
36
|
-
root: payloadInput.blockRootHex,
|
|
37
|
-
});
|
|
38
29
|
});
|
|
39
30
|
}
|
|
40
31
|
//# sourceMappingURL=writePayloadEnvelopeInputToDb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writePayloadEnvelopeInputToDb.js","sourceRoot":"","sources":["../../../src/chain/blocks/writePayloadEnvelopeInputToDb.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAEjD,YAAkC,EACnB;IACf,MAAM,QAAQ,GAAG,YAAY,CAAC,kBAAkB,EAAE,CAAC;IACnD,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;IAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAC7G,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnD,mFAAmF;IACnF,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;QACpD,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;AAAA,CACJ;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAE/C,YAAkC,EACnB;IACf,MAAM,6BAA6B
|
|
1
|
+
{"version":3,"file":"writePayloadEnvelopeInputToDb.js","sourceRoot":"","sources":["../../../src/chain/blocks/writePayloadEnvelopeInputToDb.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAEjD,YAAkC,EACnB;IACf,MAAM,QAAQ,GAAG,YAAY,CAAC,kBAAkB,EAAE,CAAC;IACnD,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;IAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAC7G,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnD,mFAAmF;IACnF,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;QACpD,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;AAAA,CACJ;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAE/C,YAAkC,EACnB;IACf,MAAM,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,6CAA6C,EAC7C;YACE,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,IAAI,EAAE,YAAY,CAAC,YAAY;SAChC,EACD,CAAC,CACF,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACJ"}
|
package/lib/chain/chain.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Type } from "@chainsafe/ssz";
|
|
|
3
3
|
import { BeaconConfig } from "@lodestar/config";
|
|
4
4
|
import { CheckpointWithHex, IForkChoice, ProtoBlock } from "@lodestar/fork-choice";
|
|
5
5
|
import { EpochShuffling, IBeaconStateView, PubkeyCache } from "@lodestar/state-transition";
|
|
6
|
-
import { BeaconBlock, BlindedBeaconBlock, DataColumnSidecar, Epoch, Root, RootHex, SignedBeaconBlock, Slot, Status, UintNum64, ValidatorIndex, Wei, deneb, gloas, phase0, rewards } from "@lodestar/types";
|
|
6
|
+
import { BeaconBlock, BlindedBeaconBlock, DataColumnSidecar, Epoch, Root, RootHex, SignedBeaconBlock, Slot, Status, UintNum64, ValidatorIndex, Wei, deneb, electra, gloas, phase0, rewards } from "@lodestar/types";
|
|
7
7
|
import { Logger } from "@lodestar/utils";
|
|
8
8
|
import { ProcessShutdownCallback } from "@lodestar/validator";
|
|
9
9
|
import { IBeaconDb } from "../db/index.js";
|
|
@@ -184,6 +184,7 @@ export declare class BeaconChain implements IBeaconChain {
|
|
|
184
184
|
getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null>;
|
|
185
185
|
getSerializedExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null>;
|
|
186
186
|
getExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<gloas.SignedExecutionPayloadEnvelope | null>;
|
|
187
|
+
getParentExecutionRequests(parentBlockSlot: Slot, parentBlockRootHex: RootHex): Promise<electra.ExecutionRequests>;
|
|
187
188
|
getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]>;
|
|
188
189
|
getSerializedDataColumnSidecars(blockSlot: Slot, blockRootHex: string, indices: number[]): Promise<(Uint8Array | undefined)[]>;
|
|
189
190
|
produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody>;
|