比特币 五、网络

我们前面在描述比特币系统的工作过程时说过,用户把交易发布到比特币网络上,结点收到这些交易以后,把他们打包到区块里,然后把区块也发布到比特币网络上,这些新发布的区块在比特币网络上是怎么传播的呢?下面介绍一下比特币网络的工作原理
 
比特币工作在应用层,他的底层是一个p2p网络
application layer:BitCoin Block chain
--------------------------------------------------
network layer:P2P Overlay Network
 
比特币的p2p网络是非常简单的,所有结点都是对等的,他不像有的p2p网络有所谓的超级结点(spuer node)或者有的叫主结点(master node)。比特币网络中所有结点都是平等的,你要想加入这个网络首先要知道至少一个种子结点(seed node)你和这个种子结点联系,他会告诉你他所知道的网络中的其他结点,结点之间是通过TCP来通信的,这样有利于穿透防火墙。离开的时候不需要做任何操作,不用通知其他结点,推出应用程序即可,别的结点没有听到你的消息,过了一段时间之后就会把你删掉。
 
比特币网络的设计原则是简单、鲁棒,而不是高效,每个结点维护一个邻居结点的集合,消息传播在网络中采取flooding的方式,结点第一次听到某个消息的时候,把他传播给其他所有邻居结点,同时记录一下这个消息我已经收到过了,下次再收到这个消息的时候就不用转发给邻居结点了,邻居结点的选取是随机的,没有考虑底层的拓扑结构。比如一个在加利福利亚的结点,他选的邻居结点可能少在阿根廷的,这样设计的好处是增强鲁棒性,他没有考虑底下的实际拓扑结构,鲁棒性非常强,但牺牲的是效率,你向你身边人转账和向一个美国人转账,他的速度是差不多的。比特币系统中每个结点要维护一个等待上链交易的集合
 
比如这个集合当中的交易都是要等待写入到区块链里的,第一次听到某个交易的时候,把这个交易加入到这个集合,并且转发这个交易给邻居结点,以后再收到这个交易的时候就不用转发了,这样避免交易会在网络上无限的传输下去,转发的前提是这个交易得是合法的,得有合法的签名、以前没有被花过,这里有一个risk condition,就是有可能有两个有冲突的交易,差不多同时被广播到网络上,比如说有一个交易是A转钱给B,另外一个交易是A转钱给C,这两个交易如果差不多同时广播到网络上的话,每一个结点根据在网络中的位置不同,有的可能先收到第一笔交易,有的可能先收到第二笔交易,不管先收到哪个,之后再收到第二个交易的时候,就是非法的,因为和第一个有冲突,就不管了
 
新发布的区块在网络上的传播方式,和新发布的交易是类似的,每个结点除了要检查区块内容的合法性以外,还要检查其是否在最长合法链上,越是大的区块,在网络上传播的速度就越慢,比特币协议对区块大小有明确的限制,最大不能超过1M,很多人觉得1M太小了,但实际上这个限制也是有一定的道理的,因为比特币网络采用的传播方式是非常消耗带宽的,带宽是瓶颈,按照1M的区块大小限制来算的话,一个新发布的区块有可能需要几十秒才能传播到网络上的绝大多数结点
 
比特币网络的传播是属于best effort,一个交易发布到比特币网络上,不一定所有的结点都能收到,而且不同结点收到交易的顺序也不一定是一样的,网络传播存在延迟,而且这个延迟有的时候可能会很长,而且有的结点可能不一定按照比特币协议的要求进行转发,比如有的可能该转发的不转发,导致某些合法的交易收不到,也有的一些结点转发一些不该转发的消息,比如说有些不合法的交易他也会转发,这就是我们一个去中心化系统中面临的一个实际问题
 
 


posted @ 2021-02-17 14:55  lazy远  阅读(303)  评论(0)    收藏  举报