区块链P2P网络协议演进过程

区块链是以加密机制、储存机制、共识机制等多种技术组成的分布式系统,可以在无中心服务器的情况下实现相互信任的点对点交易功能。区块链最大的特点是去中心化和分布式,区块链共识机制使得参与节点共同为系统提供服务,实现中心化系统中类似金融中介机构的功能。共识机制是网络大部分节点在约定时间段内对交易状态达成相同的确认,其中共识性通过工作量证明(POW)、权益证明(POS)、实用拜占庭容错(PBFT)等多种共识算法实现。而一致性则要求大部分节点在约定时间段内保持数据内容一致,从而利用共识算法实现共识。传统中心化网络系统需要中心提供强大稳定的服务器和足够的带宽来支持客户端节点使用。通过 P2P,区块链系统可以在没有中心服务器的情况下达到快速同步数据、实现共识机制的一致性的目的。共识算法和 P2P网络分别承担共识性和一致性的任务,共同组成区块链的共识机制,从而实现区块链的分布式和去中心化。

P2P网络与区块链

  1. P2P在区块链的应用
    P2P网络自身有多方面优点,在区块链的应用如下:
  • 去中心化,区块链的资源和服务分布在所有参与节点上,通过共识机制维护区块链网络的一致性,无须中心系统的存在;
  • 可扩展性,区块链节点可以自由加入、退出,网络系统根据节点自由扩展;
  • 健壮性,区块链网络没有中心节点,也就没有了攻击对象,参与节点分布在网络中,部分节点遭到破坏对区块链系统无影响;
  • 高性价比,不需要昂贵的专业设备搭建中央服务器、不需要支付昂贵的宽带费用,普通用户也可以参与区块链
  • 隐私保护,区块信息采用广播机制,无法定位广播初始节点,防止用户通信被监听,保护用户隐私;
  • 负载均衡,区块链通过限制节点连接数等配置,来避免资源负载、网络阻塞。
  1. 区块链P2P网络分类
    针对区块链应用特点,按照 P2P网络是否去中心化、节点 地址是否结构化两个方面,将 P2P网络分为四类。
  • 中心化P2P网络 中心服务器对于中心化网络结构至关重要,保存接入节点的地址信息是网络的核心。普通节点通过接入中心服务器获取其他节点地址,从而实现节点与节点之间的通信。著名的 MP3共享软件 Naspter采用的就是中心化网络结构。将音乐文件与保存文件的节点相互关联,用户查找某个音乐时,中心服务器告知储存节点地址,用户点对点连接以获得音乐。中心服务器也决定着网络整体稳定性,一旦中心服务器出现问题,整个P2P网络就会瘫痪。这与传统中心化网络类似,如银行等金融机构。不同的是 P2P中心服务器只提供索引,而传统中心服务器提供完全服务。P2P网络节点可以直接与另外一个节点通信,而金融机构不允许节点间通信。
  • 全分布式非结构化P2P网络 全分布 P2P节点可以自由加入、退出,并且没有中心节点,节点地址没有结构化统一标准,整个网络结构呈随机图的结构,无固定网络结构图。其成功的应用产品是 gnutella通信协议,它是一种点对点的搜索系统。gnutella采用的是洪泛(flooding)技术实现发现其他节点和随机转发的机制,采用 TTL(timetolive)的减值来实现控制消息通信有限次数传播。然而完全的自由意味着新节点无法得知P2P网络节点信息,从而无法加入网络。因此 gnutella使用了目录服务器来方便节点得到其他节点的网络地址。全分布式P2P网络更加自由化的同时也带来了节点管理的问题,节点频繁地加入/退出使得整个网络结构无法稳定,大量的广播消息不仅造成资源浪费,甚至会阻塞网络。中本聪设计的比特币采用的就是这种P2P网络结构,全分布式使得任何人任何节点都可以参与,非结构化使得节点间既可以通过区块链P2P协议同步区块数据,又保持匿名隐私保护,使得区块链分布式去中心化概念深入人心。
  • 全分布式结构化P2P网络 全分布式最大的问题在于节点地址管理,节点间没有固定规则约束,无法精确定位节点信息,只能通过洪泛查询的方式进行查找,对网络的消耗很大。结构化网络采用分布式哈希表(distributedhashtable,DHT),通过如 hash函数一类的加密散列函数将不同节点地址规范为标准长度数据,比较成功的案例有 Chord、Pastry等。网络结构与非结构化相同,都是随机形式、无固定结构,但节点管理有固定结构图。以太坊将节点椭圆加密算法的公钥转换为 64 Byte的 nodeId作为唯一标志符来区分节点,使得以太坊可以在没有中心服务器的情况下实现节点地址的精确查找。
  • 半分布式P2P网络 结合中心化和分布式模型各自的优点,将节点分类成普通节点和超级节点,从而构成了半分布式网络结构。每个超级节点维护部分网络节点地址、文件索引等工作,超级节点共同实现中心服务器功能。超级节点本身却是分布式的,可以自由扩展退出,具备分布式网络优点,kazza是其代表性的成功应用。超级账本(fabric)采用的 P2P网络结构就是半分布式,将节点分为普通用户节点和超级节点(排序、背书节点等)。超级节点可以由普通节点选举,也可以自行配置,单独一个超级节点停机不影响系统运行。超级账本所有交易必须通过超级节点认证,区块也是由超级节点生成,普通节点间可以互相同步区块。

