主页 > imtoken苹果下载官网 > 比特币源码解读十

比特币源码解读十

imtoken苹果下载官网 2023-06-26 07:58:40

本篇我们来看init.cpp中AppInit2的第八步: Step 8: load wallet 载入钱包。

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

加载钱包

以上部分是加载钱包的核心代码。 首先通过判断fDisableWallet变量来判断是否加载钱包。 这个变量就是第三步得到的用户参数(第3步参数传递给内部标签)。

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

是否使用钱包

这里需要对zapwallettxes命令进行说明。 这也是一个用户可选参数。 这条命令的意思是:清空钱包交易数据。 我们已经知道交易的确认需要交易费。 如果没有手续费或者手续费太低。 可能会导致这笔交易数据在网络中徘徊而不会被记录下来。 所以我们可以通过清除我们的节点交易并重新下载整个区块链来找到这个交易数据。 因此比特币源码详解,这是用户自行处理的可选选项。

我们可以看一下钱包类的ZapWalletTx函数:

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

比特币源码详解_比特币时间戳详解_用比特币源码做山寨币

清除钱包类的交易功能

可以看出比特币源码详解,该函数是通过CWalletDB类对象的ZapWalletTx()来清空交易的。 因为CWalletDB类是封装钱包数据的操作类。 我们的钱包数据存储在 wallet.data 中。 CwalletDB 类继承自 CDB 类。 CDB是对Berkeley数据库操作的封装。

Berkeley DB是一个开源的文件数据库,介于关系数据库和内存数据库之间。 它的使用方式与内存数据库类似。 它提供了一系列直接访问数据库的功能,而不像关系型数据库那样需要网络通信和SQL分析。 和其他步骤。

CDB.h定义在db.h中,CWalletDB定义在walletdb.h中。 大家可以自己看看整个代码。 我们这里主要看ZapWalletTx函数。

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

清空钱包交易数据

可以看出,这个函数调用了FindWalletTx函数,找到这个钱包的交易数据,存入vTxHash中。 最后调用EraseTx函数清除所有交易。

比特币时间戳详解_比特币源码详解_用比特币源码做山寨币

以下代码更新 CWallet 钱包对象。 并通过调用 LoadWallet() 下载钱包数据。 当然,LoadWallet最终会调用CWalletDB中的LoadWallet函数,重新从数据库中加载数据。 如果加载失败,则给出相应的提示。

关于钱包是我们创建交易的地方,存储着我们的密钥和一些交易数据。 这些内容足以让我们分析很久。 这里我们先了解一下。 我们接着分析下面的代码。

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

升级钱包

这段代码判断用户是否使用upgradewallet命令升级钱包。 具体逻辑是获取用户使用upgradewallet的version参数,即版本号。 如果nMaxVersion为0(即未输入要升级的版本号,则使用CLIENT_VERSION 系统定义的版本号。通过调用SetMinVersion升级。最后将当前版本设置为nMaxVersion。我们需要了解这个版本号.我们先看version.h中的源码。

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

版本号计算

比特币时间戳详解_用比特币源码做山寨币_比特币源码详解

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

clientversion.h 中的版本宏定义

通过源码可以看到CLIENT_VERSION由主版本号、次版本号、修订版本号和构建版本号组成。

让我们看看下面的代码:

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

生成钱包种子私钥

我在我的“比特币学习钱包”中介绍了它。 比特币钱包是一堆包含私钥的地方。 目前所有的钱包都是确定性钱包。 所以需要一个种子私钥,用于后面生成很多私钥。 现在我们的RandAddSeedPerfmon()就是生成种子私钥了。我们看一下它的生成过程,在util.cpp中

比特币源码详解_比特币时间戳详解_用比特币源码做山寨币

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

种子私钥生成过程

这段代码是WINDOWS系统中的生成过程。 而且可以发现这个生成过程非常耗时。 我们了解了种子私钥的过程,现在回到init.cpp继续下面的代码,可以看到pwalletMain钱包对象通过调用GetKeyFromPool从密钥池中获取了一个公钥,并设置为默认公钥,最后通过CPubkey对象GetID()生成比特币地址,并调用SetAddressBook()函数进行记录。我们知道,比特币地址是通过哈希算法对公钥进行加密生成的。 下面我们看看代码的实现

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

生成比特币地址

可见比特币地址是使用Hash160加密算法得到的。 这就是比特币地址生成的真面目。 理论基础可以看我之前写的《比特币学习比特币地址》。 这个方法在key.h中。 这是我们所有关键算法的源代码实现。 Hash160就是我们通常所说的双重哈希,是RIPEMD160(SHA256(K))两种加密算法的共同实现。

我们看一下加载钱包的最后一部分:

比特币源码详解_比特币时间戳详解_用比特币源码做山寨币

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

扫描钱包数据

第一部分RegisterWallet,和我们在《比特币源码解读5》中做的一样,都是通过signal对象实现的对交易数据的各种拦截和处理。 每个人都可以自己阅读。

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

注册钱包

以下代码扫描一次钱包数据。 具体调用的函数是ScanForWalletTransactions()。 下面看一下这个函数的具体实现,了解区块链的数据结构和遍历方式:

用比特币源码做山寨币_比特币源码详解_比特币时间戳详解

扫描钱包数据

通过这段代码我们可以看到,所有的块数据都存储在硬盘中。 而我们的chainActive就是存储区块的位置信息链,通过遍历位置链得到对应的区块数据和交易数据。

好的。 我们第八步的代码也解析到这里。 再次声明,分析的可能不准确,但希望能带领自己和大家进入源码的世界,共同进步。