借助bip39标准的npm包实现HD钱包助记词能力

  • Louis
  • 更新于 2024-09-23 14:20
  • 阅读 517

在上篇文章中,我将助记词的生成过程和步骤拆解了出来,实际上在现实开发中,我们可以直接借助bip-39的npm模块来快速生成符合规范的助记词。

在上篇文章中,我将助记词的生成过程和步骤拆解了出来,实际上在现实开发中,我们可以直接借助 bip-39 的 npm 模块来快速生成符合规范的助记词。

generateMnemonic 函数

export declare function generateMnemonic(strength?: number, rng?: (size: number) => Buffer, wordlist?: string[]): string;

generateMnemonic 函数通常用于生成符合 BIP-39 标准的助记词。我们来解释下相关参数的含义:

参数说明:

  1. strength? (可选): 助记词的位数长度,常见值有 128、160、192、224 和 256。这个值决定了生成助记词的强度,值越大,生成的助记词越长且越安全。默认是 128 位
  2. rng? (可选): 随机数生成函数。通常是使用安全的随机数生成器来生成种子。如果没有提供,则使用默认的随机数生成方式。
  3. wordlist? (可选): 自定义的助记词单词表。如果不提供,则使用默认的英文助记词表。

返回值: 返回生成的助记词(一个由单词组成的字符串)。

示例用法:

import { generateMnemonic } from 'bip39';

// 生成一个默认强度的助记词(128位安全性,默认英文单词表)
const mnemonic = generateMnemonic();
console.log(mnemonic);

// 使用 256 位强度生成助记词
const strongMnemonic = generateMnemonic(256);
console.log(strongMnemonic);

// 使用自定义随机数生成器
const customRng = (size: number) => {
  return Buffer.from([...Array(size).keys()].map(i => Math.floor(Math.random() * 256)));
};
const customMnemonic = generateMnemonic(128, customRng);
console.log(customMnemonic);

// 使用自定义单词表(例如中文)
const chineseWordlist = bip39.wordlists.chinese_simplified;
const chineseMnemonic = generateMnemonic(128, undefined, chineseWordlist);
console.log(chineseMnemonic);

mnemonicToSeedSync 函数

export declare function mnemonicToSeedSync(mnemonic: string, password?: string): Buffer;

这个函数用于将 BIP-39 助记词转换为种子(seed),这个种子通常用于生成 HD (Hierarchical Deterministic) 钱包的根私钥。它是一个同步函数,返回一个 Buffer,即生成的种子值。

参数说明:

  • mnemonic: 必须的参数,表示助记词。它是一个由空格分隔的助记词字符串。
  • password? (可选): 这是一个可选的参数,如果提供,会将其作为额外的保护层(通常称为 "passphrase" 或 "salt")。默认值为空字符串 "",即没有额外的保护。

返回值: 返回一个 Buffer,包含从助记词和可选密码生成的种子(长度为 64 字节)。

示例用法:

import { mnemonicToSeedSync } from 'bip39';

// 假设我们有一个助记词
const mnemonic = "praise you muffin lion enable neck grocery crumble super myself license ghost";

// 使用助记词生成种子
const seed = mnemonicToSeedSync(mnemonic);
console.log(seed.toString('hex')); // 以16进制输出种子

// 使用助记词和密码生成种子
const password = "mySecurePassword";
const seedWithPassword = mnemonicToSeedSync(mnemonic, password);
console.log(seedWithPassword.toString('hex')); // 以16进制输出带密码的种子

mnemonicToSeed 函数

export declare function mnemonicToSeed(mnemonic: string, password?: string): Promise<Buffer>;

mnemonicToSeed 是一个异步函数,它将 BIP-39 助记词转换为种子(seed),并返回一个 Promise 对象,该对象解析为包含种子的 Buffer

参数说明:

  1. mnemonic: 必须的参数,表示助记词。助记词是一个由空格分隔的单词字符串,符合 BIP-39 标准。
  2. password? (可选): 这是一个可选的参数,用于添加额外的密码保护(通常称为 "passphrase" 或 "salt")。默认值是空字符串 "",即没有额外的密码保护。

