c-kzg-4844/bindings/node.js/kzg.ts

144 lines
3.5 KiB
TypeScript
Raw Normal View History

/**
* The public interface of this module exposes the functions as specified by
* https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/polynomial-commitments.md#kzg
*/
2022-11-04 05:57:03 +00:00
const kzg: KZG = require("./kzg.node");
const fs = require("fs");
2022-11-03 19:57:46 +00:00
export type Bytes32 = Uint8Array; // 32 bytes
export type Bytes48 = Uint8Array; // 48 bytes
export type KZGProof = Uint8Array; // 48 bytes
export type KZGCommitment = Uint8Array; // 48 bytes
export type Blob = Uint8Array; // 4096 * 32 bytes
type SetupHandle = Object;
// The C++ native addon interface
type KZG = {
FIELD_ELEMENTS_PER_BLOB: number;
2022-11-04 18:44:57 +00:00
BYTES_PER_FIELD_ELEMENT: number;
2022-11-03 21:39:02 +00:00
loadTrustedSetup: (filePath: string) => SetupHandle;
2022-11-03 19:57:46 +00:00
freeTrustedSetup: (setupHandle: SetupHandle) => void;
2022-11-03 19:57:46 +00:00
2022-11-03 00:17:17 +00:00
blobToKzgCommitment: (blob: Blob, setupHandle: SetupHandle) => KZGCommitment;
2022-11-03 19:57:46 +00:00
computeAggregateKzgProof: (
2022-11-03 21:39:02 +00:00
blobs: Blob[],
setupHandle: SetupHandle,
) => KZGProof;
2022-11-03 19:57:46 +00:00
2022-11-03 21:39:02 +00:00
verifyAggregateKzgProof: (
blobs: Blob[],
commitmentsBytes: Bytes48[],
aggregatedProofBytes: Bytes48,
setupHandle: SetupHandle,
2022-11-03 21:39:02 +00:00
) => boolean;
verifyKzgProof: (
commitmentBytes: Bytes48,
zBytes: Bytes32,
yBytes: Bytes32,
proofBytes: Bytes48,
setupHandle: SetupHandle,
2022-11-03 21:39:02 +00:00
) => boolean;
};
type TrustedSetupJSON = {
setup_G1: string[];
setup_G2: string[];
setup_G1_lagrange: string[];
roots_of_unity: string[];
};
export const FIELD_ELEMENTS_PER_BLOB = kzg.FIELD_ELEMENTS_PER_BLOB;
2022-11-04 18:44:57 +00:00
export const BYTES_PER_FIELD_ELEMENT = kzg.BYTES_PER_FIELD_ELEMENT;
2022-11-03 21:39:02 +00:00
// Stored as internal state
let setupHandle: SetupHandle | undefined;
2022-11-04 20:29:52 +00:00
function requireSetupHandle(): SetupHandle {
if (!setupHandle) {
throw new Error("You must call loadTrustedSetup to initialize KZG.");
}
return setupHandle;
}
export async function transformTrustedSetupJSON(
filePath: string,
): Promise<string> {
const data: TrustedSetupJSON = JSON.parse(fs.readFileSync(filePath));
const textFilePath = filePath.replace(".json", "") + ".txt";
try {
fs.unlinkSync(textFilePath);
} catch {}
const file = fs.createWriteStream(textFilePath);
file.write(`${FIELD_ELEMENTS_PER_BLOB}\n65\n`);
file.write(data.setup_G1.map((p) => p.replace("0x", "")).join("\n"));
file.write("\n");
file.write(data.setup_G2.map((p) => p.replace("0x", "")).join("\n"));
file.end();
const p = new Promise((resolve) => {
file.close(resolve);
});
await p;
return textFilePath;
}
2022-11-04 04:54:59 +00:00
export function loadTrustedSetup(filePath: string): void {
2022-11-03 21:39:02 +00:00
if (setupHandle) {
throw new Error(
"Call freeTrustedSetup before loading a new trusted setup.",
2022-11-03 21:39:02 +00:00
);
}
2022-11-03 21:39:02 +00:00
setupHandle = kzg.loadTrustedSetup(filePath);
}
2022-11-04 04:54:59 +00:00
export function freeTrustedSetup(): void {
2022-11-04 20:29:52 +00:00
kzg.freeTrustedSetup(requireSetupHandle());
2022-11-03 21:39:02 +00:00
setupHandle = undefined;
}
2022-11-04 04:54:59 +00:00
export function blobToKzgCommitment(blob: Blob): KZGCommitment {
2022-11-04 20:29:52 +00:00
return kzg.blobToKzgCommitment(blob, requireSetupHandle());
2022-11-03 21:39:02 +00:00
}
2022-11-04 04:54:59 +00:00
export function computeAggregateKzgProof(blobs: Blob[]): KZGProof {
2022-11-04 20:29:52 +00:00
return kzg.computeAggregateKzgProof(blobs, requireSetupHandle());
2022-11-03 21:39:02 +00:00
}
2022-12-13 19:21:43 +00:00
export function verifyKzgProof(
commitmentBytes: Bytes48,
zBytes: Bytes32,
yBytes: Bytes32,
proofBytes: Bytes48,
2022-12-13 19:21:43 +00:00
): boolean {
return kzg.verifyKzgProof(
commitmentBytes,
zBytes,
yBytes,
proofBytes,
2022-12-13 19:21:43 +00:00
requireSetupHandle(),
);
}
2022-11-03 21:39:02 +00:00
export function verifyAggregateKzgProof(
blobs: Blob[],
commitmentsBytes: Bytes48[],
proofBytes: Bytes48,
2022-11-04 04:54:59 +00:00
): boolean {
2022-11-03 21:39:02 +00:00
return kzg.verifyAggregateKzgProof(
blobs,
commitmentsBytes,
proofBytes,
2022-11-04 20:29:52 +00:00
requireSetupHandle(),
2022-11-03 21:39:02 +00:00
);
}