借助bip39标准的npm包实现HD钱包助记词能力
在上篇文章中,我将助记词的生成过程和步骤拆解了出来,实际上在现实开发中,我们可以直接借助 bip-39 的 npm 模块来快速生成符合规范的助记词。
generateMnemonic 函数
export declare function generateMnemonic(strength?: number, rng?: (size: number) => Buffer, wordlist?: string[]): string;
generateMnemonic
函数通常用于生成符合 BIP-39 标准的助记词。我们来解释下相关参数的含义:
参数说明:
- strength? (可选): 助记词的位数长度,常见值有 128、160、192、224 和 256。这个值决定了生成助记词的强度,值越大,生成的助记词越长且越安全。默认是 128 位
- rng? (可选): 随机数生成函数。通常是使用安全的随机数生成器来生成种子。如果没有提供,则使用默认的随机数生成方式。
- 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
。
参数说明:
- mnemonic: 必须的参数,表示助记词。助记词是一个由空格分隔的单词字符串,符合 BIP-39 标准。
- 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 标准。如果助记词无效,可能是词库不匹配或格式错误。
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。