@lodestar/prover
Version:
A Typescript implementation of the Ethereum Consensus light client
63 lines • 2.68 kB
JavaScript
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