四种P2P网络结构各有优缺点,也适用于不同的应用场景。比特币最初的目标是建立去中心化的交易平台,致力于代替银行等金融机构实现价值转移交换。同时,中心化 P2P网络不符合区块链去中心化特征,没有相关产品。而中心化 P2P网络类似传统的中介式机构如银行等,本文所讨论的中心化系统是指银行类金融中介机构,其不具备 P2P功能,仅作为对标标的,以实现对区块链产品的对比评判。中心化 P2P网络是区块链产品致力于替代的标志系统,本文通过讨论中心化系统,从 P2P应用、区块链应用、是否去中心化、节点是否可精确查找等方面比较了四种 P2P网络

区块链P2P网络协议演进过程_第1张图片

比特币的P2P网络及节点发现

比特币开启了区块链时代,任何节点开启客户端后即可实现去中心化可信任的比特币交易。然而当一个全新的节点加入比特币网络时,首先要做的是接入网络。由于比特币完全去中心化,节点自由加入、退出导致新加入的节点无从获取网络中节点地址从而接入网络。为此,比特币设计三种节点发现方式:

a)种子节点。Napster采用的是中央服务器进行索引,由于中央服务器的存在,新加入节点可以稳定地接入网络。比特币虽然没有中心化服务器,但是也采用了 Napster的思路,设立“种子”节点。比特币将一部分长期稳定的节点硬编码至代码中,这些节点在初始启动时提供最初接入网络的入口节点。新节点通过这些稳定节点作为中介连接其他节点,并且可以持续获取区块链网络节点地址列表,所以这些节点也称之为种子节点。下图为比特币源码,方框中这些地址即为比特币初始化时加载的种子地址。
区块链P2P网络协议演进过程_第2张图片

b)地址广播。某个节点接入后,就能以这个节点为中介获取网络其他节点地址,这种方式被称为地址广播。广播包含如下两种方式:(a)主动广播(推)节点 A地址。比特币通过 Net.AdvertiseLocal()方法,将自身节点信息推送给其他节点。如图 4所示,这是一个主动单向过程,节点 B接收后只保存在本地,并不作回应;同样,节点 B与其他节点间也可以通过推送自身地址传递给其他连接的节点,通过推的方式使得连接节点获得自身节点的地址信息。(b)主动获取(拉)其他节点地址。推送自身地址,只局限于自身连接的节点,并不足以将地址广播出去,比特币还有另外一种地址广播机制,通过 Net.Addresses()方法主动拉取地址。如图 4所示,节点 A请求地址后获取节点 B,节点 B返回节点 B收录的地址信息。一次请求一次响应,以避免对网络资源的浪费。节点 B也可以通过向其他节点请求地址来扩充自身地址库。其他节点主动推送的地址也在拉取动作时返回请求节点,达到地址广播的目的。比特币的两种地址获取方式是独立的,这样可以防止攻击者通过伪造大量假的地址并广泛散播,导致正常节点无法接入比特币网络或接入虚假网络。

