@lodestar/beacon-node
Version:
A Typescript implementation of the beacon chain
35 lines • 1.53 kB
JavaScript
import { Signature, verify, verifyMultipleAggregateSignatures } from "@chainsafe/blst";
const MIN_SET_COUNT_TO_BATCH = 2;
/**
* 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) {
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;
}
}
//# sourceMappingURL=maybeBatch.js.map