Generate ETH wallet 20x faster on React Native

TLDR This post describes how to speed up wallet generation on React Native using ethers.js and react-native-quick-crypto.

I’m developing a simple Ethereum wallet for use with a private network. A new user may either input a Mnemonic phrase, or generate a new wallet.

Out of the box, generating a new wallet easily takes ~30s+ on a Google Pixel 7, with ethers v6:

import {HDNodeWallet} from 'ethers';

export const generateFirstWallet = async (): Promise<HDNodeWallet> => {
 return HDNodeWallet.createRandom(undefined, "m/44'/60'/0'/0/0");
};

Looking for a way to speed up the operation using native code, I found react-native-quick-crypto. I soon learned that it’s easy to teach ethers, to use react-native-quick-crypto for crypto operations:

// ethers.ts
import * as ethers from 'ethers';
import crypto from 'react-native-quick-crypto';

ethers.pbkdf2.register(
  (
    password: Uint8Array,
    salt: Uint8Array,
    iterations: number,
    keylen: number,
    algo: 'sha256' | 'sha512',
    // eslint-disable-next-line max-params
  ) => {
    const result = crypto.pbkdf2Sync(password, salt, iterations, keylen, algo);
    return ethers.hexlify(new Uint8Array(result));
  },
);

export * from 'ethers';

Now, just import the module instead of ethers:

import {HDNodeWallet, Wallet} from '../ethers';

export const generateFirstWallet = async (): Promise<HDNodeWallet> => {
 return HDNodeWallet.createRandom(undefined, "m/44'/60'/0'/0/0");
};

Voila! It takes less than 2s now.

Credits