主页 > imtoken钱包官方 > 比特币源码解读九

比特币源码解读九

imtoken钱包官方 2023-12-03 05:08:27

现在发现突然扯远了,又回到init.cpp中的AppInit2函数。我们来看第七步:load block chain load block chain

这部分内容也很多。 让我们分几个部分来看:

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

创建块目录的硬链接

这部分代码是在加载区块链之前建立一个区块文件夹。 这个外部文件夹就是存放区块数据的地方,然后为这个文件夹创建了9999个硬链接。 我们看看百度百科对什么是硬链接的解释:

硬链接概念

一个文件有几个文件名(使用ln命令实现多个文件名)比特币代码多少位,我们说这个文件有多少个链接。 根据定义,这个链接数可以是1,这意味着该文件只有一个文件名。

简而言之,硬链接就是允许多个不在或不在同一目录下的文件名同时修改同一个文件。 其中一个被修改后,所有硬链接到它的文件都被一起修改。

我们看一下这个函数的描述:

比特币股市代码是什么_比特币代码多少位_比特币挖矿代码

void create_hard_link(conststd::filesystem::path&target, constpath&std::filesystem::link);

link 和 target 是引用同一个文件的两个逻辑名称(它们是等价的)。 即使原来的target被删除了,文件也会继续存在比特币代码多少位,可以通过链接访问。

所以创建硬链接还有一个好处,就是防止误删。 创建了这么多硬链接,我猜主要是为了防止块数据被误删。

如果硬链接创建成功,则fReindex = true; 意味着重新索引块数据。

下面的代码是计算各种数据的缓存大小。 我们先看一下txdb.h中dbCache(数据库缓存)的常量定义:

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

dbCache 大小边界

这部分代码限制了数据库的缓存大小。 最大缓存大小和最小缓存大小有一个常数。 可以看到默认的缓存大小是100MB,最大缓存大小由编译器决定。 如果编译器大于4byte,则最大为4096兆,否则为1024兆。 最小缓存为 4 兆字节。

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

设置缓存大小

这部分代码对总的缓存大小和块中的不同缓存大小进行了边界判断和设置。 同时设置 Merkle 树和 coinDB 的大小,nCoinCacheSize。 其中nCoinDBCache是​​缓存总大小的一半,nCoinCacheSize是300bytes的整数倍。 所以最后我们用300来分,具体内容我们继续往下看。

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

加载块数据

这部分代码主要使用LoadBlockIndex()加载区块数据,创建了三个对象(CBlockTreeDB、CCoinsViewDB、CCoinsViewCache)。

CBlockTreeDB:处理区块的数据库,这个类定义在txdb.h中。

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

比特币代码多少位_比特币挖矿代码_比特币股市代码是什么

块树数据库

可以看到这个类继承自CLevelDbWrapper类。 而这个类封装了LevelDB的操作。 这个LevelDB就是我们所有的比特币区块都存放的地方,也就是我们常说的数据库。 看看百度百科是怎么说的:

Leveldb:是Google实现的一个非常高效的kv数据库。 目前1.2版本可以支持亿级数据量。 在这个级别也有非常高的性能,主要是由于其良好的设计。

KV数据库:使用键值(Key-Value)存储的数据库,是一种NoSQL(非关系型数据库)模型,其数据以键值对的形式进行组织、索引和存储。

所以我们知道比特币使用的数据库是LevelDB,然后通过CLevelDBWrapper类封装定义在leveldbwrapper.h中,但是我们的数据是通过CBlockTreeDB来操作的。

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

CLevelDBWrapper 类

CCoinsViewDB:

比特币代码多少位_比特币股市代码是什么_比特币挖矿代码

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

CCoinsViewDB 类

此类在 txdb.h 中定义。 通过代码可以看出是对ClevelDBWrapper类对象的操作,是继承自CCoinsView的类。 所以也就有了CCoinsView的操作。 而 CCoinsView 是对我们拥有多少比特币的操作。

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

CCoinsView类

可以看到这个类中的函数都是虚函数。 所以这些函数的操作都是在CCoinsViewDB中实现的。 而CCoins就是对我们UTXO(未花费交易输出)的封装。

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

CCoins类

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

而我们最关心的是如何计算我们的余额(我有多少比特币),也就是有多少个UTXO值。 下面我们就来看看这部分代码的真实内容吧。 这个函数是 GetStats(CCoinsStats &stats);

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

获得比特币余额

我们来看最后一个类CCoinsViewCache:

比特币挖矿代码_比特币代码多少位_比特币股市代码是什么

CCoinsView缓存

从代码和注释可以看出这个类是一个缓存类。 cacheCoins 用于存储缓存数据; hashBlock 用于存储区块哈希值; 这个类的使用估计在以后的阅读代码中会看到。

现在我们知道我们的比特币余额是如何计算的了。 而比特币源码中的UTXO对象就是一个CCoins对象。 而我们的区块数据和交易数据都存储在LevelDB中,通过CCoinsViewDB对数据库的操作来存储和记录我们的区块和交易数据。

我们现在对第七步的解释几乎是一样的。 具体代码大家可以在对应的类中仔细阅读。 下一篇我们直接看第八步的代码。