UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

42 lines 2.34 kB
import { ProofType, createProof } from "@chainsafe/persistent-merkle-tree"; import { loadState } from "@lodestar/state-transition"; import { getBlockResponse } from "../beacon/blocks/utils.js"; import { getStateResponseWithRegen } from "../beacon/state/utils.js"; export function getProofApi(opts, { chain, config }) { // It's currently possible to request gigantic proofs (eg: a proof of the entire beacon state) // We want some some sort of resistance against this DoS vector. const maxGindicesInProof = opts.maxGindicesInProof ?? 512; return { async getStateProof({ stateId, descriptor }) { // descriptor.length / 2 is a rough approximation of # of gindices if (descriptor.length / 2 > maxGindicesInProof) { throw new Error("Requested proof is too large."); } const res = await getStateResponseWithRegen(chain, stateId); const state = res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state; // Commit any changes before computing the state root. In normal cases the state should have no changes here state.commit(); const stateNode = state.node; const proof = createProof(stateNode, { type: ProofType.compactMulti, descriptor }); return { data: proof, meta: { version: config.getForkName(state.slot) }, }; }, async getBlockProof({ blockId, descriptor }) { // descriptor.length / 2 is a rough approximation of # of gindices if (descriptor.length / 2 > maxGindicesInProof) { throw new Error("Requested proof is too large."); } const { block } = await getBlockResponse(chain, blockId); // Commit any changes before computing the state root. In normal cases the state should have no changes here const blockNode = config.getForkTypes(block.message.slot).BeaconBlock.toView(block.message).node; const proof = createProof(blockNode, { type: ProofType.compactMulti, descriptor }); return { data: proof, meta: { version: config.getForkName(block.message.slot) }, }; }, }; } //# sourceMappingURL=index.js.map