http://www.btcbtcbtcbtc.com

比特币网络原理分析

比特币网络原理分析
我们知道区块链底层就是一个P2P网络。本文我们只会简单讲一下比特币P2P网络的原理,不会涉及代码层面的知识。接下来的两节,会进行代码分析。
1 P2P基础知识
之前讲过P2P知识-拓扑结构与内容路由简析,我们在这儿简单回顾下:
1.1 P2P是什么
对等网络,即对等计算机网络,是一种在对等者(Peer)之间分配任务和工作负载的分布式应用架构,是对等计算模型在应用层形成的一种组网或网络形式。
1.2 P2P的拓扑结构
P2P拓扑结构经历了集中式、纯分布式、混合式、结构式四个阶段。
集中式具有单点的风险
纯分布式则会出现flood性能问题 以及响应风暴的问题
混合式则选用了几个Super node, 其他作为ordinary node , 这种结构则结合了集中式跟分布式的优点
结构化目前看来也比较理想。目前比较典型的算法是Kad算法,以太坊就采用了这种算法,后面我们会有文章专门讲解以太坊的网络。
2 比特币网络P2P
比特币采用了上述那种P2P拓扑结构呢?个人认为应该是处于纯分布式跟混合式之间,更偏向于混合式。
3 节点发现
比特币中的节点发现有两种方式:(1)利用种子节点:比特币网络中会有几个种子节点,硬编码在比特币的代码中。这几个种子节点为其他新进入网络中的节点提供路由功能。当普通节点(比如节点A)跟种子节点连接之后,会获取种子节点上其他节点的信息(比如节点B、C),有了众多节点信息之后,节点A会记录下来,等下次再启动时,可以从DB中读取自己记录的节点信息。如果自己记录的节点都离线了,则会继续去读取种子的信息。(2)引导节点:如果已经知道某些节点信息,在启动时可以直接指定这些节点。
4 地址广播与发现
新节点加入网络之后,自身存储的其他peer信息不充足,此时可以向已经连接的节点,比如种子节点发送getAddr消息,收到getAddr消息的节点,会查询自身缓存的peer信息,发送给请求peer.新节点加入之后,发送addr消息,收到addr消息的节点,会广播这个新节点的地址,这样很快新节点的信息就会遍布全网。
5 握手协议
节点发现之后,要进行连接,连接的第一步就是握手。握手的主要内容是看对方是不是对的节点,比如是不是同一个网络(具有相同的networkId)、版本号是不是太老等。握手的步骤就是一方(A)发送version消息,另一方(B)收到之后发送verAck消息进行确认。然后另一方(B)再发送version消息,等待本方(A)的verAck, 经过这个交互过程,双方就可以建立连接,互相通信了。另外,btcd版本的getAddr 消息就是在发送version 消息时,检查peer数量是否满足某个阈值,如果不满足就顺带发送getAddr消息。
6 连接管理
btcd版本的连接管理主要是由connManager来处理。里面定义了inbound(进入的请求)管理、outbound(请求别人)管理、连接建立管理、连接消息管理等几部分组成。
7 消息互通
比特币的消息通信主要分peer、block、message、inv等几种。定义了一个staleHandler 协程来监控消息处理的进展;还定义了一个queueHandler协程, 所有的任务通过它来调度;针对每种消息,都定义了一种特殊的处理handler方法。
 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 全部评论(0
    还没有评论,快来抢沙发吧!