💻 Javascript Implementation of Boneh-Lynn-Shacham Signatures
This repository has been archived on 2023-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
Go to file
Derrick Hammer a74045db4a
*add lib
2023-04-08 22:21:39 -04:00
.github Update stalebot options and funding url (#135) 2022-07-15 08:34:08 -05:00
benchmark fix benchmarks 2022-04-15 11:56:13 +02:00
lib *add lib 2023-04-08 22:21:39 -04:00
src *Make bls export an async wrapper to prevent top-level await 2023-04-08 22:20:32 -04:00
test Use explicit chai statements (#140) 2022-10-07 21:43:50 +05:30
.eslintrc.cjs feat: use esm 2022-04-11 10:15:43 -05:00
.gitignore Store spec tests data in local directory 2020-12-01 08:22:58 +00:00
.mocharc.yml feat: use esm 2022-04-11 10:15:43 -05:00
.prettierignore Fix lint issues 2020-11-25 11:50:47 +00:00
.prettierrc.yml Fix prettier config file 2020-11-04 18:04:55 +00:00
CHANGELOG.md v7.1.1 2022-05-15 12:59:40 -05:00
LICENSE Move to packages/bls 2019-08-05 10:48:26 -05:00
README.md Updated code example that has since diverged from implementation (#133) 2022-07-06 10:05:38 -05:00
karma.conf.cjs fix web tests 2022-04-15 11:51:06 +02:00
package.json Bump test deps (#139) 2022-10-07 18:25:44 +02:00
tsconfig.build.json Include tests in ts-config 2020-11-04 18:00:50 +00:00
tsconfig.json Simplify exports 2022-04-13 14:36:07 -05:00
webpack.config.cjs Tweaks and upgrade karma/webpack 2022-04-14 12:16:06 -05:00
yarn.lock Bump test deps (#139) 2022-10-07 18:25:44 +02:00

README.md

bls

codecov ETH2.0_Spec_Version 1.0.0 ES Version Node Version

Javascript library for BLS (Boneh-Lynn-Shacham) signatures and signature aggregation, tailored for use in Eth2.

Usage

yarn add @chainsafe/bls

To use native bindings you must install peer dependency @chainsafe/blst

yarn add @chainsafe/bls @chainsafe/blst

By default, native bindings will be used if in NodeJS and they are installed. A WASM implementation ("herumi") is used as a fallback in case any error occurs.

import bls from "@chainsafe/bls";

(async () => {
    // class-based interface
    const secretKey = bls.SecretKey.fromKeygen();
    const publicKey = secretKey.toPublicKey();
    const message = new Uint8Array(32);

    const signature = secretKey.sign(message);
    console.log("Is valid: ", signature.verify(publicKey, message));

    // functional interface
    const sk = secretKey.toBytes();
    const pk = bls.secretKeyToPublicKey(sk);
    const sig = bls.sign(sk, message);
    console.log("Is valid: ", bls.verify(pk, message, sig));
})();

Browser

If you are in the browser, import from /herumi to explicitly import the WASM version

import bls from "@chainsafe/bls/herumi";

Native bindings only

If you are in NodeJS, import from /blst-native to explicitly import the native bindings. Also install peer dependency @chainsafe/blst which has the native bindings

yarn add @chainsafe/bls @chainsafe/blst
import bls from "@chainsafe/bls/blst-native";

Get implementation at runtime

If you need to get a bls implementation at runtime, import from /getImplementation.

import {getImplementation} from "@chainsafe/bls/getImplementation";

const bls = await getImplementation("herumi");

Switchable singleton

If you need a singleton that is switchable at runtime (the default behavior in <=v6), import from /switchable.

import bls, {init} from "@chainsafe/bls/switchable";

// here `bls` is uninitialized
await init("herumi");
// here `bls` is initialized
// now other modules can `import bls from "@chainsafe/bls/switchable"` and it will be initialized

The API is identical for all implementations.

Benchmarks

Results are in ops/sec (x times slower), where x times slower = times slower than fastest implementation (blst).

Function - ops/sec blst herumi noble
verify 326.38 47.674 (x7) 17.906 (x18)
verifyAggregate (30) 453.29 51.151 (x9) 18.372 (x25)
verifyMultiple (30) 34.497 3.5233 (x10) 2.0286 (x17)
verifyMultipleSignatures (30) 26.381 3.1633 (x8) -
aggregate (pubkeys, 30) 15686 2898.9 (x5) 1875.0 (x8)
aggregate (sigs, 30) 6373.4 1033.0 (x6) 526.25 (x12)
sign 925.49 108.81 (x9) 10.246 (x90)

* blst and herumi performed 100 runs each, noble 10 runs.

Results from CI run https://github.com/ChainSafe/bls/runs/1513710175?check_suite_focus=true#step:12:13

Spec versioning

Version Bls spec hash-to-curve version
5.x.x draft #9
2.x.x draft #7
1.x.x draft #6
0.3.x initial version

spec

test vectors

License

Apache-2.0