区块链P2P网络协议演进过程_第3张图片

c)地址数据库。为避免种子节点连接数及带宽限制,比特币节点接入网络后通过广播获取其他节点信息,并将结果保存,以便下次使用时接入网络。比特币客户端将获取的节点信息保存在 peers.dat本地文件中,使用的是 levelDB格式储存数据。如果节点 A与已建立的连接节点 B没有数据通信,节点 A会定期发送 ping消息(一个 8bit的随机数)到节点 B;节点 B会回复 pong消息,它是一个包含 ping随机数的响应报文,用以维持连接。如果节点持续某个连接长达 20min没有任何响应,它会被认为已经从网络中断开。比特币客户端启动后会发起定时循环任务,检查连接节点是否在线,并将失败的节点保存在 banlist.dat本地文件中。

比特币通过以上三种方式保持稳定的网络接入,实现对频 繁进出节点的地址列表维护,不需要中心机构的存在即可保持 节点可以自由加入网络,从而保障比特币 P2P网络稳定。

以太坊的P2P网络及节点发现

以太坊是在比特币基础上发展而来的,借鉴了很多比特币的思想,就连白皮书都有一半内容是描述比特币的功能。所以以太坊不仅能够实现类似比特币的交易系统,更希望构建基于区块链的生态环境,拓展依赖于以太坊衍生的分布式应用(Decentralizedapplication Dapp)。以太坊开发人员开发了一款分布式消息通信平台 Whisper和一款分布式存储平台以及内容分发服务平台 Swarm,这些应用的实现依赖于节点可以根据需要精确查找另一个节点地址的功能,而非结构化 P2P网络结构无法满足。因此以太坊采用结构化P2P网络,通过DHT技术实现结构化。DHT将 P2P网络节点通过 hash算法散列为标准长度数据,整个网络构成一个巨大的散列表。每个参与节点都有一部分的散列表,并储存维护自身数据,散列表分布在P2P网络各个节点上,任何接入 P2P网络的节点都有自身位于散列表中位置的 ID,可以通过 DHT寻找更多节点,也可以被其他节点根据 ID值精确查找。虽然 DHT支持节点自由地加入或退出,但 DHT的复杂维护机制使其无法适应高频的节点变化。以太坊使用的是 Kadenlia(KAD)协议,它是 DHT协议的一种,使用该协议可以快速准确地查找地址。

Kad介绍

与传统的 DHT比较,KAD有如下优点:

KAD的查询请求是并行、异步的,可以避免节点退出或故障导致的查询失败;
KAD简化了节点间为了了解彼此而必须发送的配置消息数量,并且在查找时自动交换配置信息;
KAD采用二叉树节点分为多个 KAD桶,简化查询结构。使用单向性异或算法(XOR)计算距离,保证对同一个 targetID所有查询都会收敛到同一条路径,以减轻节点间查询网络消耗,提升查询效率;
节点在记录其他节点是否可用时所采用的算法可以阻止一些常见的拒绝服务(Denial Of Service,DOS)攻击。以太坊 KAD与传统 KAD相比,收敛方式不同。传统的 KAD是以自身 selfID作为收敛目标,而以太坊不仅以自身 selfID为收敛目标,还通过随机生成的 targetID作为收敛目标,以生成较大范围的散列表

以太坊节点发现

  1. 种子节点

      a)硬编码种子节点。同比特币及其他 P2P软件一样,新节点使用硬编码的种子节点,接入以太坊 P2P网络。它由节点信息、网络地址URL和数据协议三部分构成。节点信息是 16进制转换过的128bit节点ID;网络地址 URL是分割符@后的 IP地址;数据协议是 TCP监听端口号(listening port)30303或者 UDP发现端口号(discovery port)30301。
    
      b)矿池种子节点。通过IP查询工具查询图 5中的地址,分别来自爱尔兰、美国、巴西、澳大利亚、新加坡以及德国。跨国通信的高延迟无法满足国内节点网络需求。为了更加便捷地接入网络,EthFans发起星火节点计划。EthFans鼓励国内对以太坊项目感兴趣的组织和个人分享其稳定运行节点地址信息,筛选其中优质节点,打包成 staticnodes.json文件后发布。以太坊用户下载后可以连接到更多国内节点,加快了以太坊国内的网络速度。类似的配置文件还有 trustednodes.json,该文件保存信任节点信息。这两个文件不限定内容,只限定文件名及格式,以固定文件名的形式硬编码保存在配置文件内,配置的节点会在以太坊启动时加载。
    

