专业的
中文比特币论坛

比特币节点识别的原理及实现方式

比特币节点识别的原理及实现方式

比特币节点要加入网络,首先得获取其他节点的 IP 地址。到 2017 年 12 月时,比特币源码里包含着 6 个 DNS 域名,新节点朝着这些域名发起 DNS 请求,就能获取到种子节点列表。依靠这种办法,节点一般能得到约 140 个活跃的比特币节点地址(IPv4)。获取到种子节点列表后,新节点便可以开始跟这些节点建立 TCP 连接并展开通信。

跟比特币节点相互之间进行通信所依据的是TCP协议,其默认所使用的端口是8333。节点会在套接字之上直接就把数据给打包成为二进制流来展开传输工作,通信的流程主要是划分成为握手以及数据交换这两个阶段。

节点间建立通信的第一步是握手,以节点A希望与节点B建立连接来说,A第一步会向B发送一个含有自身协议版本信息的消息,B收到消息后会对数据包做验证,若验证无误就会向A回应自己的版本信息,接着B会向A发送确认消息,A收到后也会回应一个确认消息,至此握手过程正正常常结束,握手无误后,节点之间就能够开始交换数据。

于完成握手之后,节点能够借由发送特定消息,去获取对方节点周遭的活跃节点信息。举例而言,节点A能够向着节点B发送获取地址的那种消息:B接收之后,会回应一个或者多个addr消息,而这里面涵盖着B节点所缓存的其他活跃节点地址;每一个addr消息包当中,最多能够包含1000个地址。

比特币协议数据包结构,被划分成包头与载荷两部分,包头涵盖magic、命令名称、载荷长度以及校验和四个字段,magic字段用以区分不同网络,像是主网络跟测试网络运用不一样的magic值,命令名称标明数据包类型,像握手时的version消息、确认时的verack消息,与传输地址时的addr消息。

根据消息类型,载荷部分的具体内容存在差异。比如说version消息,其载荷涵盖以下这些信息,有协议版本号,有节点所提供的服务,有时间戳,有接收者地址,有发送者地址,有随机生成的连接ID,有客户端软件描述,还有节点当前最新的区块高度等来着。verack消息呈现出不同情况币圈合约,它不过是仅有包头,而不存在载荷罢了。

addr消息的载荷,首先有个计数字段,它表示数据包里地址数量,数量在1到1000之间,之后是具体地址列表。每个地址条目当中,都有着时间戳、服务、IP地址以及端口号等信息。数据包里不同字段的类型与长度,于协议里有明确规定,这对比特币节点通信的识别和解析很关键。

依照上述协议所拥有的特性,促使比特币节点识别的脚本的主要流程呈现如下状况:首要的是借助于DNS种子去达成对种子IP列表的获取,接着着手开启若干线程以扫描这些IP地址。在扫描的进程当中,该脚本会尝试着和每一个节点实现连接进而来开展握手操作。当握手达成成功之后,发送获取地址的消息,并且针对所接收到的数据包予以过滤,挑选出addr类型的数据包。在实施过滤的时候,主要是按照协议之中所规定的数据包长度以及特定字段来进行判定。

将addr包筛选出来后,脚本要依据包里面计数字段所指示的地址数量,以动态方式解析数据包的内容,从中提取出IP地址以及端口信息,解析完得出的新地址会添加至缓存列表里并且进行去重操作,以此作为后续扫描的目标。

旨在提升扫描效率,脚本运用多线程机制,主线程承担从种子 IP 起始扫描的任务,把扫描所得结果存放至缓存,另一个线程每隔 1 秒核查扫描结果,一旦新发现 1000 个地址,便启动更多线程针对这些地址开展二次验证,验证成功的节点会被记载到最终的输出字典里,对于每个节点,要是连续发送 40 个数据包依旧过滤不出 addr 包,或者在 10 秒内没法解析出 addr 包,那就跳过该节点接着处理下一个。

币圈合约带单-丽金财经

赞(0)
未经允许不得转载:丽金财经 » 比特币节点识别的原理及实现方式

评论 抢沙发

丽金财经

丽金财经是专业的中文比特币论坛,比特币用户可以在论坛上分享对数字货币以及币圈的经验和见解。丽金财经帮助新人学习和了解元宇宙区块链世界。