概述
- P2P Overlay network
- 交易的广播
- 区块的广播
P2P Overlay network
比特币网络的设计目标是简单、鲁棒,而非高效。
比特币的网络层运行的是一个 P2P Overlay network,网络中所有的节点都是对等的,使用TCP协议通信。
如何发现其它节点
既然每个网络节点都是平等的(是指在网络层面上节点是平等的,但各节点在功能上可以有不同的分工, 如钱包节点、挖矿节点等),不存在任何“特殊”中心节点,那么当新的网络节点启动后,它是如何跟其他的节点建立连接,从而加入到比特币网络呢?
在中心化网络中,新加入的节点只要连接“特殊”的中心节点就可以加入网络。
为了能够加入到比特币网络,比特币客户端会做一下几件事情:
- 节点会记住它最近成功连接的网络节点,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。
- 节点会在失去已有连接时尝试发现新节点。
- 当建立一个或多个连接后,节点将一条包含自身 IP 地址消息发送给其相邻节点。相邻节点再将此消息依次转发给它们各自的相邻节点,从而保证节点信息被多个节点所接收、保证连接更稳定。
- 新接入的节点可以向它的相邻节点发送获取地址 getaddr 消息,要求它们返回其已知对等节点的 IP 地址列表。节点可以找到需连接到的对等节点。
- 在节点启动时,可以给节点指定一个正活跃节点 IP, 如果没有,客户端也维持一个列表,列出了那些长期稳定运行的节点。这样的节点也被称为种子节点(其实和 BT 下载的种子文件道理是一样的),就可以通过种子节点来快速发现网络中的其他节点。
相邻节点的选择是无视底层网络拓扑的,一个在A国的节点的相邻节点可能会在B国,并不是空间上的相邻。
交易的广播
当一个节点收到一笔合法交易的时候会记住这笔交易并广播给相邻的节点,通过 Flooding 来将一个交易广播给全网,同时当节点收到重复的交易时也自然不会重复广播。
如果某个交易被写到区块链中后,则之前记住这笔交易的节点就要删除这个交易,因为已经没有必要记录了。
如果节点收到的被写到区块链中的交易和自己记住的交易发生冲突,则删除自己记录的交易。
区块的广播
广播的过程和交易类似,区别是收到区块的节点还要判断这个区块是不是在最长合法链内。