什么是助记词
助记词(mnemonic phrase)是从一个固定的单词列表中选出的12、15、18、21或24个单词,这些单词按照顺序排列,可用于备份和恢复加密货币钱包。
两个重要的比特币改进提案(BIP)
BIP-0039
BIP-0039 是比特币改进提案(Bitcoin Improvement Proposal,BIP)中的一个标准,它定义了一种用于生成助记词(mnemonic phrase)的系统,这些助记词通常用于备份和恢复加密货币钱包。
解决的问题:用助记词替代私钥,方便记忆,方便存储
BIP-0044
BIP-44(Bitcoin Improvement Proposal 44)是比特币改进提案中的一个标准,它定义了一种多币种层次确定性钱包(HD Wallets)的结构,以及用于派生不同加密货币地址的规范。HD Wallets 是一种钱包体系结构,通过一个种子(seed)可以生成多个密钥对,每个密钥对都对应一个地址和私钥。下一节,我们会展开讲讲BIP-0044。
为什么需要助记词
- 易于记忆: 助记词通常是一组易于记忆的单词,相比长串的私钥,用户更容易记住这些单词。这使得用户在备份时更加方便,因为他们只需要记住助记词而不是复杂的密码或私钥。
- 便于备份: 助记词是一种人类可读的备份形式,用户可以写下或记录这组单词并妥善保存。相对于备份私钥或钱包文件,这提供了更直观和用户友好的备份方式。
- 方便恢复: 如果用户失去了钱包或需要在不同的设备上恢复钱包,助记词可以用于恢复与之关联的私钥和地址。这样,用户只需输入助记词,而不必记住或找回复杂的私钥。
- 标准化和互操作性: 使用 BIP-0039 等标准的助记词列表确保了不同钱包实现之间的兼容性。用户可以在一个钱包生成助记词,然后在另一个钱包中使用这些助记词进行恢复,从而提高了用户对于不同钱包之间切换的自由度。
- 安全性: 通过使用助记词,用户不必频繁地处理私钥,减少了私钥泄露的风险。同时,助记词生成算法中通常包含校验和,以帮助检测用户是否正确输入了助记词。
助记词都有哪些
生成代码
#!/usr/bin/env python3
from hdwallet import HDWallet
from hdwallet.utils import generate_entropy
from hdwallet.symbols import BTC as SYMBOL
from typing import Optional
import json
# 以下的`位`没有特殊说明都是指的bit
# 选择`熵`长度, 默认128位,最长256位,必须是32的倍数
# 校验和 = sha256(`熵`)的哈希值 的 前(`熵`的位数 / 32)位 -- 如果128位的熵,那么就是取前4位
# 助记词的数量 = (`熵`的位数 + 校验和的位数) / 11 -- 这里的 + 表示拼接的意思,每11位bit就是从 0-2047 中的一个数字,这个数字就是词本中的具体哪个单词
STRENGTH: int = 128
# language english, french, italian, spanish, chinese_simplified, chinese_traditional, japanese or korean
# 这里使用英文词本
LANGUAGE: str = "english" # Default is english
# 用16进制的字符串表示`熵`
ENTROPY: str = generate_entropy(strength=STRENGTH)
# 这里可以选择一个密码,我们暂时不用
PASSPHRASE: Optional[str] = None # "meherett"
# 初始化
hdwallet: HDWallet = HDWallet(symbol=SYMBOL, use_default_path=False)
# 生成助记词
hdwallet.from_entropy(
entropy=ENTROPY, language=LANGUAGE, passphrase=PASSPHRASE
)
# Derivation from path
# hdwallet.from_path("m/44'/0'/0'/0/0")
# Or derivation from index
# 确定私钥的生成规则
hdwallet.from_index(44, hardened=True)
hdwallet.from_index(0, hardened=True)
hdwallet.from_index(0, hardened=True)
hdwallet.from_index(0)
hdwallet.from_index(0)
# 输出生成的结果
print(json.dumps(hdwallet.dumps(), indent=4, ensure_ascii=False))