UNPKG

@lodestar/beacon-node

Version:

A Typescript implementation of the beacon chain

46 lines (40 loc) 1.56 kB
import {PublicKey, Signature, verify, verifyMultipleAggregateSignatures} from "@chainsafe/blst"; const MIN_SET_COUNT_TO_BATCH = 2; export type SignatureSetDeserialized = { publicKey: PublicKey; message: Uint8Array; signature: Uint8Array; }; /** * Verify signatures sets with batch verification or regular core verify depending on the set count. * Abstracted in a separate file to be consumed by the threaded pool and the main thread implementation. */ export function verifySignatureSetsMaybeBatch(sets: SignatureSetDeserialized[]): boolean { try { if (sets.length >= MIN_SET_COUNT_TO_BATCH) { return verifyMultipleAggregateSignatures( sets.map((s) => ({ pk: s.publicKey, msg: s.message, // true = validate signature sig: Signature.fromBytes(s.signature, true), })) ); } // .every on an empty array returns true if (sets.length === 0) { throw Error("Empty signature set"); } // If too few signature sets verify them without batching return sets.every((set) => { // true = validate signature const sig = Signature.fromBytes(set.signature, true); return verify(set.message, set.publicKey, sig); }); } catch (_) { // A signature could be malformed, in that case fromBytes throws error // blst-ts `verifyMultipleSignatures` is also a fallible operation if mul_n_aggregate fails // see https://github.com/ChainSafe/blst-ts/blob/b1ba6333f664b08e5c50b2b0d18c4f079203962b/src/lib.ts#L291 return false; } }