主页 > 苹果下载imtoken教程 > 比特币网络架构及节点发现分析
比特币网络架构及节点发现分析
比特币网络架构和节点发现分析
一、P2P 网络架构
比特币采用基于互联网的点对点(P2P:peer-to-peer)分布式网络架构。
比特币网络可以被认为是按照比特币 P2P 协议运行的节点集合。
本文分析了比特币网络,它与传统的中心化网络有何不同,以及比特币网络如何发现相邻节点。
二、节点类型及分工
虽然比特币P2P网络中的每个节点都是平等的,但根据提供的功能不同,每个节点可能有不同的分工。每个比特币节点都是路由、区块链数据库、挖矿和钱包服务的功能集合。一个全节点包括下图所示的四个功能:
下图是一个比特币网络节点,具有四个完整的功能:钱包、矿工、完整的区块链、网络路由节点。每个节点都参与整个网络的路由功能,也可能包含其他功能。每个节点都参与验证和传播交易和区块信息,发现和维护与对等节点的连接。一个名为“网络路由节点”的橙色圆圈表示此路由功能。
一些节点维护完整的、最新的区块链副本,这样的节点被称为“完整节点”。全节点可以独立验证所有交易,无需任何外部参考。
还有一些节点只保留部分区块链并通过称为简单支付验证 (SPV) 的方法验证交易。此类节点称为“SPV 节点”,也称为“轻量级节点”。
三、对等发现
为了能够加入比特币网络,比特币客户端会做几件事:
一个。该节点会记住它最近成功连接的网络节点比特币的交易数据怎么看,并且在重新启动时可以快速重新连接到之前的对等网络。
b.节点在失去现有连接时会尝试发现新节点。
c。在建立一个或多个连接后,该节点会向其相邻节点发送一条包含其自身 IP 地址的消息。然后相邻节点依次将消息转发给各自的相邻节点,从而保证节点信息被多个节点接收,保证连接更稳定。
d。新连接的节点可以向其相邻节点发送 get-address getaddr 消息,要求它们返回其已知对等节点的 IP 地址列表。节点可以找到要连接的对等点。
e。当节点启动时,您可以为该节点指定一个活动节点 IP。如果没有,客户端还会维护一个长期稳定运行的节点列表。这样的节点也称为种子节点(其实和BT下载的种子文件一样),可以通过种子节点快速发现网络中的其他节点。
1、比特币的核心部分维护着一个节点列表,它可以在启动时连接到这些节点。当一个完整的节点第一次启动时,它必须被引导到网络。这个过程现在通过一个简短的 DNS 种子列表在比特币的核心实现自动化。选项 -dnsseed 可用于定义此行为,默认设置为 1。DNS 请求返回可连接 IP 地址的列表。从那里,比特币客户端可以连接到整个比特币网络。
2、另一种引导方式是使用参数-seednode=。通过该参数,用户可以预先定义在建立对等体列表后连接和断开哪个服务器。另一种方法是在启动 Bitcoin Core 时配置 -connect= 参数以选择要连接的对等点(未配置的 IP 将不会连接)。添加节点的最后一种方法是通过参数 -addnode= 将单个节点添加到节点列表中。
引导过程完成后,节点向其对等节点发送包含其自身 IP 地址的 addr 消息。它的每个对等点都会将此信息转发给自己的对等点,以进一步扩展连接池。
您可以通过getpeerinfo命令查看连接到某个节点的peer节点及相关数据。
3、连接到对等体
节点通过发送版本消息连接到对等点。消息版本包含来自远程节点的节点版本信息、区块信息和时间。一旦对等方收到此消息,它必须回复一个 verack。如果愿意建立对等关系,它会发送自己的版本消息。
一旦建立对等关系,节点就可以向远程节点发送getaddr和addr消息,以获取其他对等节点信息。为了保持与对等点的连接,默认情况下,节点至少每 30 分钟向对等点发送一次消息。如果超过 90 分钟没有收到回复,则节点认为连接断开。
4、块广播
与对等节点建立连接后,双方互相发送包含最新区块哈希值的getblocks消息。如果一个节点认为自己有最新的区块信息或有更长的链,它会发送一个包含最多 500 个最新区块的哈希的 inv 消息,表明它有更长的链。接收节点使用 getdata 请求块详细信息,远程节点使用命令块发送此信息。在处理完 500 个区块信息后,节点可以通过 getblocks 请求更多的区块信息。这些区块在被接收节点认证后被确认。
新区块的确认也可以通过矿工挖掘和发布区块来找到。扩散过程与上述类似。通过之前的连接,新的区块以inv消息的形式发布,接收节点可以通过getdata请求这些区块的详细信息。
5、交易广播
与对等节点的交易是通过 inv 消息实现的。如果收到getdata信息,则通过发送tx实现交易。对等点接收有关有效交易的信息并以类似的方式传播它。如果交易信息在一段时间内没有放入区块,该交易将从内存池中清除,原节点会重新发送交易信息。
6、行为不端的节点
对于所有广播,那些行为不端(通过发布错误信息占用带宽和浪费计算资源)的节点将受到惩罚。如果节点惩罚分数超过阈值 -banscore=,它将被禁止加入网络几秒钟。这个时间由参数-bantime=定义,默认值为86400秒,也就是24小时。
7、警告
为了应对可能出现的漏洞和攻击,比特币开发者提供比特币警告服务RSS。比特币用户可以使用 getinfo 命令查看其特定客户端版本的错误消息。
此信息通过警报消息尽可能多地传播给每个连接的对等方。
错误消息使用特定的 ECDSA 私钥进行签名,由极少数开发人员控制。
补充资源:如果想了解各种消息的详细结构和所有消息类别,可以参考比特币Wiki上的协议描述。
四、通过dns种子获取节点列表数据
1、什么是dns种子
返回比特币网络上的完整节点 IP 用于协助节点发现的 DNS 服务器地址。
2、在哪里可以找到它
我们在比特币源码中搜索关键字“seed.bitcoin.sipa.be”,最新的代码位置在chainparams中。在 cpp 中。
3、如何获取节点列表
这里需要用到开源项目,项目地址
下面开始具体操作。
我们使用的dns是seed.bitcoin.sipa.be
xiaoyu@xiaoyu-Parallels-Virtual-Platform:~/bitcoin-seeder$ dig -t NS testnet-seed. bitcoin.jonasschnelli.ch
再次查看项目文件夹,发现多了两个文件
dnsseed.dat
dnsseed.dump
查看 dnsseed.dump 文件,因此您有一个节点列表。
4、总结
将dns种子数据硬编码到项目中,也解决了分布式系统中先有鸡还是先有蛋的问题。
五、节点通信简述
比特币节点通常使用TCP协议,使用8333端口与相邻节点建立连接,在建立连接时还会有一个认证“握手”通信过程,确定协议版本、软件版本、节点IP、区块高度等
当一个节点连接到相邻节点时,它开始与相邻节点同步区块链数据(轻量级钱包应用程序实际上并不同步所有区块数据),节点之间交换一个getblocks消息,其中包含区块链的最顶层哈希本地区块链。如果一个节点识别出它接收到的哈希值不属于顶部块,而是属于一个不是顶部块的旧块比特币的交易数据怎么看,则称其自己的本地区块链比其他节点的区块链更强大。 long,并告诉其他节点该区块需要补充,其他节点发送getdata消息请求区块,验证后更新到本地区块链。
参考文章: