💻 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
dapplion f544c289da Remove browser specific code 2020-12-06 11:35:17 +00:00
.github Run download-test-cases in CI 2020-12-01 08:38:05 +00:00
benchmark Merge pull request #58 from ChainSafe/dapplion/verifyMultipleSignatures 2020-12-04 07:53:06 -07:00
src Remove browser specific code 2020-12-06 11:35:17 +00:00
test Add deleted method in tests util 2020-12-03 00:31:52 +00:00
.babel-register Move to packages/bls 2019-08-05 10:48:26 -05:00
.babelrc Update dev delendencies, tests, linter 2020-02-20 14:51:25 -06:00
.eslintrc.js Fix lint issues 2020-11-25 11:50:47 +00:00
.gitignore Store spec tests data in local directory 2020-12-01 08:22:58 +00: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 v5.0.1 2020-11-30 18:10:26 -06:00
LICENSE Move to packages/bls 2019-08-05 10:48:26 -05:00
README.md Apply suggestions from code review 2020-12-03 18:53:00 +04:00
blst-native.d.ts Export strategies 2020-11-25 15:03:15 +00:00
blst-native.js Export strategies 2020-11-25 15:03:15 +00:00
browser.d.ts Export strategies 2020-11-25 15:03:15 +00:00
browser.js Export strategies 2020-11-25 15:03:15 +00:00
herumi.d.ts Export strategies 2020-11-25 15:03:15 +00:00
herumi.js Export strategies 2020-11-25 15:03:15 +00:00
karma.conf.js Move web test to a different folder to not run herumi tests twice 2020-12-03 00:05:49 +00:00
node.d.ts Export strategies 2020-11-25 15:03:15 +00:00
node.js Export strategies 2020-11-25 15:03:15 +00:00
package.json Bump bls-eth-wasm 2020-12-06 11:28:50 +00:00
tsconfig.build.json Include tests in ts-config 2020-11-04 18:00:50 +00:00
tsconfig.json Remove browser specific code 2020-12-06 11:35:17 +00:00
webpack.config.js Run webpack on production mode 2020-12-03 00:06:46 +00:00
yarn.lock Bump bls-eth-wasm 2020-12-06 11:28:50 +00:00

README.md

bls

Build Status 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

You must initialize the library once in your application before using it. The result is cached and use across all your imports

import {init, SecretKey, secretKeyToPublicKey, sign, verify} from "@chainsafe/bls";

(async () => {
  await init("herumi");

  // class-based interface
  const secretKey = 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 = secretKeyToPublicKey(sk);
  const sig = sign(sk, message);
  console.log("Is valid: ", verify(pk, message, sig));
})();

Browser

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

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

Native bindings only

If you are in NodeJS, import from /node to skip browser specific code. Also install peer dependency @chainsafe/blst which has the native bindings

yarn add @chainsafe/bls @chainsafe/blst
import bls from "@chainsafe/bls/node";

Native bindings + WASM fallback

If you want to offer a fallback in NodeJS, first try to load native bindings and then fallback to WASM. Also install peer dependency @chainsafe/blst which has the native bindings

yarn add @chainsafe/bls @chainsafe/blst
import {init} from "@chainsafe/bls";

try {
  await init("blst-native");
} catch (e) {
  await init("herumi");
  console.warn("Using WASM");
}

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 443.75 46.658 (x9) 12.355 (x36)
verifyAggregate (30) 438.68 46.615 (x9) 9.8803 (x44)
verifyMultiple (30) 35.138 3.4332 (x10) 0.9217 (x38)
aggregate (pubkeys, 30) 15761 2603.5 (x6) 42.956 (x366)
aggregate (sigs, 30) 6587.8 1018.7 (x6) -

*noble methods include serialization and deserialization to bytes, which may impact all benchmarks specially aggregate. ** blst and herumi performed 100 runs each, noble 10 runs.

Results from CI run https://github.com/ChainSafe/bls/runs/1488856560?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