Qtum量子链对等节点通信原理剖析以及调试
前言
这篇文章深入探讨了运行 Qtum 全节点时其中一个最有趣的问题: Qtum节点如何连接到其他对等节点,过程是怎样的以及无法连接时如何排除错误?
对大多数应用程序来说,家庭网络足够简单易用,但是当你使用 Qtum 节点遇到问题时,你打算怎么处理? 路由器 - 防火墙 - 杀毒软件体系具有许多内置保护功能,可以确保你网络的安全和正常运行,但运行区块链对等网络可能会与这些内置保护措施发生冲突。
举例而言,你的节点将 “好友请求” 发送出去,与其他节点试图连接,它们确认请求方可和你的节点聊天了。你的节点也能够从其他节点接收“好友请求”。
我们将会了解什么是 Qtum 全节点,Qtum 网络与对等连接如何运作,以及如何设置可能阻止这些通信的这些通信的防火墙和路由器。 我们将花一些时间在端口和网络协议上,并会涉及与 “netstat” 网络状态相关的工具。 我希望在我们完成这些工作之后,你将了解你的 Qtum 节点如何能愉快地与世界各地的节点进行信息交换。
Qtum 主网性能
据我计算,Qtum 主网持续稳定运行中,Qtum全网权重约为20,800,00,推算依据是 一个余额为20,800,000的稳定挖矿地址获得了8.9%的区块奖励,这意味着挖矿的年化收益约为4.2%。
设置杀毒软件
由于许多历史原因,许多杀毒程序在下载 Qtum 钱包安装文件时会误报病毒错误,并隔离或删除这些下载。 要解决此问题,请为杀毒程序添加白名单,如果有问题,请从 Qtum GitHub 站点https://github.com/qtumproject/qtum/releases下载并使用验证文件校验。
Qtum 对等连接
Qtum 节点(核心钱包)将连接多达 125 个对等点。 前 8 个连接仅出站:连接到其他 8 个节点。 如果路由器和家庭网络的端口 3888 处于打开状态,则该节点将接受对等点 9 到 125 的入站连接。 值得注意的是,无论挖矿节点连接到8个节点还是125个节点,都不影响其获得挖矿奖励。 具有大于 8 个对等连接的节点支持连接到网络的新节点,并将下载块来同步这些新节点。 有 8 个出站连接的节点不能这样做。现在我们已经绕过杀毒程序并安装了钱包,我们可以启动该节点并开始连接到其他节点。
全节点连接
在了解关于 Qtum 对等连接如何工作的细节之前,我们先看一下全节点的角色,挖矿钱包以及出站连接与入站连接的问题。Qtum 全节点连接到 Qtum 对等网络,将整个区块链同步到本地存储中,并实时验证和传送每个区块和交易。 Qtum 节点以此验证来保护网络,然后将块/交易转发给其他节点。 Qtum 全节点可能另外持有 QTUM 并挖矿以赢取块奖励。这些全节点有助于保护网络,并有机会赢得块奖励。对 Qtum 来说,全节点始终是钱包,但钱包并不总是全节点,
具有入站连接的节点在 Qtum 网络上具有特殊功能:它们将允许新节点连接到网络,并且将它们以前存的块下载到这些新节点。对于有入站连接的节点,我们应该特别感谢,没有它们,网络无法通过添加新节点来增长。我们将在下面看到,节点在主网上允许入站连接的能力取决于路由器到家庭网络的端口 3888 ,所以这些入站的好友请求可以实际到达节点。
路由器和家庭网络
大多数家庭网络通过因特网服务提供商(ISP)提供的网络接入设备连接到因特网,该服务提供商可以是电缆调制解调器,DSL调制解调器或其他网络接口设备。 调制解调器通常有一个内置路由器,路由器的工作是提供从 ISP 提供的单个公共 Internet 地址到家庭网络上多个内部IP地址的地址转换。 这些内部IP地址通常由诸如 UPnP(universal plug and play)之类的协议自动分配,重要的是要知道,路由器将单个外部 IP 地址映射到家庭网络上连接的多个设备的内部IP地址。
Netstat工具
在本节中,我们添加一些实用的网络程序和诊断技术。 通常,你的家庭网络允许 Qtum 节点自动同步,但如果没有,这些工具可能有助于排除错误。为了监控你的家庭网络,netstat(网络状态)程序是一个很好的开始。它内置于 Mac 和 Windows,在Linux上你可能需要安装它(apt-get install net-tools)。“netstat -n” 命令将以数字形式显示网络地址和端口,显示一个节点连接到端口 3888 上的远程节点:
Addnode 命令
如果你的新节点没有与对等方连接,则需要使用 “addnode” 命令提供帮助。 你可以告诉节点向特定 IP 发送“好友请求”。 但是你应该使用哪些 IP?
addnode 命令的一个很好的对等 IP 地址来源是 coinexchange.io,它列出了来自其 Qtum 节点的 “getpeerinfo” 数据。要使用此站点中的IP地址,在debug window中通过命令行输入,例如
addnode 123.45.67.89:3888 add
对 addnode 命令的正确响应是 “null”,然后你的节点将尝试一两分钟连接到该对等点 IP 地址。 你可以尝试手动添加 5 个或 10 个对等连接。
启动时连接
在本节中,我们将了解节点如何在启动时建立连接,并使用 netstat 来监听网络并查看节点如何连接。 我们的 netstat 命令是 “netstat -an 30”,意思是每隔 30 秒以数字格式显示所有连接和监听端口。
启动节点时,有几种方法可以找到要连接的对等点。如果节点先前已经运行,它将保存 IP 地址和时间在 peers.dat 文件中。 如果节点是新的或者在 peers.dat 文件中找不到一些好的IP地址,它将向 DNS 服务器查询当前 IP 地址的列表。 最后,你可以手动输入 IP 地址来尝试使用 “addnode” 命令。
首先,我们安装时将节点设置为在全局启动,且不使用 peers.dat 文件中的历史记录(只需重命名 peers.dat 文件,使节点找不到它)。
下面是一个新节点寻找其他节点的消息序列。 这个节点没有使用留有以前“朋友”的 peers.dat 文件。 在半小时的过程中,它将尝试多个IP地址,找到两个要连接的对等点:
Qtum 核心钱包有一个文件,其中包含所有“好友请求”,即 peers.dat 文件。 同一个节点使用 peers.dat 文件启动(将先前的文件名改回 “peers.dat”)可使钱包在 12 分钟内与 10 个对等点连接。 下面的图表显示钱包另找新朋友(没有 peers.dat 文件 - 如上所示)与仅仅联系以前的朋友(使用peers.dat 文件)时的差异:
用于网络事件的 Debug.log 文件
Qtum 节点现在已经就绪它的特写,我们将通过设置 debug.log 来捕获所有网络事件。 这是启动钱包时通过 debug=net 开关完成的:
C:\Program Files\Qtum>qtum-qt.exe -debug=net
根据你的操作系统调整此命令。
加上该选项后,节点将记录有关网络活动的所有详细信息。
有关显示连接如何建立简单的列表(下面的参考文献7中给出了更完整的序列),日志显示:
(1)启动后,我们的节点尝试根据 peers.dat 文件连接到多个 IP。 它在十天前看到节点 59.189.111.143,但现在不能连接。
(2)我们的节点连接到 DNS 种子服务器以获取最近的一些 IP 地址。
(3)我们的节点试图连接到地址 35.226.31.206,要尝试的是第6个节点。
(4)我们的节点在 35.226.31.206 处向节点发送版本消息(软件版本,块编号和时间参考)。 该版本消息是“好友请求”。远程节点将使用自己的版本消息进行响应。
(5)节点交换 verack 消息(版本确认)以确认连接。 现在它们是好友,可以开始聊天了。 我们的节点将向远程节点请求额外的IP地址,发送其他“好友请求”。
(6)我们的节点将其最新的块(它离线差了 4 块)发送到 35.226.31.206,并请求下载块以追上。
(7)我们的节点开始接收来自节点 6 的块。
请注意时间戳,节点启动后尝试连接节点 6(对等节点 1 到节点 5 未连接)需要45秒,然后等待一秒完成连接(verack 消息)并开始下载块。