UNPKG

@lodestar/prover

Version:

A Typescript implementation of the Ethereum Consensus light client

63 lines 2.68 kB
import { bufferToHex } from "./conversion.js"; import { getELBlock, getELCode, getELProof } from "./execution.js"; import { isValidAccount, isValidBlock, isValidCodeHash, isValidStorageKeys } from "./validation.js"; export async function verifyAccount({ address, proofProvider, logger, rpc, block, }) { try { const executionPayload = await proofProvider.getExecutionPayload(block ?? "latest"); const proof = await getELProof(rpc, [address, [], bufferToHex(executionPayload.blockHash)]); const validAccount = await isValidAccount({ address: address, stateRoot: executionPayload.stateRoot, proof, logger, }); // If account is invalid don't check the storage const validStorage = validAccount && (await isValidStorageKeys({ storageKeys: [], proof, logger })); if (validAccount && validStorage) { return { data: proof, valid: true }; } return { valid: false }; } catch (err) { logger.error("Error while verifying account", { address }, err); return { valid: false }; } } export async function verifyCode({ address, proofProvider, logger, rpc, codeHash, block, }) { try { const executionPayload = await proofProvider.getExecutionPayload(block ?? "latest"); const code = await getELCode(rpc, [address, bufferToHex(executionPayload.blockHash)]); if (await isValidCodeHash({ codeHash, codeResponse: code, logger })) { return { data: code, valid: true }; } return { valid: false }; } catch (err) { logger.error("Error while verifying code", { address }, err); return { valid: false }; } } export async function verifyBlock({ payload, proofProvider, logger, rpc, }) { try { const blockNumber = payload.params[0]; const executionPayload = await proofProvider.getExecutionPayload(blockNumber); const block = await getELBlock(rpc, [blockNumber, true]); // Always request hydrated blocks as we need access to `transactions` details // If response is not valid from the EL we don't need to verify it if (!block) return { data: block, valid: false }; if (await isValidBlock({ logger, block, executionPayload, config: proofProvider.config, })) { return { data: block, valid: true }; } return { valid: false }; } catch (err) { logger.error("Error while verifying block", { block: payload.params[0] }, err); return { valid: false }; } } //# sourceMappingURL=verification.js.map