区块链技术10:如何存储和使用比特币

比特币钱包中有什么

比特币钱包只保存用户公私钥对的 密钥链 。

区块链是去中心化的,没有类似银行等可以保存用户余额等信息的机构,钱币只体现在交易中,因此比特币钱包中没有比特币。

钱包的种类

非确定性钱包(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

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

微信号已复制,请打开微信添加咨询详情!
-->