Skip to content

paulmillr/bls12-381-keygen

main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 

bls12-381-keygen

Minimal BLS12-381 Key Generation compatible with EIP-2333. Can be used to generate EIP-2334 keys for ETH beacon chain.

Has only one tiny dependency on @noble/hashes for SHA256 and HKDF.

If you're looking for actual implementation of the elliptic curve, use module noble-bls12-381. The bls12-381-keygen only generates private keys, by EIP-2333 specification.

Check out live demo in iancoleman's eip2333-tool

Usage

Node.js and browser:

npm install bls12-381-keygen

The API is the following:

function deriveMaster(seed: Uint8Array): Uint8Array;
function deriveChild(parentKey: Uint8Array, index: number): Uint8Array;
function deriveSeedTree(seed: Uint8Array, path: string): Uint8Array;
const EIP2334_KEY_TYPES: readonly ["withdrawal", "signing"];
type EIP2334KeyType = typeof EIP2334_KEY_TYPES[number];
function deriveEIP2334Key(seed: Uint8Array, type: EIP2334KeyType, index: number): {
  key: Uint8Array;
  path: string;
};

Usage example:

import { deriveEIP2334Key, deriveSeedTree } from 'bls12-381-keygen';

const seed = (new Uint8Array(32)).fill(7); // must be random
deriveEIP2334Key(seed, 'withdrawal', 6);

// Those two are equal
const signKey1a = deriveEIP2334Key(seed, 'signing', 0);
const signKey1b = deriveSeedTree(seed, 'm/12381/3600/0/0/0');

// To generate mnemonics for EIP-2334 keystores
import { entropyToMnemonic, mnemonicToSeedSync } from 'micro-bip39';
import { wordlist } from 'micro-bip39/wordlists/english';
// bytes = some random sequence
const mnSeed = mnemonicToSeedSync(entropyToMnemonic(bytes, wordlist));
deriveEIP2334Key(mnSeed, 'signing', index);

// To generate BLS12-381 public key, use @noble crypto
import { getPublicKey } from '@noble/bls12-381';
getPublicKey(signKey1a);

License

MIT (c) Paul Miller (https://paulmillr.com), see LICENSE file.