@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
35 lines • 1.98 kB
JavaScript
import { CELLS_PER_EXT_BLOB } from "@lodestar/params";
import { kzg } from "../../util/kzg.js";
/**
* Optionally sanity-check that the KZG commitments match the versioned hashes in the transactions
* https://github.com/ethereum/consensus-specs/blob/11a037fd9227e29ee809c9397b09f8cc3383a8c0/specs/eip4844/validator.md#blob-kzg-commitments
*/
export async function validateBlobsAndKzgCommitments(commitments, proofs, blobs) {
if (blobs.length !== commitments.length) {
throw Error(`Blobs bundle blobs len ${blobs.length} != commitments len ${commitments.length}`);
}
if (proofs.length !== blobs.length) {
throw new Error(`Invalid proofs length for BlobsBundleV1 format: expected ${blobs.length}, got ${proofs.length}`);
}
if (!(await kzg.asyncVerifyBlobKzgProofBatch(blobs, commitments, proofs))) {
throw new Error("Error in verifyBlobKzgProofBatch");
}
}
/**
* Optionally sanity-check that the KZG commitments match the versioned hashes in the transactions
*/
export async function validateCellsAndKzgCommitments(commitments, proofs, cells) {
if (cells.length !== commitments.length) {
throw Error(`Blobs bundle cells len ${cells.length} != commitments len ${commitments.length}`);
}
const expectedProofsLength = cells.length * CELLS_PER_EXT_BLOB;
if (proofs.length !== expectedProofsLength) {
throw Error(`Invalid proofs length for BlobsBundleV2 format: expected ${expectedProofsLength}, got ${proofs.length}`);
}
const commitmentBytes = commitments.flatMap((commitment) => Array(CELLS_PER_EXT_BLOB).fill(commitment));
const cellIndices = Array.from({ length: cells.length }).flatMap(() => Array.from({ length: CELLS_PER_EXT_BLOB }, (_, i) => i));
if (!(await kzg.asyncVerifyCellKzgProofBatch(commitmentBytes, cellIndices, cells.flat(), proofs.flat()))) {
throw new Error("Error in verifyCellKzgProofBatch");
}
}
//# sourceMappingURL=validateBlobsAndKzgCommitments.js.map