subtotal函数的参数含义_subtract函数的参数

subtotal函数的参数含义_subtract函数的参数比特币源码精读之钱包和交易一、钱包的种类非确定性钱包 早期的钱包基本都是由随机种子随机产生,所以每次都会产生完全没关系的互相独立的私钥。确定性钱包 确定性或者“种子”钱包,包含通过使用单项离散函数可从公共的种子生成的私钥。 主要是指分层确定性钱包(BIP-32/BIP-44),它由助

比特币源码精读之钱包和交易
  一、钱包的种类

  非确定性钱包 早期的钱包基本都是由随机种子随机产生,所以每次都会产生完全没关系的互相独立的私钥。确定性钱包 确定性或者“种子”钱包,包含通过使用单项离散函数可从公共的种子生成的私钥。 主要是指分层确定性钱包(BIP-32/BIP-44),它由助记词(BIP-39)生成随机种子来产生一系列的密钥。使用助记词的优势就在于可以把钱包固化到硬件中。这样就不容易因为遗忘等原因导致密钥的丢失。当然,在某种程度上也提高了安全性。

  二、创建钱包

  助记词的产生 在github上可以看到有八种语言(英、日、韩、西班牙、中文繁体、中文简体、法和意大利)基本词, 助记词经常与“脑钱包”混淆 。 他们不一样,主要区别在于脑钱包由用户选择的单词组成,而助记词是由钱包随机创建的,并呈现给用户。

  中文的开头几个:的 一 是 在 不 了…… 英文的开头几个:abandon ability able about above

  subtotal函数的参数含义_subtract函数的参数subtotal函数的参数含义_subtract函数的参数

  助记词和种子产生的过程: 创建一个128到256位的随机序列(熵)。 提出SHA256哈希前几位(熵长/ 32),就可以创造一个随机序列的校验和。 将校验和添加到随机序列的末尾。 将序列划分为包含11位的不同部分。 将每个包含11位部分的值与一个已经预先定义的2048个单词的字典做对应。 生成有顺序的单词组就是助记码。 PBKDF2密钥延伸函数的第一个参数是从步骤6生成的助记符。 PBKDF2密钥延伸函数的第二个参数是盐,由字符串常数“助记词”与可选的用户提供的密码字符串连接组成。 PBKDF2使用HMAC-SHA512算法,使用2048次哈希来延伸助记符和盐参数,产生一个512位的值作为其最终输出。 这个512位的值就是种子。

  可选密码短语

  类似于密码,但是又比密码功能多。 BIP-39标准允许在推导种子时使用可选的密码短语。 如果没有使用密码短语,助记词是由常量字符串“助记词”构成的盐进行延伸,从任何给定的助记词产生一个特定的512位种子。如果使用密码短语,密钥延伸函数使用同样的助记词也会产生不同的种子。

  事实上,给予一个单一的助记词,每一个可能的密码短语都会导致不同的种子。 基本上没有“错误”的密码短语,所有密码短语都是有效的,它们都会导致不同的种子,形成一大批可能未初始化的钱包。这批钱包非常之大(2^512),使用暴力激活成功教程或随机猜测基本不可能。

  不过这个容易引起不可逆转的密钥丢失,比如短语知晓人突然因为各种情况失忆或者去世。那么钱包中的币就没了。

  从种子创建钱包 :

  以libbitcoin为例,它实现了两种方法,即早期的electrum方法和BIP-39,事实上的标准方法,这里只介绍后者。

  重点看一下如何生成种子:

  内部会调用相关的哈希算法,HMAC-SHA512算法,使用2048次哈希来延伸助记符和盐参数,产生一个512位的值作为其最终输出。 这个512位的值就是种子。 算法的具体流程大家看相关的代码。在hmac_sha512.c sha512.c pkcs5_pbkdf2.c三个主要的文件中。

  从种子创建钱包

  有了种子就可以创建钱包相关的私钥和公钥了,如下图所示:

  subtotal函数的参数含义_subtract函数的参数subtotal函数的参数含义_subtract函数的参数

  三、密钥的衍生

  强化衍生和正常衍生:一个是从母公钥衍生子链码,一个是从母私钥衍生子链码。为了区别二者,产生的索引号区分了范围:

  前者是0~2^31-1,后者是2^31~3^32-1

  由主私钥衍生出的私钥起始以“m”打头。由主公钥衍生的公钥起始以“M“打头。因此,母密钥生成的第一个子私钥是m/0。第一个公钥是M/0。第一个子密钥的子密钥就是m/0/1,以此类推。

  钱包树状结构的导航

  钱包树太灵活了,不容易控制。所以BIP-43,44提出了多帐户结构。BIP-43提出使用第一个强化子索引作为特殊的标识符表示树状结构的“purpose”。基于BIP-43,HD钱包应该使用且只用第一层级的树的分支,而且有索引号码去识别结构并且有命名空间来定义剩余的树的目的地。举个例子,HD钱包只使用分支m/i'/是为了表明那个被索引号“i”定义的特殊为目地。

  在BIP-43标准下,为了延长的那个特殊规范,BIP-44提议了多账户结构作为“purpose”。所有遵循BIP-44的HD钱包依据只使用树的第一个分支的要求而被定义:m/44'/。 BIP-44指定了包含5个预定义树状层级的结构: m / purpose' / coin_type' / account' / change / address_index

  第一层的purpose总是被设定为44'。

  第二层的“coin_type”特指币种并且允许多元货币HD钱包中的货币在第二个层级下有自己的亚树状结构。目前有三种货币被定义:Bitcoin is m/44'/0'、Bitcoin Testnet is m/44'/1',以及 Litecoin is m/44'/2'。

  第三层级是“account”,这可以允许使用者为了会计或者组织目的,而去再细分他们的钱包到独立的逻辑性亚账户。 举个例子,一个HD钱包可能包含两个比特币“账户”:m/44'/0'/0' 和 m/44'/0'/1'。每个账户都是它自己亚树的根。

  第四层级就是“change”。每一个HD钱包有两个亚树,一个是用来接收地址一个是用来创造找零地址。注意无论先前的层级是否使用强化衍生,这一层级使用的都是常规衍生。这是为了允许这一层级的树可以在不安全环境下,输出扩展公钥。

  第五层级是被HD钱包衍生的可用的地址,它是第四层级的子级,就是树的“address_index”。

  四、交易

  还是得先上一张交易图: subtotal函数的参数含义_subtract函数的参数subtotal函数的参数含义_subtract函数的参数

  来查看一下比特币的发送代码:

  交易的创建

  继续看sendCoins这个函数:

  RelayWalletTransaction调用RelayTransaction

  下面是驱动本节点数据向外分发交易数据的部分,即把vInventoryToSend中的数据发送到P2P网络:

  在启动分析过程中知道,在aapinit2中会调用StartNode–ThreadMessageHandler:在其中通过BOOST的信号连接:

  g_signals.SendMessages(pnode, pnode == pnodeTrickle || pnode->fWhitelisted); 循环调用SendMessages

  来看一下那个PushMessage:

  由于字数限制,请前往Github阅读完整文章:XChainLab/documentation

  五、总结

  通过分析钱包的生成方法和实现过程,可以对钱包的应用有一个更直观的认识。在比特币网络中,通过钱包进行交易还是要占相当一部分比重的。同样,交易做为整个比特币中最重要的 环节之一,通过其可以实现比特币在用户间的流通,并可以实现一些特定的目的(比如多签等)。

  在比特币提供的原生钱包里,可以非常容易的进行比特币的交易,不过,随着比特币的影响越来越大,对比特币钱包和网络的交易的安全性提出了更新的挑战。这也是钱包技术和交易安 全的一个重要的发展方向。subtotal函数的参数含义_subtract函数的参数subtotal函数的参数含义_subtract函数的参数

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/93222.html

(0)
上一篇 2024年 5月 28日 下午9:10
下一篇 2024年 5月 28日

相关推荐

关注微信