比特币工作在应用层,它的底层是一个P2P网络。比特币的P2P网络是非常简单的,所有节点都是对等的,不会出现某些P2P网络中所谓的超级节点或者中心节点。

比特币网络的设计原则:simple, robust, but not efficient,即简单,健壮,而不是高效。每个节点都会维护一个邻居节点的集合。交易在网络中以flooding的方式进行传播。

每个节点都会维护一个交易池,存放未确认的交易。当节点第一次接收到某个消息时,它会把这个消息放入交易池中,并将消息发送个邻居节点;之后再收到这个消息的时候就不会再转发给邻居节点。这样可以避免交易在网络上无限制地传播下去。

进行交易转发的前提是该交易必须是合法的。比如A–>B 和 A–>C。这两个交易如果同时在网络上传播的话,根据节点在网络中的位置不同,每个节点收到的交易顺序也会不同。假如一个节点先收到第一个交易,验证合法后会保存交易到交易池中,并转发给邻居节点;再接收到第二个交易时会认为与前一个交易有冲突,属于非法交易,就不会再将它放入交易池中。

假如有节点接收到一个新发布的区块,其中包含了A–>B的交易,那个它会将本地交易池中A–>B的这笔交易删除。

要加入比特币网络,首先得知道至少一个种子节点,然后你要跟种子节点联系,它会告诉你它所知道的网络中其它节点。节点之间通过TCP通信,这样有利于穿透防火墙。当你离开时,不需要通知其它节点,关闭程序即可。其它节点在长时间收不到你的消息后会自动将你删除。

在比特币网络中,邻居节点的选择是随机,没有考虑底层的拓扑结构。这样的好处是增强了健壮性,但牺牲了效率。

新发布的区块,在网络上的传播有很多方式。每个节点除了要检查区块内容的合法性之外,还要检查它是不是在最长合法链上。

比特币系统采用的传播方式是非常耗带宽的,因此越大的区块,在网络上传播的速度越慢。比特币协议对区块的大小限制在1M字节大小。以1M字节大小计算,一个新生成的区块可能需要几十秒才能传播到网络的大部分节点上。这已经是很长时间了。

比特币网络的传播,属于尽力而为型,这意味着一个新的交易发布到比特币网络上,不一定所有的节点都能收到,由于网络延迟的原因,也不是所有的节点收到的顺序都一样,而且也不是所有的节点都会按照比特币协议进行转发。


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin92
Github: mengbin92
cnblogs: 恋水无意