返回值:

  • 返回一个 Promise<Buffer>,在成功解析时返回一个 Buffer,其中包含生成的种子。

示例用法:

import { mnemonicToSeed } from 'bip39';

// 假设有一个助记词
const mnemonic = "praise you muffin lion enable neck grocery crumble super myself license ghost";

// 使用助记词生成种子(异步)
mnemonicToSeed(mnemonic).then(seed => {
    console.log(seed.toString('hex')); // 输出种子的十六进制表示
}).catch(err => {
    console.error('Error generating seed:', err);
});

// 使用助记词和密码生成种子
const password = "mySecurePassword";
mnemonicToSeed(mnemonic, password).then(seed => {
    console.log(seed.toString('hex')); // 输出带密码的种子的十六进制表示
}).catch(err => {
    console.error('Error generating seed:', err);
});

说明:

  • 异步执行:与 mnemonicToSeedSync 的同步版本不同,mnemonicToSeed 是异步的,适用于不希望阻塞程序执行的场景。它返回一个 Promise,你可以通过 then()async/await 进行处理。
  • 助记词:必须是有效的 BIP-39 助记词。如果助记词不正确或格式无效,Promise 会被拒绝,并抛出错误。
  • 密码(可选) :提供一个密码可以增加助记词的安全性,增强保护。如果用户丢失密码,即便有助记词也无法恢复钱包。

使用场景:

  • 异步场景:当生成种子的过程不需要立即返回结果时,可以使用该异步函数(如在前端应用或后台任务中)。
  • 钱包生成和恢复:生成的种子用于派生 HD 钱包中的密钥,用于加密、交易签名等操作。

mnemonicToSeedSync 的区别:

  • mnemonicToSeed 是异步的,返回一个 Promise,适合用于不想阻塞主线程的场景。
  • mnemonicToSeedSync 是同步的,会立即返回生成的种子,但如果生成时间较长可能会阻塞主线程。

如果你偏好使用现代 JavaScript 的 async/await 语法,下面是示例:

(async () => {
  try {
    const seed = await mnemonicToSeed(mnemonic);
    console.log(seed.toString('hex')); // 输出种子的十六进制表示
  } catch (err) {
    console.error('Error generating seed:', err);
  }
})();

mnemonicToEntropy 函数:

mnemonicToEntropy 函数用于将助记词(mnemonic)转换为其对应的熵(entropy)。助记词是钱包恢复时用到的一系列单词,而这些单词实际上是基于一定的规则从熵值中生成的。mnemonicToEntropy 函数反向操作这个过程,通过助记词来计算并恢复出对应的熵值。

export declare function mnemonicToEntropy(mnemonic: string, wordlist?: string[]): string;

参数解析:

mnemonic (string) :

示例:

const mnemonic = "abandon ability able about above absent absorb abstract absurd abuse access accident";

这个参数是必须的,表示助记词,是一串由空格分隔的单词字符串(通常是12个或24个单词)。这些单词通常基于特定的词库(比如 BIP39 词库)生成。

wordlist (string[]) :

这是一个可选参数,用于指定助记词所使用的词库。如果未提供,函数通常使用默认的英文词库。不同的语言可能会有不同的词库,例如中文、日文、法文等。这个参数允许你根据不同的语言提供不同的词库。

返回值:

(string) : 该函数返回对应助记词的熵值。熵是一个表示随机性和安全性的二进制串,助记词是根据熵值生成的。因此,通过助记词可以反推出最初的熵值。熵通常以16进制字符串格式表示。

使用示例:

import { mnemonicToEntropy } from 'bip-39';

const mnemonic = "abandon ability able about above absent absorb abstract absurd abuse access accident";
const entropy = mnemonicToEntropy(mnemonic);

console.log(entropy); // 输出对应的熵值

在这个示例中,助记词通过 mnemonicToEntropy 函数被转换为它的熵值,之后你可以将熵值用于加密操作,或者继续用于生成私钥。

典型用法场景:

  • 钱包恢复:在区块链和加密货币领域,当用户需要恢复他们的钱包时,他们输入助记词,而助记词会被转换为熵值,最终用来生成私钥和地址。
  • 验证助记词的有效性:可以通过这个函数检查给定的助记词是否是有效的,因为只有与正确词库对应的有效助记词才能生成正确的熵。

