比特币源码研读之二十五

我们今天将继续深入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

一、设置代理

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

(原文见:https://bitcoin.org/en/release/v0.11.0#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 sets a proxy for all outgoing networktraffic

// -noproxy (or -proxy=0) as well as the empty stringcan be used to not set a proxy, this is the default

从注释我们可以了解到如果设置了代理地址,proxy将为节点所有输出连接提供代理地址,-noproxy或者-proxy=0的情况下将不设置代理地址。

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

if (proxyArg !="" && proxyArg != "0") {

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

  proxyType addrProxy = proxyType(resolved,proxyRandomize);

  if (!addrProxy.IsValid())

    return InitError(strprintf(_("Invalid-proxy address: '%s'"), proxyArg));

    SetProxy(NET_IPV4, addrProxy);

    SetProxy(NET_IPV6, addrProxy);

    SetProxy(NET_TOR, addrProxy);

    SetNameProxy(addrProxy);

    SetLimited(NET_TOR,false); // by default, -proxy sets onion as reachable, unless -noonion later

    }

在上面的代理中我们首先来看CService类,该类是CNetAddr的基类,二者的定义均在netaddress.h中。CNetAddr是IP地址封装类,CService在IP地址的基础上增加了TCP端口号,形式为IP:端口号,更具体的例子是192.168.1.1:8080。

通过CServiceresolved(LookupNumeric(proxyArg.c_str(), 9050));代码实现将代理地址传入到CService对象resolved中,其中LookupNumeric是将IP与端口字符串转换为IP地址与端口。如果我们在proxy参数中未设置端口号或者设置错了端口号将默认采用9050端口。随后将resolved与proxyRandomize参数传入proxyType类的对象中,proxyType类定义于netbase.h中,然后判断addrProxy的有效性,其实是判断resolved的有效性,即解析后的IP与端口是否有效,如果无效则程序退出,反之将对IPV4、IPV6以及Tor设置该代理,从而可以连接至所有网络中。

二、设置洋葱路由

设置洋葱路由与前面代理地址类似,只是此处指针对Tor网络设置代理地址,其解析过程与proxy类似,均为传入IP+端口方式,此处不再赘述。

三、网络设置外部参数解析

此处涉及的新外部参数主要包括listen、discover、dns、blocksonly以及externnalip,这几个参数的含义如下:

-listen:监听的外部连接IP地址,具体见我简书专栏中的《比特币源码研读之八》

-discover:发现配置文件中存储的默认IP地址,具体见我简书专栏中的《比特币源码研读之八》

-blocksonly:节点进入blocksonly模式,具体见我简书专栏中的《比特币源码研读之十六》

-externalip=ip:指定自身的外部IP地址,具体见我简书专栏中的《比特币源码研读之八》。

其他参数的含义也在《比特币源码研读之八》还有其他文章中已详细说明,此处不再详述。

我的简书专栏:https://www.jianshu.com/u/30081a05cf95

四、ZMQ消息管理中间件

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

ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD 套接字之上的一层封装。ZMQ 让编写高性能网络应用程序极为简单和有趣。

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

https://blog.csdn.net/lengye7/article/details/80370611?utm_source=copy

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

最后要提到的是最大上传速度参数maxuploadtarget,其单位为MiB/24小时,如果该参数的值为0,将不限制输出速度。其默认是DEFAULT_MAX_UPLOAD_TARGET即为0,意思是默认不限制对外上传速度。

五、结束语

以上即为设置代理、设置洋葱路由、网络相关外部参数解析以及ZMQ等内容的代码研读,这些内容与前文一样,都属于比特币网络相关的初始化过程,比特币网络的初始化过程到此已结束,我将在后面的文章中详细解读区块链加载的代码,敬请期待!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 上一节提到了一个问题:比特币默认的日志输出文件是哪个? 不知道大家找到了没,现在答案公布如下: 如果有看过我的第一...
    Jacky_2c9f阅读 599评论 0 0
  • 4. 第六步:网络初始化 这一步包含的代码在init.cpp的AppInitMain()函数中的1286-1391...
    风来雾去阅读 985评论 1 2
  • 刺儿的老家有条河,叫做沿悲河。 那河里的水不是清幽幽的那种,而是带着一些沉闷的浑浊。 似乎被人整日搅弄着河里的泥沙...
    羊恩阅读 361评论 0 1
  • 成琴打电话给我,我以为她是要去上海学萨提亚,原来她是问我有没有财商课的主持稿。 我主持确实是只打流程,不打草稿的,...
    潇仪2008阅读 67评论 0 0