点对点网络是区块链中核心的技术之一,主要关注的方面是为区块链提供一个稳定的网络结构,用于广播未被打包的交易(交易池中的交易)以及共识过的区块,部分共识算法也需要点对点的网络支撑(如PBFT),另外一个辅助功能,如以太坊的消息网络,也需要点对点网络的支持。

分类

P2P网络分为结构化和非结构化网络两类。结构化网络采用类似DHT算法来构建网络结构;非结构化网络是一种扁平的网络,每个节点都有一些邻居节点的地址。

点对点网络职责

点对点网络的主要职责有维护网络结构和发送信息这两个方面。网络结构要关注的是新节点的加入和网络更新这两个方面,而发送信息包括广播和单播两个方面

网络结构

如何建立并维护点对点的整个网络?节点如何加入、退出?
网络结构的建立有两个核心的参数,一个是每个节点向外连接的节点数,第二个是最大转发数。

新节点

新节点对于整个网络一无所知,要么通过一个中心的服务获取网络中的一些节点去连接,要么去连接网络中的“种子”节点。

网络更新

网络更新处理当有新节点加入或者节点退出,甚至原来一些节点网络不好,无法连接,过一段时间又活了,等等这些情况。一般通过节点已有的连接来广播这些路由表的变化。需要注意的是,因为点对点网络的特殊性,每个节点的路由表是不一样的(也叫partial view)

消息收发

广播

广播一般采用泛洪协议,即收到转发方式,使的消息在网络中扩散,一般要采用一些限制条件,比如一条消息要设置最大的转发数,避免网络的过渡负载。

单播

单播需要结构化网络结构支持,一般是DHT,类似于DNS解析的方式,逐跳寻找目标节点地址,之后进行传输,并且更新本地路由表。

DHT-分布式hash表

要想快速检索信息,有两种数据结构可以使用,一种是树类型,如AVL树、红黑树、B树等;另外一类是hash表。
哈希表的效率比树更高,但是需要占用更多的内存。
信息的表示采用键值对的方式,即一个键对应一个值,我们要查找的是key,值是附着的信息。
哈希表要解决的问题是如何均匀地为每一个key分配一个存储位置。
这里面有两个重点:1.是为key分配一个存储地点,这个分配算法是固定的,保证存储的时候和查找的时候使用同一个算法,不然存进去之后会找不到;2.是均匀地分配,不能有点地方存放数据多,有点放存放数据少。

本地hash表

一般语言里面的hashtable、map等结构使用这个技术来实现,哈希函数可以直接使用取模函数,key%n,这种方式,n代表有多少个地方,key是整数,如果key是其他类型,需要先进行一次哈希,将key转为整数。这种方式可以解决上面的两个需求,但是当n不够大的时候(小于要存储的数据),会产生冲突,一个地方一定会有两个key要存储,这时候,需要在这个地方放一个链表,将分配到同一地点、不同key,顺序摆放。当一个地点放的key太多后,链表的查找速度太慢,要转化为树类型结构(红黑树或者AVL树)。

分布式哈希表

上面说过,哈希表效率很高,但是占用内容,使用多台机器就可以解决这个限制。在分布式环境中,可以将上述的地点理解为计算机(后面成为节点),即如何将一个key映射到一个节点上,每个节点有一个节点ID,即key->node id的映射,这个映射算法也要固定。
这个算法还有一个非常重要的要求,即scalebility,当新节点加入和退出时候,需要迁移的key要尽量少。

这个映射算法有两种典型结构,一个是环形,一个是树形;环形的叫一致性哈希算法,树形的典型叫kademlia算法。

选点算法

选点算法就是解决key->node id的映射算法,形象的来说就是为一个key选择它生命中的她(节点)。

一致性哈希(chod)