entropyToMnemonic函数

entropyToMnemonic 是 BIP-39 库中的一个函数,它的作用是将熵(entropy)转换为助记词(mnemonic)。熵是生成助记词的基础,而助记词是一组易记的单词,用于钱包备份和恢复等功能。

export declare function entropyToMnemonic(entropy: Buffer | string, wordlist?: string[]): string;

参数解析:

entropy (Buffer | string)

  • 必需参数,表示熵值。可以是 Buffer 类型或者 string 类型的十六进制字符串。

  • 熵(Entropy) :是一个二进制数据,通常是 128 位、160 位、192 位、224 位或 256 位的随机数,用于生成助记词。熵越大,生成的助记词越长,安全性也越高。助记词的长度取决于熵的比特长度:

  • 128 位熵 → 12 个单词

  • 256 位熵 → 24 个单词

wordlist (string[])可选参数,用于指定助记词生成时所用的词库。BIP-39 标准支持多种语言(如英语、中文、法语等),不同语言对应不同的词库。默认是英文词库。

(string) :该函数返回助记词字符串。它由空格分隔的单词组成,单词来自指定的词库或默认的英文词库。

使用示例:

import { entropyToMnemonic } from 'bip39';

const entropy = "000102030405060708090a0b0c0d0e0f";
const mnemonic = entropyToMnemonic(entropy);

console.log(mnemonic); 
// 可能输出: "abandon ability able about above absent absorb abstract absurd abuse access accident"

在这个例子中,熵值被转换为助记词,生成的助记词可以用于钱包备份、恢复等场景。


典型用法场景:

  • 生成助记词:从熵中生成助记词,用于加密货币钱包的创建和备份。
  • 跨语言助记词支持:通过指定 wordlist 参数,你可以生成不同语言版本的助记词,方便不同语言的用户。

validateMnemonic 函数

validateMnemonic 是 BIP-39 库中的一个函数,用于验证给定的助记词(mnemonic)是否有效。这个函数会检查助记词是否符合 BIP-39 标准,并且可以选择通过指定的词库进行验证。

export declare function validateMnemonic(mnemonic: string, wordlist?: string[]): boolean;

参数解析:

mnemonic (string) : 必需参数,表示需要验证的助记词,是一个由空格分隔的单词字符串(如12个或24个单词)。这些单词通常从特定词库中选择,并按照 BIP-39 标准生成。

wordlist (string[])可选参数,用于指定助记词词库。如果不提供该参数,函数会使用默认的英文词库。不同语言的助记词可能基于不同的词库(如中文、法文、日文等),可以通过这个参数来验证特定语言的助记词。

返回值:(boolean) :该函数返回一个布尔值。如果给定的助记词是有效的并且符合 BIP-39 标准,则返回 true;否则返回 false


使用示例:

import { validateMnemonic } from 'bip39';

const mnemonic = "abandon ability able about above absent absorb abstract absurd abuse access accident";
const isValid = validateMnemonic(mnemonic);

console.log(isValid); // 输出: true 或 false

在这个例子中,validateMnemonic 函数会检查助记词是否正确。如果助记词无效(例如,单词不在词库中或格式不符合 BIP-39 标准),它将返回 false


验证标准:

  • 助记词长度:助记词的单词数是否正确(如12个、15个、18个、21个、24个)。
  • 单词合法性:助记词中的每个单词是否存在于所指定的词库中。
  • 校验码:助记词是否包含有效的校验码。BIP-39 的助记词是在熵基础上生成的,最后一部分包括了校验码,用于验证助记词的完整性。

典型用法场景:

  • 钱包恢复验证:在用户输入助记词时,验证其是否正确,以避免错误的助记词导致无法恢复钱包。
  • 助记词生成后校验:确保在生成助记词后,助记词是符合标准的。

你可以使用这个函数来验证你生成或输入的助记词是否符合 BIP-39 标准。如果助记词无效,可能是词库不匹配或格式错误。

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Louis
Louis
web3 developer,技术交流或者有工作机会可加VX: magicalLouis