新发布的区块,交易在网络上是如何传播的?
比特币工作在应用层(application layer:Bitcoin block chain),它的底层是一个网络层(network layer:P2P overlay network)。
工作流程
所有节点都是平等的,没有super node,master node。要加入网络,至少有一个种子节点 seed node,与seed node联系,它会告诉你它所知道的网络中的其他节点,节点之间通过TCP通讯,有助于穿透防火墙。离开网络不需要其他操作,不用通知其他节点,直接退出程序即可。其他节点没有你的消息,一段时间之后就会把你删掉。
设计原则
simple,robust but not efficient。每个节点维护一个邻居节点的集合,消息传播在网络中采取floading的方式。节点第一次听到某个消息时,把它传播给所有邻居节点,同时记录下该消息已经收到过,当下次再收到时就不会转发给邻居节点。邻居节点的选取是随机的,没有考虑底层的拓扑结构,例如一个在加利福尼亚的节点,他选取的邻居节点可能在阿根廷,这样的好处是增强robust,牺牲了efficient,你向身边的人转账和你向远处某地的人转账速度差不多。
比特币系统中每个节点要维护一个等待上链的交易的集合,该集合中的交易都是等待要写入区块链的。第一次听到某个交易时,把交易写入该集合,并转发交易给邻居节点,以后再收到该交易不再转发,避免交易在网络上无线传输下去。转发前提是交易是合法的,比如合法的签名,以前没有被花过。
可能会出现risk condition,就是出现两个有冲突的交易,几乎同时被广播到网络上,比如交易1)A-->B,交易2)A-->C(假设两个交易花的是同一个币),那么每个节点根据在网络中的位置不同,有的可能先收到1)交易,有的可能先收到2)交易,并加入到集合中,之后再收到另外一个交易时,就认为是非法的,不予理会。
如果集合中的交易或者与其冲突的交易被写到区块链中,那么该交易就会从集合中删掉。比如新发布的区块里面包含交易1),那么该交易就会从集合中删掉;如果新发布的区块包含交易2),交易1)同样被删掉,因为此时该交易是非法交易。
新发布的区块在网络上的传播与节点类似,每个节点除了检查区块的内容合法性之外,还要检查是否是在最长合法链上。
越大的区块传播速度越慢,比特币协议限制区块大小最大为1M。因为比特币网络采用的这种传播方式非常消耗带宽,带宽是瓶颈,按照1M的区块大小来算,一个新发布的区块可能需要几十秒才能传播到网络上的绝大多数节点。
比特币网络的传播属于best effort。一个交易发布到比特币网络上,不一定所有节点都收到,而且不同节点收到交易顺序也不一样,网络传播存在延迟,也不是所有节点都按照比特币协议规定去转发,比如不转发合法交易,或转发非法交易。