@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
31 lines • 1.72 kB
JavaScript
import { digest as sha256Digest } from "@chainsafe/as-sha256";
import { Tree } from "@chainsafe/persistent-merkle-tree";
import { KZG_COMMITMENT_GINDEX0, VERSIONED_HASH_VERSION_KZG } from "@lodestar/params";
import { signedBlockToSignedHeader } from "@lodestar/state-transition";
import { ssz } from "@lodestar/types";
export function kzgCommitmentToVersionedHash(kzgCommitment) {
const hash = sha256Digest(kzgCommitment);
// Equivalent to `VERSIONED_HASH_VERSION_KZG + hash(kzg_commitment)[1:]`
hash[0] = VERSIONED_HASH_VERSION_KZG;
return hash;
}
export function computeInclusionProof(fork, body, index) {
const bodyView = ssz[fork].BeaconBlockBody.toView(body);
const commitmentGindex = KZG_COMMITMENT_GINDEX0 + index;
return new Tree(bodyView.node).getSingleProof(BigInt(commitmentGindex));
}
export function computeBlobSidecars(config, signedBlock, contents) {
const blobKzgCommitments = signedBlock.message.body.blobKzgCommitments;
if (blobKzgCommitments === undefined) {
throw Error("Invalid block with missing blobKzgCommitments for computeBlobSidecars");
}
const signedBlockHeader = signedBlockToSignedHeader(config, signedBlock);
const fork = config.getForkName(signedBlockHeader.message.slot);
return blobKzgCommitments.map((kzgCommitment, index) => {
const blob = contents.blobs[index];
const kzgProof = contents.kzgProofs[index];
const kzgCommitmentInclusionProof = contents.kzgCommitmentInclusionProofs?.[index] ?? computeInclusionProof(fork, signedBlock.message.body, index);
return { index, blob, kzgCommitment, kzgProof, signedBlockHeader, kzgCommitmentInclusionProof };
});
}
//# sourceMappingURL=blobs.js.map