主页 > 怎么注册imtoken钱包 > 比特币源代码研究第 25 部分

比特币源代码研究第 25 部分

怎么注册imtoken钱包 2023-12-10 05:09:48

今天继续深入AppInitMain函数,我们来详细分析一下。

比特币开源代码_比特币开源代码查询_比特币源代码编译

src/bitcond.cpp, src/init.h, src/init.cpp, src/util.h, src/util.cpp, src/net.h, src/net.cpp, src/net_address.h, src/ net_address.cpp、src/netbase.h、src/netbase.cpp

1.设置代理

proxyrandomize参数是在2015年7月12日发布的0.11.0版本中加入的。该参数的作用是让比特币网络节点同时连接到多个不同的节点,避免连接到恶意节点或被禁止的节点在 P2P 网络中,同时提高连接稳定性和隐私性。 这些方面的改进 这在节点初始化期间尤为明显。

(原文:#privacy-disable-wallet-transaction-broadcast)

该参数的解析代码如下:

bool proxyRandomize = GetBoolArg("-proxyrandomize", DEFAULT_PROXYRANDOMIZE);

从上面的代码我们可以看出这个参数的默认值为DEFAULT_PROXYRANDOMIZE,它的定义位于init.cpp中:

static const bool DEFAULT_PROXYRANDOMIZE = true;

该参数默认值为true,也就是说即使我们启动时不显示该参数,随机代理功能也会生效。该参数主要用于后续代理

代理参数解析代码如下:

std::string proxyArg = GetArg("-proxy", "");

从上面的代码我们可以看出,默认情况下,比特币节点没有设置代理地址,其代理地址一般为空。 我们先看代理设置参数-proxy的注释:

// -proxy 为所有传出网络流量设置代理

// -noproxy(或-proxy=0)以及空字符串可以用来不设置代理,这是默认的

从注释中我们可以知道,如果设置了代理地址,则代理将为该节点的所有出站连接提供代理地址。 在-noproxy 或-proxy=0 的情况下,不会设置代理地址。

后面的SetLimited(NET_TOR)代码是限制与TOR匿名网络的连接。 如果设置了proxy代理地址并且有效,则可以连接匿名网络,如代码所示:

如果 (proxyArg !="" && proxyArg != "0") {

CServiceresolved(LookupNumeric(proxyArg.c_str(), 9050));

proxyType addrProxy = proxyType(resolved,proxyRandomize);

如果(!addrProxy。IsValid())

return InitError(strprintf(_("无效代理地址:'%s'"), proxyArg));

SetProxy(NET_IPV4, addrProxy);

SetProxy(NET_IPV6, addrProxy);

SetProxy(NET_TOR, addrProxy);

设置名称代理(地址代理);

SetLimited(NET_TOR,false); // 默认情况下,-proxy 将 onion 设置为可达,除非 -noonion 稍后

}

在上面的proxy中,我们首先看CService类,它是CNetAddr的基类,两者都定义在netaddress.h中。 CNetAddr 是一个 IP 地址封装类。 CService在IP地址的基础上增加一个TCP端口号,形式为IP:端口号。 一个更具体的例子是 192.168.1.1:8080。

通过 CServiceresolved(LookupNumeric(proxyArg.c_str(), 9050)); 该代码实现了将代理地址传递给已解析的 CService 对象,其中 LookupNumeric 将 IP 和端口字符串转换为 IP 地址和端口。 如果我们在proxy参数中没有设置端口号或者设置错误的端口号,默认会使用9050端口。 然后将resolved和proxyRandomize参数传入proxyType类的对象中,proxyType类定义在netbase.h中,然后判断addrProxy的合法性,其实就是判断resolved的合法性,也就是是否resolved IP和port是有效的比特币源代码编译,如果不是则程序退出,否则会为IPV4、IPV6和Tor设置代理,使其可以连接所有网络。

2.设置洋葱路由

设置onion routing和之前的代理地址类似,只不过这里指的是为Tor网络设置代理地址,其解析过程和proxy类似,都是传入IP+端口的方式比特币源代码编译,所以我赢了在这里重复一遍。

3、网络设置外参分析

这里涉及到的新的外部参数主要有listen、discover、dns、blockonly、externallip。 这些参数的含义如下:

-listen:监听的外接IP地址,详见本人简书专栏《比特币源码学习八》;

-discover:发现配置文件中保存的默认IP地址,详见本人简书专栏《比特币源码学习八》;

-blocksonly:节点进入blocksonly模式。 详见本人简书专栏《比特币源码学习十六》;

-externalip=ip:指定你自己的外部IP地址。 详见我的简书专栏《比特币源码学习八》。

其他参数的含义在《比特币源码学习八》等文章中也有详细介绍,这里不再赘述。

我的简书专栏:

4. ZMQ消息管理中间件

ZMQ是一个消息管理中间件,通过它我们可以实现节点间的消息订阅、发布和消息通信。 ZMQ官方解释如下:

ZMQ(以下简称ZeroMQ)是一个简单易用的传输层,一个类似框架的socket库,让Socket编程更简单、更简洁、性能更高。 是一个消息处理队列库,可以跨多个线程、核心和主机盒进行弹性扩展。 ZMQ的明确目标是“成为标准网络协议栈的一部分,进而进入Linux内核”。 还没有看到他们的成功。 然而,它无疑是一个非常有前途且非常需要的“传统”BSD 套接字包装器。 ZeroMQ 使编写高性能网络应用程序变得极其简单和有趣。

具体内容请参考或自行百度:

在比特币网络中,我们可以通过订阅比特币核心的ZMQ消息,即时高效的接收到区块更新、交易更新等消息,达到近乎实时的通讯效果。 但前提是开启ZMQ消息接口,其开启定义是通过ENABLE_ZMQ实现的,编译比特币源码时需要设置ENABLE_ZMQ。 如果编译环境中有zmq库,则同时设置该库的链接。 那么ENABLE_ZMQ就会为真,然后就可以使用zmq消息管理库了。

最后要说的是最大上传速度参数maxuploadtarget,它的单位是MiB/24小时,如果这个参数的值为0,则输出速度不会被限制。 默认是DEFAULT_MAX_UPLOAD_TARGET为0,即默认不限制外部上传速度。

5.结论

以上就是设置代理、设置洋葱路由、网络相关外参分析、ZMQ的代码学习。 这些内容和前面的一样,属于比特币网络相关的初始化过程。 比特币网络的初始化过程到此结束。 区块链加载的代码我会在后面的文章中详细讲解,敬请期待!