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

103 lines
2.7 KiB
TypeScript
Raw Normal View History

2022-11-02 20:45:29 +00:00
// @ts-expect-error
2022-11-03 22:13:49 +00:00
import bindings from "bindings";
2022-11-02 20:45:29 +00:00
/**
* 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-03 19:57:46 +00:00
export type BLSFieldElement = Uint8Array; // 32 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;
BYTES_PER_FIELD: 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[],
2022-11-03 22:13:49 +00:00
setupHandle: SetupHandle
) => KZGProof;
2022-11-03 19:57:46 +00:00
2022-11-03 21:39:02 +00:00
verifyAggregateKzgProof: (
blobs: Blob[],
expectedKzgCommitments: KZGCommitment[],
kzgAggregatedProof: KZGProof,
2022-11-03 22:13:49 +00:00
setupHandle: SetupHandle
2022-11-03 21:39:02 +00:00
) => boolean;
// Currently unused -- not exported
verifyKzgProof: (
2022-11-03 21:39:02 +00:00
polynomialKzg: KZGCommitment,
z: BLSFieldElement,
y: BLSFieldElement,
kzgProof: KZGProof,
2022-11-03 22:13:49 +00:00
setupHandle: SetupHandle
2022-11-03 21:39:02 +00:00
) => boolean;
};
2022-11-03 22:13:49 +00:00
const kzg: KZG = bindings("kzg.node");
export const FIELD_ELEMENTS_PER_BLOB = kzg.FIELD_ELEMENTS_PER_BLOB;
export const BYTES_PER_FIELD = kzg.BYTES_PER_FIELD;
2022-11-03 21:39:02 +00:00
// Stored as internal state
let setupHandle: SetupHandle | undefined;
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(
2022-11-03 22:13:49 +00:00
"Call freeTrustedSetup before loading a new trusted setup."
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-03 21:39:02 +00:00
if (!setupHandle) {
2022-11-03 22:13:49 +00:00
throw new Error("You must call loadTrustedSetup before freeTrustedSetup.");
2022-11-03 21:39:02 +00:00
}
kzg.freeTrustedSetup(setupHandle);
setupHandle = undefined;
}
2022-11-04 04:54:59 +00:00
export function blobToKzgCommitment(blob: Blob): KZGCommitment {
2022-11-03 21:39:02 +00:00
if (!setupHandle) {
2022-11-03 22:13:49 +00:00
throw new Error("You must call loadTrustedSetup to initialize KZG.");
2022-11-03 21:39:02 +00:00
}
return kzg.blobToKzgCommitment(blob, setupHandle);
}
2022-11-04 04:54:59 +00:00
export function computeAggregateKzgProof(blobs: Blob[]): KZGProof {
2022-11-03 21:39:02 +00:00
if (!setupHandle) {
2022-11-03 22:13:49 +00:00
throw new Error("You must call loadTrustedSetup to initialize KZG.");
2022-11-03 21:39:02 +00:00
}
return kzg.computeAggregateKzgProof(blobs, setupHandle);
}
export function verifyAggregateKzgProof(
blobs: Blob[],
expectedKzgCommitments: KZGCommitment[],
2022-11-03 22:13:49 +00:00
kzgAggregatedProof: KZGProof
2022-11-04 04:54:59 +00:00
): boolean {
2022-11-03 21:39:02 +00:00
if (!setupHandle) {
2022-11-03 22:13:49 +00:00
throw new Error("You must call loadTrustedSetup to initialize KZG.");
2022-11-03 21:39:02 +00:00
}
return kzg.verifyAggregateKzgProof(
blobs,
expectedKzgCommitments,
kzgAggregatedProof,
2022-11-03 22:13:49 +00:00
setupHandle
2022-11-03 21:39:02 +00:00
);
}