从 BIP39(助记符)到 BIP32(公钥/私钥)

Posted

技术标签:

【中文标题】从 BIP39(助记符)到 BIP32(公钥/私钥)【英文标题】:Going from BIP39 (mnemonic) to BIP32 (public/private keys) 【发布时间】:2019-06-07 23:58:50 【问题描述】:

我正在寻求开发一些代码,从助记符创建比特币私钥和公钥。我目前对这个过程的理解是:

entropy > nmemonic > seed > public/private keys > public address

我在我的代码中使用Trezor's nmemonic library 和moneywagon。

import string
from random import SystemRandom, randrange
from binascii import hexlify, unhexlify
from moneywagon import generate_keypair
from mnemonic import mnemonic

def gen_rand():
    foo = SystemRandom()
    length = 32
    chars = string.hexdigits
    return ''.join(foo.choice(chars) for _ in range(length))

mnemo = mnemonic.Mnemonic('english')

entropy = gen_rand()
# entropy = '00000000000000000000000000000000'

words = mnemo.to_mnemonic(unhexlify(entropy))
seed = hexlify(mnemo.to_seed(words, passphrase='apassphrase'))
address = generate_keypair('btc', seed)

print(words)  
print(seed)
print(address['public']['address'])
print(address['private']['hex'])

如果你注释掉上面的熵行,然后运行代码,你会得到:

abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
b'05de15fb96dc0ab9f03c9d411bf84c586c72e7c30bddd413a304896f9f994ea65e7fcafd2c6b796141e310850e5f30b6abc2e6aec79a8ff81f4ba38fde81c403'
15GyM1xxxxxxxxxxxxxxxxxxxxxxTXrrvG
8ede10xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcae501

我的问题是iancoleman.io/bip39 或bip32jp.github.io 中没有反映这些用于生成助记符和公钥/私钥。

我哪里错了?

【问题讨论】:

moneywagon 库不支持 BIP32。 BIP32 定义了如何从种子生成私钥,但是moneywagon 使用它自己的方法(来自种子的sha256)。 BIP32 以更复杂的方式派生私钥。 @zergatul 他们会从相同的输入生成相同的输出吗? 是的,BIP32 从相同的输入生成相同的地址 【参考方案1】:

根据您的助记符,两个网站都会生成与您相​​同的种子:

abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about

考虑到你的强制熵,https://bip32jp.github.io/english/ 也给出了这个特定的助记符

entropy = '00000000000000000000000000000000'

(您必须选择 base 16 编码,因为您对 unhexlify 的调用会这样解释此字符串)

第一个站点https://iancoleman.io/bip39/#english 似乎启发式地确定熵的字符串编码并将其识别为二进制。因此,这会产生另一个结果。

address['public']['address']
address['private']['hex']

这两个页​​面都与您的不同,因为这些页面使用的派生算法与moneywagon 不同。 Moneywagon 使用BIP38 一种不鼓励的算法。我认为这就是两个网站不提供它的原因。

【讨论】:

为什么不应该使用 BIP38? @Sevenearths 我不是这方面的专家。但这是该提案的官方结果,您可以在提供的链接中看到。我建议询问 Moneywagon 的开发人员 - 我假设他们已经考虑了利弊 @Sevenearths 关于最初的问题有什么可以帮助您的吗?如果没有,您会考虑将答案标记为已接受吗?

以上是关于从 BIP39(助记符)到 BIP32(公钥/私钥)的主要内容,如果未能解决你的问题,请参考以下文章

BIP39:助记词

理解开发HD 钱包涉及的 BIP32BIP44BIP39

理解开发HD 钱包涉及的 BIP32BIP44BIP39

HD钱包: BIP32BIP44BIP39

以太坊 助记词提取 账户 公钥 私钥 最新实现可用。

BIP39助记词生成简单流程