比特币和区块链(8):比特币网络的节点加入

上一回我们介绍了比特币的P2P拓扑网络结构。今天我们讨论比特币网络中新节点是如何加入到这个网络的。

新节点如何加入到P2P网络里,归根结底来说是如何发现并联系现有的P2P网络里面的某个已有的节点。对每个P2P网络来说,如何发现某个已有的节点都是很重要的事情。而事实上如何发现已有节点,天下常用的办法无非就那么几种。比特币的P2P网络也不能免俗。

节点发现分为节点的首次发现,和节点的后续发现。前者是一个萌新下载了比特币钱包软件,第一次决定献身于比特币大业的时候。这个时候的典型特点是一穷二白,本地尚未连接过任何比特币网络的节点,所以也就无从谈起要和上次连接过的节点打交道。后者是比特币网络已经加入进来过,又退出。再次进入时候有了先验知识。

对于这些DNS种子节点来说,每个下载的钱包里面往往会自带一些。比特币软件启动起来,会通过DNS查询找到这些域名对应的IP地址。这样子一来,比特币软件就可以通过这些IP地址加入到比特币的P2P网络里了。

第二种方式叫做硬编码IP地址连接。在比特币的代码中,被强行硬编码了一些地址。如果通过DNS查询的域名方式失败以后,比特币软件会尝试连接这些种子节点。

比较两种方式来看,前者通过成熟的DNS查询,IP地址可变,后者则被硬编码,很容易被有心的机构给屏蔽掉,也不容易更改IP地址。所以DNS种子节点的连接方式是首选。硬编码的IP地址的连接方式是无可奈何之下的备用手段。既不灵活也不可靠。我们同时可以看到,如果比特币软件被第一次运行,接入到比特币P2P网络的办法无非也就是这两种每个程序员应该都能想出来的办法。

比特币节点接入到比特币网络以后,会逐渐获得一些临近节点。这些临近的节点是和该节点直接联系并且常通讯的节点。每次比特币软件退出的时候,这些节点都会被保存下来。当节点再次启动的时候,会首先尝试连接这些节点。如果这些节点连接失败了,才会尝试去连接DNS种子节点,如果再次失败了才会去连接硬编码的节点。

考虑到当前比特币网络非常的巨大而且活跃,上次连接过的临近节点完全连不上的可能性会比较小。所以大部分情况下对于已经连接过比特币网络的节点,都不需要访问DNS种子节点或者硬编码节点。

比特币网络中对临近节点的处理比较任意,并没有用任何成熟的节点链表协议,比如说分布式哈希表(Distributed Hash Table,或者简称DHT),这一点倒是非常令人吃惊的。因为使用DHT作为临近节点的连接方式已经几乎是每个比特币之前成熟的P2P项目的标配了。当然,这个协议也成为了比特币以外的后来者比如以太坊的临近节点连接方式。有关DHT的细节因为和比特币的网络无关,我们就不展开了。大家可以自行寻找合适的教材学习。

比特币网络作为一个互联网上的P2P网络,不可避免的会遭遇到恶意ip地址的攻击。所以在比特币代码里,允许用户手动添加两类节点:可疑节点和可信任节点。前者是黑名单,后者是白名单。这也是比特币P2P网络里应对攻击的一种手段,聊胜于无的防君子不防小人的方式。

说到比特币的P2P网络,我们就不能不提P2P网络里面共同存在的问题:如何让局域网内的一台机器去和互联网的P2P网络连接。如果有电驴或者BT下载经验的人一定知道,内网如果不能直连的话,下载的速度会非常的慢。这个问题解决技术的标配是:NAT技术和UPnP协议。NAT技术是成熟的内外网映射的方式,简单来说就是替换TCP报文中源地址并映射到内网地址。UPnP是Universal Plug and Play的缩写,它主要是用于设备的智能互联互通。

比特币也使用了UPnP协议作为局域网穿透工具,只要局域网中的路由设备支持NAT网关功能,支持UPnP协议,那么局域网中的比特币客户端就可以制动连接映射到公网上。

社区介绍:

极客社区:区块链极客社区起源于北美顶尖的工程师社群,核心成员来自于各大科技公司、顶尖学府。社区以打造世界级区块链生态为宗旨,以促进区块链技术的普及为己任,希望站在区块链时代的风口上将最优质的区块链资源分享给用户!在这里,你将获得最权威的区块链教程、最新鲜的区块链资讯,以及对接最顶级区块链生态圈的机会。

加入我们,与硅谷大牛、藤校学霸一起,把酒言欢,链上论道;加入我们,拥抱区块链去中心化的朝阳,破旧立新,让思维碰撞,让智慧共享;

加入我们,肩负起区块链时代赋予我们的独特使命,不忘初心, 砥砺前行!

不割韭菜,只谈技术,专属于工程师的社区!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180903G0CNAO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券