31-HD钱包助记词生成
0x-wen

助记词生成概念讲解

助记词(Mnemonic Phrase) 是一种用于加密货币钱包中生成和管理私钥的方法,基于 BIP-39 标准。

生成原理

  1. 随机熵生成:创建一段随机熵,长度为 128 到 256 位,通常是 32 的倍数。
  2. 计算校验和:对熵进行 SHA-256 哈希计算,取哈希值的前几位作为校验和。
  3. 组合熵和校验:将校验和附加到熵的末尾,形成一个新的二进制序列。
  4. 分割为助记词索引:将序列分割成 11 位一组,每个数字作为索引。
  5. 映射为助记词:使用索引从预定义的 2048 个助记词列表中提取助记词。

验证原理

  1. 检查单词数量:助记词通常包含12、15、18、21或24个单词,如果单词数量不符合上述标准,则助记词无效。
  2. 检查单词是否在词汇表中:每个单词必须在BIP-39标准的2048个单词的词汇表中。
  3. 将助记词转化成位串:将每个单词转换为其在词汇表中的索引,每个索引是一个11位的二进制数,所有索引的二进制数连接起来,形成一个位串。
  4. 提取种子和校验和:位串的长度应为单词数量乘以11位,12个单词的助记词将产生132位的位串。位串的前128位用于提取种子,最后4位用于校验和。
  5. 计算校验和:使用SHA-256哈希函数对提取的种子(前128位)进行哈希计算,从哈希值中取前4位,作为计算得到的校验和。
  6. 验证校验和:将从位串中提取的校验和与计算得到的校验和进行比较,如果两者匹配,助记词有效。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import hashlib
import os
import bip39


def generate_mnemonic():
# 1. 生成 128 位随机熵 (16 字节)
entropy = os.urandom(16)

# 2. 计算校验和 (SHA-256)
hash_bytes = hashlib.sha256(entropy).digest()
checksum_bits = bin(hash_bytes[0])[2:].zfill(8)[:4] # 取前 4 位

# 3. 组合熵和校验和
entropy_bits = ''.join([bin(byte)[2:].zfill(8) for byte in entropy])
combined_bits = entropy_bits + checksum_bits

# 4. 分割为助记词索引
indices = [int(combined_bits[i:i + 11], 2)
for i in range(0, len(combined_bits), 11)]

# 5. 映射为助记词
wordlist = bip39.INDEX_TO_WORD_TABLE
mnemonic = ' '.join([wordlist[index] for index in indices])

return mnemonic


if __name__ == '__main__':
# 生成并打印助记词
mnemonic_phrase = generate_mnemonic()
print(f"Generated mnemonic phrase: {mnemonic_phrase}")

推导关系:

熵 → 助记词:有了熵,可以通过BIP39算法生成助记词。
助记词 → 熵:根据助记词,可以反向推导出原始的熵。
熵 或 助记词 → 种子【不可逆】:有了熵或助记词,可以使用BIP39过程生成种子。
种子 → 私钥 和 公钥【不可逆】:种子通过加密算法如BIP32生成HD钱包的主私钥和主公钥,然后可以进一步生成任意数量的子私钥和对应的公钥。

优点:

  • 易用性:助记词以单词形式存在,方便用户记忆和记录。
  • 安全性:基于强随机熵和校验和机制,提供了较高的安全性。
  • 标准化:遵循 BIP-39 标准,实现跨钱包和应用的兼容性。

BIP-32、BIP-39、BIP-44 和 BIP-86 分别解决了什么问题?

BIP-32: 分层确定性钱包(HD Wallet)

  • 解决的问题:如何从单一种子生成一个钱包树结构,以便高效管理大量地址和密钥。
  • 功能:允许创建主密钥(root key)和从该主密钥派生出无限数量的子密钥。
  • 应用:用于生成钱包地址的层次结构,便于管理和备份。

BIP-39: 助记词标准

  • 解决的问题:提供一个人性化且易于记忆的方式来备份和恢复钱包种子。
  • 功能:定义了一个由2048个单词组成的列表,用于生成助记词短语,这些短语可以转换成种子。
  • 应用:允许用户通过记忆一串单词来备份他们的钱包,简化了钱包的恢复过程。

BIP-44: 多重账户确定性钱包结构

  • 解决的问题:如何组织和管理具有多个账户和货币的钱包。
  • 功能:定义了一个钱包结构标准,允许钱包同时管理多个账户,每个账户可以包含多个地址。
  • 应用:用于多币种、多账户的钱包管理,提高了钱包的灵活性和可用性。

BIP-86: Schnorr签名

  • 解决的问题:提高比特币签名的效率和安全性。
  • 功能:引入Schnorr签名算法,允许多个签名聚合为一个,减少了签名数据的大小。
  • 应用:旨在提高交易的可扩展性和隐私性,同时减少交易验证的数据量。

总结

  • BIP-32 解决了密钥管理的可扩展性和效率问题,允许从单一种子生成多个密钥。
  • BIP-39 解决了用户备份和恢复钱包的问题,提供了一种易于记忆和记录的方法。
  • BIP-44 解决了多币种、多账户钱包管理的问题,提供了一种清晰的组织结构。
  • BIP-86 解决了提高交易签名效率和安全性的问题,通过引入Schnorr签名算法。

bip44 支持的完整币种列表: https://github.com/satoshilabs/slips/blob/master/slip-0044.md

由 Hexo 驱动 & 主题 Keep
总字数 42.8k