跳过正文

7. 比特币网络

·54 字·1 分钟
Chuck Chan
作者
Chuck Chan
分享技术、思考与生活

比特币网络
#

上篇文章中说到用户打包交易发布到区块链网络中去,那么新发布的区块是如何传播到其他节点上去呢?

比特币网络
#

比特币协议工作在应用层,其底层是一个 P2P Overlay Network(P2P覆盖网络)。

比特币系统中所有节点完全平等,没有所谓的超级节点,要加入这个P2P网络,首先至少要知道一个种子节点,通过种子节点来获取其他节点的信息。节点之间是通过TCP协议进行通信,方便穿透防火墙。

设计原则
#

比特币网络的设计原则是简单、鲁棒,而不是高效,消息在节点中传播是使用flooding的方式,当某个节点收到消息时,会把这个消息传播个他的邻居节点,同时标记该消息已经接收过,避免重复接收消息。邻居节点的选举是随机的,并不是考虑实际的网络拓扑结构,这样做的好处是可以增强鲁棒性。

在比特币的每个节点中都要维护一个等待上链的交易集合,第一次收到交易消息,验证完其合法性后,需要将这个消息放到这个集合中,并且通知其他的邻居节点。

交易冲突
#

假设有A -> B,A -> C两笔交易(A为同一笔交易的UTXO输出),同时广播到网络上,每个节点在网络中的位置不同,有些节点可能先收到A -> B,有些节点可能先收到A -> C。

拿节点1举例,当先A -> B的交易消息,再接收A -> C的交易消息时,会判断A已经被花过,所以会拒绝写入A -> C。同理,节点2会拒绝写入A -> B。

我们再假设交易A -> B是合法的,交易A -> B属于一笔钱花两次,即double spending,当交易A -> C被其他节点打包到新区块上链后,节点1接收到新区块中的交易消息A -> B,则认为交易A -> B属于double spending,则会在等待上链的集合中删除交易A -> B。

容量限制
#

新发布区块在网络中传播方式与新发布交易传播方式类似,每个节点除检查该区块内容是否合法,还要检查是否位于最长合法链上。区块越大,则网络上传输越慢。所以比特币协议对于区块大小限制在1M以内。

此外,比特币网络传播属于Best effort(尽力而为),不能保证一定传输成功。所以一个交易发布到网络上,未必所有节点都能收到,也未必所有节点收到交易顺序都一致。