比特币钱包中有什么
比特币钱包只保存用户公私钥对的 密钥链 。
区块链是去中心化的,没有类似银行等可以保存用户余额等信息的机构,钱币只体现在交易中,因此比特币钱包中没有比特币。
钱包的种类
非确定性钱包(Nondeterministic Wallet, 也称 Just a Bunch Of Keys,简称 JBOK 钱包):所保存的密钥间无联系。
确定性钱包(Deterministic Wallet):所保存的密钥均由一个主密钥产生,该主密钥被称为种子。为便于用户记忆,种子被编码为一组单词(不限于英语),这些单词也称为助记词。
BIP 共同定义了一种确定性钱包的实现,这种钱包被称为分层确定性(HD,Hierarchical Deterministic)钱包 。
HD钱包
助记词是如何生成的(BIP-39)
生成一个 128 位(到 256 位)的随机序列(熵);
提出该随机序列经 SHA256 后产生序列的前几位(熵长/32)作为该随机序列的校验和;
将校验和添加到随机序列的末尾;
将添加校验和后的序列以 11 位为单位进行划分;
将每个 11 位与预先定义的包含 2048 个单词的词库比对进行替换;
得到助记词。
生成种子(BIP-39)
PBKDF2 密钥延伸函数的第一个参数是从步骤 6 生成的助记符。
PBKDF2 密钥延伸函数的第二个参数是盐。 由字符串常数“助记词”与可选的用户提供的密码字符串连接组成。
PBKDF2 使用 HMAC-SHA512 算法,使用 2048 次哈希来延伸助记符和盐参数,产生一个 512位 的值作为其最终输出。 这个 512 位的值就是种子。
生成公私钥对 (BIP-32)
使用 HMAC-SHA512 对种子进行哈希加密;
HMAC-SHA512 使用 SHA512 哈希算法,以一个消息和一个密钥作为输入,生成 512 位的消息摘要作为输出;
从种子计算主私钥时,种子作为输入的消息,字符串“Bitcoin seed”作为输入的密钥,计算产生 512 位的输出。
将加密输出的 512 位结果划分为左右两个 256 位;
左 256 位作为主私钥,由它生成 264 位的主公钥;
右 256 位作为主链码。
主私钥用于生产后代子私钥和主公钥;
HD 协议使用 ECDSA 公钥函数 point()(椭圆曲线)由公钥生成私钥。
point()
child_public_key ==
point( (parent_private_key + i) % p ) ==
parent_public_key + point(i)
1 child_public_key ==
2 point( (parent_private_key + i) % p ) ==
3 parent_public_key + point(i)
对上面解释,
子私钥的生成:子私钥 = (父私钥 + i) % p
公钥的生成:公钥 = point(私钥)
同时,point() 满足如下特性:
子公钥 = 父公钥 + point(i)
对于上述一般密钥, i = 索引;
对于扩展密钥, i = 索引 + 父公钥 + 父链码;
对于强化自密钥, i = 索引 + 父私钥 + 父链码。
小结
生成过程如下:
随机序列 -> 助记词
助记词 + salt -> 种子
种子 + 字符串“Bitcoin seed” -> 主密钥 -> 主公钥
因此 HD 钱包中需保存助记符和用户密语。
扩展密钥
为了切断兄弟姐妹间的联系,需加入新的计算参数,这就是扩展密钥。
———————————————
原文链接:https://blog.csdn.net/m_pNext/article/details/109482025
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。