区块链P2P网络协议演进过程_第4张图片

2)地址数据库 类似比特币,以太坊也采用地址数据库的形式保存连接过的节点。以太坊采用的是 LevelDB作为历史文件格式,生成多个历史数据库文件。对于首次连接以太坊网络的节点,地址数据库是空的,后续随着地址广播,逐渐填满地址列表。对于再次连接以太坊的节点,启动时以太坊使用loadSeedNodes()方法将种子节点和历史数据一起读取,快速高效地连接以太坊 P2P网络

3)地址查询 以太坊 P2P网络最大的特点是可以进行地 址查询。以太坊的 KAD参数配置如图 7所示。

4)地址广播 由于有固定的 KAD表结构,每个节点根据自身 nodeID有唯一的固定位置,所以以太坊没有主动广播自身地址的方法。但是通过 doRefresh()方法的 lookup()方法搜寻与自身最近的 16个节点进行连接,接着随机生成 3个 targetID,利用 lookup()方法寻找节点。寻找后利用 ping pong方法进行双向的通信,对方节点会将连接的节点比较远近后保存至自身 KAD桶,同时把节点信息储存在地址数据库中,通过这种方式实现将自身节点地址告知其他节点的目标。

超级账本的 P2P网络及节点发现

随着比特币和以太坊的快速发展,区块链技术的应用范围不再局限于交易系统。对某些企业级问题,区块链也是完美的解决方案,如物流链、供应链等无中心系统下实现货物追踪、防窜改等问题。超级账本 Fabric应运而生,Fabric作为企业级区块链应用,各节点权限是不同的,交易处理必须经过超级节点才能完成。虽然 Fabric没有实现去中心化,却可以通过划分不同节点之间的工作负载实现优化网络效率。为了保证区块链网络的安全性、可信赖性及可测量性,Fabric采用 Gossip作为 P2P网络传播协议。Gossip支持超级节点网络架构,超级节点具有稳定的网络服务和计算处理能力,负责 Fabric的交易排序和新区块广播功能,维护 Fabric网络信息更新、节点列表管理等内容。

Gossip介绍

Gossip是基于传染病感染传播机制而形成的,被广泛用于分布式系统作为底层通信协议。Gossip并非新的P2P网络思想,同传统的洪泛、路由算法相比,Gossip提供了明确的网络通信类型。Facebook开发的 cassandra使用的就是 Gossip协议,是一种流行的分布式结构化数据存储方案。Gossip在Fabric网络上负责维护新节点的发现、循环检查节点、剔除离线节点、更新节点列表。Fabric通过与节点列表中的节点广播通信,发现新的区块或本地错误及丢失的区块,更新维护本地账本数据。Gossip协议有如下三种通信类型:

    a)Push,即主动信息推送。假设自身为节点 A,随机选择节点列表中的 N个节点作为目标节点。主动推送包含节点 A自身 ID的信息至 N个节点,N个节点接收后,对比自身数据、更新自身信息。N个节点也可以继续 push信息至其他节点。

    b)Pull,即主动拉取信息。假设自身为节点 A,随机选择节点列表中的 N个节点作为目标节点。节点 A将自身 ID和请求内容如节点列表、区块信息等封装成请求报文,主动发送给N个节点,N个节点收到请求后将相应信息返回给节点 A,节点 A对比本地数据后更新自身本地数据。

   c)Push/Pull,即混合模式。该模式虽然综合了 push与 pull的优点,但是网络资源消耗较大。假设自身为节点 A,pull取 N个节点信息后同节点 A本地数据比较,再将较新数据 push至N个节点,N个节点比较后更新自身数据。每个节点发送消息前都会通过自身节点的安全标志符PKI_ID和加密签名封装消息。恶意节点没有 Fabric证书颁发机构(CA)认证的密钥而无法冒充其他节点发送信息,保障通信安全性。Gossip启动流程的 Fabric源码

区块链P2P网络协议演进过程_第5张图片

