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.