比特币源码解读十三

96
ttblack
2017.10.28 21:06* 字数 1017

我们现在通过对Appinit2的分析看到了很多比特币的核心内容,现在我们要看的是第十一步。也有非常核心的内容。我们先大概了解下这步的内容:Step 11: start node (启动节点)

节点启动

一。我们先看下CheckDiskSpace函数 ,在main.cpp中。

CheckDiskSpace

可以看到通过filesystem的space函数获取比特币的目录的硬盘空间,能过比较我们设置的最小值(nMinDiskSpace)进行的空间判断。这个最小值是50M。定义在main.h中。

要求最小硬盘空间

二。RandAddSeedPerfmon 

这个函数我们在《解读十》中有过介绍,这个函数就是用于生成种子私钥的。关于什么是种子私钥,在我以前的文章中都有过介绍,《解读十》中也有提及。

三,启动节点

连接到比特币网络

此函数的主要功能就是进行了本节点的网络发现,并进行连接,其中CNode类为节点类,定义在net.h中,这类包含了一个节点的所有信息。然后,调用Discover函数进行网络发现。

获取本机IP地址

这个函数让我们认识了在windows系统下和Linux系统下不同的获取本地IP地址的方式。其中在Windows系统中首先使用gethostname()函数先取得本机的主机名,然后调用LookupHost函数根据主机名获取本机的局部IP地址。在其他系统中可以直接使用getifaddrs()函数直接获取了本机IP地址,并且这个函数的参数就是直接存储地址信息的结构对象。这个结构对象是ifaddrs的指针。其结构定义为:

ifaddrs结构体

其实getifaddrs函数是创建了一个描述本机ip地址的链表,其中ifa_next指向链表的下一个成员;ifa_name是接口名称,以0结尾的字符串,比如eth0,lo;ifa_flags是接口的标识位(比如当IFF_BROADCAST或IFF_POINTOPOINT设置到此标识位时,影响联合体变量ifu_broadaddr存储广播地址或ifu_dstaddr记录点对点地址);ifa_netmask存储该接口的子网掩码;结构体变量存储广播地址或点对点地址(见括弧介绍ifa_flags);ifa_data存储了该接口协议族的特殊信息,它通常是NULL(一般不关注他)

我们接下来也看下是如何获取本机的外网地址的吧,在上面的截图中可以看到是新建了一个线程调用ThreadGetMyExternalIP来获取本机外网地址的,也叫扩展IP地址。我们先看源码:

获取本机外网地址

通过上面的代码可以看到为了保证可以获取本机外网地址,分别使用了91.198.22,70和checkip.dyndns.org分别获取本机外网地址,这个双重循环就是分别使用两种方式,其中第一次是使用ip地址方式,第二次使用域名地址方式。我们可以分别在浏览器中敲入上面的两个地址试验一下,我的结果是使用91.198.22.70的方式获取到了,但checkip.dyndns.org这个地址连接不到。所以这也是为什么会用双重循环的方式,这种编程习惯也值得我们借鉴。

大家可以看下我的实验结果:

获取本机外网IP地址

我们下面可以看下根据上面的IP地址和域名获取本机外网地址的过程和处理方式

创建连接获取外网地址

看到这里我们就已经对启动节点时候的网络连接有了一点了解,而且内容已经不少了。最主要是我们知道了获取本机地址的方式和源码里的结构。为了好消化,就先写到这里了。


作者:区块链研习社比特币源码研读班,black

比特币学习
Web note ad 1