Fabric节点发现

1)种子节点 Fabric采用的不是硬编码的形式,而是通过core.yaml配置文件进行配置的配置文件形式。以太坊采用Viper作为配置文件加载方案。Viper是国外计算机爱好者spf13(昵称)编写的开源配置解决方案,它不用关心文件格式,可以获取本地环境变量,也可以从远端获取配置文件,同时还有缓冲机制,可以在不重启服务的情况下动态加载新的配置项的值并使之实时生效。这对 Fabric网络至关重要,超级节点管理员可以在不影响系统运行、无须重启系统的情况下更新配置信息并使之生效。而比特币和以太坊由于去中心化,需要变更只能进行全部节点投票,一旦无法达成一致则造成分叉,如比特币分叉为比特币(BTC)和比特币现金(BCH),以太坊则分叉为以太坊(ETH)和以太坊经典(ETC)。种子节点的加载流程如下:
a)启动 Gossip服务 newGossipService()方法,在服务启动过程中调用 g.connect2BootstrapPeers()方法加载种子节点。
b)通过 g.BootstrapPeers()方法读取 core.yaml配置文件,获取 bootstrap超级节点的值,保存为 endpoint终端地址临时变量。
c)启动连接 g.disc.Connect方法将 endpoint作为参数传入。
d)使用 d.createMembershipRequest()方法生成请求信息,赋值给临时变量m并加密签名为请求信息 req。
e)将 endpoint和自身 PKIID组合,利用 god.sendUtilAcked()方法将 req信息发送至对应 endpoint。
f)获得 endpoint节点返回信息后更新地址库。

2)地址数据库 Fabirc采用超级节点的形式,都需要接入超级节点;而且使用场景是企业级应用,所以无须保存历史数据,因为保存数据、验证节点是否在线需要耗费大量资源。既然有超级节点的存在,只需要每次从超级节点取地址即可。超级节点也完成了地址数据库的工作,加载种子地址后,将获取节点列表保存至内存中,而非比特币和以太坊的文件形式。节点通过解析收到的消息来检查节点是否正常,进而维护节点列表,同时还定时与连接节点通信,一旦被连接节点超过配置时间没有响应,则将其移出节点列表,加入离线列表。

3)地址广播 Gossip通过启动 g.syncDiscovery()这一循环方法,定时 ss循环查找节点。通过在节点列表中随机选择N个节点,push索要节点列表信息并同步自身节点列表。core.yaml中默认配置 S为 4s,N为3个节点,可以根据需求进行更改。在 push的同时也将自身节点信息传递给其他节点,并通过广播传递至整个网络。

4)地址查询 Fabric没有业务场景需要精确查询某个 ID的地址,所以目前不支持地址查询。但是因为超级节点的存在,超级节点拥有所有已连接节点地址信息,可以通过扩展Fabric代码来增加功能的方式实现查找。

分析对比

每种 P2P网络结构拥有各自的优缺点,针对不同的区块链应用场景、不同的业务需求,P2P网络的使用也不同。区块链主要应用场景是代币交易系统。为了更直观地对比不同区块链系统 P2P网络结构,使用银行类中介系统替代中心化网络结构的产品。网络结构属于架构设计层次,与功能点不同,本文只描述不同区块链产品网络结构组成,不评分对比。区块链作为创新产品其主要特点是去中心化、匿名性、可信任及智能合约,这些是功能上的创新。本文通过分析区块链产品源代码的技术实现来分析比较其底层架构及技术特点,对应着从去中心化程度、隐私保护、安全性、应用的丰富程度四个维度进行分析评价,每个维度代表不同功能点,功能点属性具有相同的权重。P2P网络虽然不是区块链的创新内容,但其作为区块链底层技术支撑,网络质量决定着区块链产品的成败。本文从源代码技术角度分析,将 P2P网络作为区块链的一个功能点进行分析对比,通过从接入效率维度评价区块链 P2P网络优劣,从而合理假设五个评价维度皆为功能点属性,权重相同。

