@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
35 lines (30 loc) • 1.36 kB
text/typescript
import {ResponseOutgoing} from "@lodestar/reqresp";
import {computeEpochAtSlot} from "@lodestar/state-transition";
import {toRootHex} from "@lodestar/utils";
import {IBeaconChain} from "../../../chain/index.js";
import {IBeaconDb} from "../../../db/index.js";
import {ExecutionPayloadEnvelopesByRootRequest} from "../../../util/types.js";
export async function* onExecutionPayloadEnvelopesByRoot(
requestBody: ExecutionPayloadEnvelopesByRootRequest,
chain: IBeaconChain,
db: IBeaconDb
): AsyncIterable<ResponseOutgoing> {
// The gloas req/resp spec uses MIN_EPOCHS_FOR_BLOCK_REQUESTS to define the minimum range peers MUST serve.
// Archival nodes may still serve older retained payloads to allow genesis sync.
for (const root of requestBody) {
const rootHex = toRootHex(root);
const block = chain.forkChoice.getBlockHexDefaultStatus(rootHex);
// If the block is not in fork choice, it may be finalized. Attempt to find its slot in block archive
const slot = block ? block.slot : await db.blockArchive.getSlotByRoot(root);
if (slot === null) {
continue;
}
const envelopeBytes = await chain.getSerializedExecutionPayloadEnvelope(slot, rootHex);
if (envelopeBytes) {
yield {
data: envelopeBytes,
boundary: chain.config.getForkBoundaryAtEpoch(computeEpochAtSlot(slot)),
};
}
}
}