UNPKG

@lodestar/prover

Version:

A Typescript implementation of the Ethereum Consensus light client

73 lines 3.53 kB
import { eth_call } from "../verified_requests/eth_call.js"; import { eth_estimateGas } from "../verified_requests/eth_estimateGas.js"; import { eth_getBalance } from "../verified_requests/eth_getBalance.js"; import { eth_getBlockByHash } from "../verified_requests/eth_getBlockByHash.js"; import { eth_getBlockByNumber } from "../verified_requests/eth_getBlockByNumber.js"; import { eth_getCode } from "../verified_requests/eth_getCode.js"; import { eth_getTransactionCount } from "../verified_requests/eth_getTransactionCount.js"; import { getResponseForRequest, isBatchRequest, isRequest } from "./json_rpc.js"; import { isNullish } from "./validation.js"; // biome-ignore lint/suspicious/noExplicitAny: <explanation> export const verifiableMethodHandlers = { eth_getBalance: eth_getBalance, eth_getTransactionCount: eth_getTransactionCount, eth_getBlockByHash: eth_getBlockByHash, eth_getBlockByNumber: eth_getBlockByNumber, eth_getCode: eth_getCode, eth_call: eth_call, eth_estimateGas: eth_estimateGas, }; export const verifiableMethods = Object.keys(verifiableMethodHandlers); export const alwaysAllowedMethods = ["eth_subscribe", "eth_unsubscribe", "eth_getProof"]; export function splitRequestsInChunks(payload, unverifiedWhitelist) { const verifiable = []; const nonVerifiable = []; const blocked = []; for (const pay of isBatchRequest(payload) ? payload : [payload]) { if (isRequest(pay) && verifiableMethods.includes(pay.method)) { verifiable.push(pay); continue; } // If unverifiedWhitelist is not set that implies all methods are allowed if ((isRequest(pay) && isNullish(unverifiedWhitelist)) || unverifiedWhitelist?.includes(pay.method)) { nonVerifiable.push(pay); continue; } if (alwaysAllowedMethods.includes(pay.method)) { nonVerifiable.push(pay); continue; } blocked.push(pay); } return { verifiable, nonVerifiable, blocked }; } export async function processAndVerifyRequest({ payload, rpc, proofProvider, logger, }) { await proofProvider.waitToBeReady(); const { verifiable, nonVerifiable, blocked } = splitRequestsInChunks(payload, proofProvider.opts.unverifiedWhitelist); const verifiedResponses = []; const nonVerifiedResponses = []; const blockedResponses = []; for (const request of verifiable) { logger.debug("Processing verifiable request", { method: request.method, params: JSON.stringify(request.params), }); const verifiableRequestHandler = verifiableMethodHandlers[request.method]; const response = await verifiableRequestHandler({ payload: request, rpc, proofProvider, logger }); verifiedResponses.push(response); } if (nonVerifiable.length > 0) { logger.warn("Forwarding non-verifiable requests to EL provider.", { count: nonVerifiable.length }); const response = await rpc.batchRequest(nonVerifiable, { raiseError: false }); nonVerifiedResponses.push(...response.map((r) => r.response)); } for (const request of blocked) { blockedResponses.push(getResponseForRequest(request, undefined, { message: `Method "${request.method}" not allowed.` })); } const responses = [...verifiedResponses, ...nonVerifiedResponses, ...blockedResponses]; if (responses.length === 1) { return responses[0]; } return responses; } //# sourceMappingURL=process.js.map