假设我们使用32哈希,那么总共能容纳的key的数据量是2**32,称之为hash空间,把节点的ID映射成整数,key也映射成整数。把key哈希和节点哈希值接的差值的叫做距离(负数的话要取模,不用绝对值),比如一个key的哈希是100(整数表示),一个节点的哈希是105,则这两个的距离是105-100=5。当然使用其他距离表示也可以,比如反过来减,但是算法要固定。我们把key映射(放到)距离他最近的节点上。距离取模的话,看起来就是把节点和key放到一个环上,key归属到从顺时针角度离它最近的节点上。

kademlia

kademlia算法的距离采用的是key哈希与节点哈希异或计算之后的数值来表示(整数),从左往右,拥有越多的“相同前缀”,则距离越近,越在左边位置不一样,距离越远。
树结构的体现是,将节点和key看成树的节点,这个算法支持的位数是160bit,即20个8字节,树的高度为160,每个边表示一位。
选点的算法和一致性哈希相同,从所有节点中,选择一个距离key距离最小的节点作为这个key的归宿。

路由算法

由于是在分布式环境中,为了保证高可用,我们假设没有一个中心的路由表,没有这个可以看到全貌的路由表,带来了一些挑战,比如如何发现节点、查找节点?
在P2P网络中,常用的方法是每个节点维护一个部分路由表,即只包含部分节点的路由信息。在泛洪算法中,这些节点上随机的;在DHT算法中,这个路由表是有结构的,维护的节点也是有选择性的。那么如何合理的选择需要维护路由信息的节点呢?

一致性哈希(chod)

一个朴素的做法是,每一个节点保存比他大的节点的信息,这样可以组成一个环,但是这样做的话,有一个大问题和一个小问题。大问题是,每个节点知道的信息太少(只有下一个节点的哈希和地址),当给出一个key时,它不知道网络中还有没有比它距离这个key距离还短的节点,所以它首先判断key是否属于自己和下一个节点,如果是,那么这个key就属于下一个节点,如果不是就调用下一个节点同样的方法,这个复杂度是N(节点数)。一个优化的方法是,每个节点i维护的其他节点有:i+21, i+22,…i+2**31,通过观察这个数据,发现由近到远,节点越来越稀疏。这样可以把复杂度降低到lgN

kademlia

每个节点保存的其他节点的信息,包括,从左到右,每一位上与本节点不同的节点,最多选择k个(算法的超参数)。比如在节点00110上(为演示起见,选择5位),在要保存的节点路由信息是:
1****: xxx,…,xxx(k个)
01***: xxx,…,xxx(k个)
000**: xxx,…,xxx(k个)
0010*: xxx,…,xxx(k个)
00111: xxx,…,xxx(k个)
以上为一行称为k-bucket。形象的来看,也是距离自己越近,节点越密集,越远,节点越稀疏。这个路由查找、节点查找的算法也是lgN复杂度。