1)去中心化程度 P2P网络是区块链分布式的基石,自从比特币成功以来,区块链分布式去中心化概念深入人心。传统中心金融机构所有交易必须经中央系统处理,参与节点间无法直接通信,是完全的中心化。比特币和以太坊都是完全的去中心化,所有节点权限相同,虽然有种子节点的存在,但它们在架构上和普通节点没有区别,只是相对高性能、高稳定性的节点,在去中心化上两者表现相同。Fabric则相当于分布式的中心化系统,超级节点具有中心化服务器功能,同时超级节点也是分布式集群,具有分布式特征,所以 Fabric去中心化表现介于银行类系统和比特币以太坊之间。

2)节点接入网络效率 节点接入网络需要做两件事:

  a)需要发现节点接入区块链网络;

  b)需要同步区块账本数据等信息才能使用区块链服务。银行类中心系统所有维护工作都由中心系统负责,节点接入即可使用服务,所以节点可以快速接入/退出,接入效率最高。由于没有中心节点,账本保存在本地,比特币和以太坊都需要同步全部区块后才进行共识挖矿。但比特币节点地址管理无须构建维护 DHT,可以直接广播而不用进行查找,所以节点发现效率高于以太坊。Fabric有可以灵活配置的超级节点,所以接入效率高于比特币,但弱于有强大性能服务器的银行类金融系统。

3)安全性 常见的区块链攻击方式有两种:

  a)节点伪造,冒充其他节点进行交易;

  b)Dos攻击,攻击服务提供者使系统瘫痪。中心化金融系统除了采用多种加密方式外,还绑定个人信息,在交易过程中结合人脸识别、PIN密码、指纹及绑定个人信息的智能卡、与密码结合的双重保障等多种方式确保交易安全,强大的网络及服务器能力也使 Dos攻击变得非常困难。比特币与以太坊采用账户与节点分离的设计,不限制节点的加入与退出,使得节点伪造失去意义;所有节点通过共识机制提供服务,无中心系统,Dos只能攻击整个网络,而这样的代价是巨大的,迄今为止没有成功攻击比特币与以太网的 Dos的案例。Fabric采用 CA节点分配密钥以避免伪造节点,同时利用分布式超级节点抵抗攻击。Fabric在安全性上相对比特币、以太坊增加了节点管理,但认证要求弱于银行类系统,所以安全性介于两者之间。

4)隐私保护 身份信息隐私保护分为两个层面:基本层次是身份标志保护;高级层次是用户登录行为的不追踪性。由于区块链的去中心化特点,隐私问题在区块链中对应为基本层次节点 IP地址是否匿名、高级层次身份信息是否保密两个方面。节点 IP地址包含物理地理信息等,可以用做节点的身份标志,但存在一个物理节点多个用户使用的情况,而身份信息则可以精确定位用户,追踪用户行为。以太坊由于有 DHT保存节点 IP地址信息,有可能被针对性地攻击。账户方面同比特币一样,不包含身份信息以保护隐私。Fabric节点信息保存在中心服务器,虽然节点间采用随机连接的方式,但 IP地址、身份信息等内容全部暴露给超级节点,对于超级节点是公开的,对于普通节点是匿名的,所以匿名性介于中心系统与分布系统之间。对于银行类中心系统,身份信息是认证信息的一部分。身份证等信息对中心服务器是公开的,但节点间无法通信。银行类中心系统负责保护身份信息,一旦中心系统作恶,则有可能泄露隐私信息。比特币采用洪泛的方式广播,无法定位节点是信息最初发出节点还是转发节点;保护节点地址信息;账户采用匿名制,保护用户身份信息。

5)应用的丰富程度 P2P网络使得区块链系统内节点间可以相互通信,构成系统网络通信底层,在此基础上区块链上层延伸出了一系列应用。银行类系统虽然功能丰富,但因为是中心化系统,参与者无法发布智能合约、分布式扩展应用等,限制了应用的扩展。比特币由于不支持智能合约,主要功能依旧是交易系统,所以扩展应用最少。以太坊 DHT支持精确查找,可以精确定位节点或范围内节点地址来进行通信,如点对点通信、点对点文件传输等功能,在应用丰富程度上表现最佳。Fabric支持智能合约,可以像以太坊一样构建扩展应用,但由于没有 DHT,不支持精确地址点对点通信,应用扩展功能上弱于以太坊。

你可能感兴趣的:(区块链,源码,P2P协议,p2p,区块链)