美文网首页
比特币网络原理分析

比特币网络原理分析

作者: 链人成长chainerup | 来源:发表于2019-09-15 22:29 被阅读0次

    本文是《循序渐进比特币》第五篇-比特币网络原理分析。我们知道区块链底层就是一个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方法。

    8 参考文献

    比特币源码
    比特币源码分析--P2P网络初始化

    9 其他

    本文是《循序渐进比特币》的第五篇-比特币网络原理分析。
    如果有疑问,可以直接留言,也可以关注公众号 “链人成长chainerup” 提问留言,或者加入知识星球“链人成长”~

    相关文章

      网友评论

          本文标题:比特币网络原理分析

          本文链接:https://www.haomeiwen.com/subject/xfjryctx.html