区块链核心技术-P2P网络相关推荐

  1. 【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系

    目录 一.简介 二.知识点 P2P 网络 区块链节点与 P2P 的关系 区块链节点功能分类 P2P 网络特征 三.什么是 P2P 网络,区块链式使用 P2P 网络做什么 1.P2P 网络概念 2.P2 ...

  2. BTA 2018 区块链核心技术专场:12 位专家全方位剖析区块链核心技术原理与业务实践

    2018 年 3 月 31 日,由 CSDN.火星财经主办,中关村区块链产业联盟.柏链道捷.区块链大本营.TokenSky 联合主办的 2018 区块链技术及应用峰会(BTA)<2018 区块链 ...

  3. 《迅雷链精品课》第二课:区块链核心技术框架

    上一节课我们明白了什么是区块链,了解了区块链的关键特性和技术等内容,这节课我们将深入了解区块链的技术架构,系统学习区块链平台的6个层次:数据层.网络层.共识层.合约层.应用层.接口层,另外通常还有客户 ...

  4. 区块链核心技术:技术准备_区块链:我们还没有准备好进行的革命

    区块链核心技术:技术准备 by Haseeb Qureshi 由Haseeb Qureshi 区块链:我们还没有准备好进行的革命 (Blockchain: the revolution we're n ...

  5. 第一届区块链技术及应用峰会“区块链核心技术”分论坛预告大放送

    技术苍穹,迭代未休,区块链技术乘破竹之势而来,已然问鼎2018年技术圈开年"关键词Top榜".当爆炸式的知识需求,遇上业内资源捉襟见肘的困窘现状,区块链技术及应用峰会(BTA)·中 ...

  6. 区块链核心技术演进之路-算法演进

    大多惊讶于这套系统的简洁和完美,甚至有人断言此物一出,开天辟地.如今近乎8年过去,当年看起来近乎完美的系统理念,在各个方面都有长足探索和发展.接下来我将写一系列文章,回顾区块链核心技术演进之路.包括算 ...

  7. 基于区块链的p2p平台治理方案

    近期p2p平台爆得让人心惊胆战,但其作为银行之外企业/个人融资的有益补充,作为普通小白们不错的理财方案,这个行业还是非常有其存在价值的.但这个看上去风险重重的行业,该如何规范,才能让它健康发展呢?我想 ...

  8. 趣链科技获数亿元C轮融资,晋升区块链核心技术独角兽

    近日,区块链明星企业趣链科技官方宣布完成数亿元C轮融资,本轮融资由知名基金易方达资本领投.龚虹嘉带领的银宏基金跟投.相关报道显示,趣链科技这笔融资是今年以来国内区块链企业融资额最高的一起,公司整体估值 ...

  9. 用Go语言建立一个简单的区块链part7:网络

    Part 7: 网络 目录 引言 区块链网络 节点角色 网络简化 实现 场景 版本 getblocks inv getdata block 和 tx 结果 NODE 3000 NODE 3001 NO ...

  10. 用 Go 构建一个区块链 -- Part 7: 网络

    翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了.如果想直接运行代码,也可以 clone GitHub ...

最新文章

  1. hdu 3068 最长回文(manacheramp;最长回文子串)
  2. 千金买宝刀 | 斜穿交叉路口对应的新颖的赛道
  3. 【调查】您对计算机培训感兴趣吗?
  4. Android Studio系列教程二:基本设置与运行
  5. docker操作运行一步一步来
  6. Angular应用内路由(In App Route)的最佳实践
  7. LeetCode 1295. 统计位数为偶数的数字
  8. lua 差值 日期_lua时间戳和日期转换及踩坑
  9. A Deep Learning Tutorial: From Perceptrons to Deep Networks
  10. 关于php开发中用户请求数据的安全问题的一点想法
  11. 企业局域网管理软件_WorkWin局域网管理软件 企业必备监控神器
  12. 家庭电信网弄外网唤醒并远程内网电脑
  13. 中国医疗废物处理行业竞争格局与发展决策建议报告2022-2027年
  14. 浅析数据仓库和建模理论
  15. 分布式IO模块ET 200SP基座单元( BaseUnit)使用方法
  16. 程序启动,遇到Process finished with exit code 1 解决方法
  17. 个人计算机也可称为,个人计算机简称为PC机,这种计算机属于什么?
  18. vue的hook(钩子函数)
  19. UltraEdit常见问题及解决教程
  20. 20100919星期天最折磨人的一天。

热门文章

  1. Macbook的双系统win10开启虚拟化
  2. 查看虚拟机ip地址的方法
  3. 数学建模系列-预测模型(五)---马尔可夫链
  4. 基于ROS的仿人机器人运动规划与实现
  5. python实现商品进销存管理系统
  6. 在VB语言中,DOEVENTS的具体的用法和含义
  7. win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib
  8. eyoucms使用入门 一
  9. mysql pxc缺点_MYSQL高可用之PXC
  10. 第三方支付系统简易版支付系统部署