精华内容
下载资源
问答
  • 以太坊P2P模块节点发现算法剖析

    万次阅读 2017-09-26 15:54:43
    核心数据结构:NodeTable类负责以太坊的节点发现,NodeTable采用kademlia(KAD)算法进行节点发现 NodeTable维护一个网络节点列表,此列表为当前可用节点,供上层使用 由于NodeID经过sha3生成出的Hash为256位。列表...

    核心数据结构:

    NodeTable类负责以太坊的节点发现,NodeTable采用kademlia(KAD)算法进行节点发现

    • NodeTable维护一个网络节点列表,此列表为当前可用节点,供上层使用
    • 由于NodeID经过sha3生成出的Hash为256位。列表有256-1=255项,其中-1是因为刨除了当前节点(本机)
    • 列表的每一项位一个节点桶(NodeBucket),每个桶中最多放16个节点
    • 列表的第i项代表据当前节点(本机)距离为i+1的网络节点集合

    节点探索算法:

    其中节点间距离定义如下:

    • 节点NodeID(512位)会先用sha3算法生成一个256位hash。算两个节点的256位hash的XOR值,节点距离定义为此XOR值的1位最高位的位数。(例如:0010 0000 1000 0101 位XOR值的化 那么这两个节点的距离为14)
    • 此处的NodeID为网络节点公钥(512位)
    • 注意:这里的节点距离与机器的物理距离无关,这个距离仅仅是逻辑上的一种约定

    发现算法思路如下:

    这里写图片描述

    • 1.先随机一个目标节点的NodeID
    • 2.在列表中以相对NodeID的“距离”为指标,由近及远查找此待连节点“附近”的节点。并将这些节点放入“附近”节点集合
    • 3.向目标节点的“附近”节点集合中的每个节点发送FindNode消息
    • 4.若在目标节点的”附近”没有搜到节点,则返回步骤1
    • 5.否则等待600ms后跳转到步骤2

    节点的状态:

    这里写图片描述

    • Pending:
      • 挂起状态,每个新发现的节点或通过代码添加的节点的初始状态
      • 在新增节点时会向此节点发送Ping消息,已查看是否在线
    • Alive:此状态说明Pong消息已收到,此节点在线。
    • Evicted:由于对当前节点某个距离的桶最多只允许存在16个节点,若在此距离发现的新节点正好超过了限额,则新节点保留,桶中最老的节点会被唤出,进入此状态

    如何冷启动:

    由于初始化时节点列表为空,所以不可能找到目标节点的所谓附近节点。这就需要一些初始种子节点进行连接。在eth客户端启动时会添加5个种子节点,这些节点的NodeID、ip、端口被硬编码在Host.pocHosts函数中。
    这里写图片描述


    节点发现协议:

    • 协议:
      • FindNode:节点查询协议,向目标节点询问其临近节点列表
      • Neighbours:响应FindNode消息,当某节点接到其它节点发来的FindNode消息时,会回送Neighbours消息,其中携带了此节点的附近节点
      • PingNode:用来查看节点是否存活。对于缺失NodeID的节点,也可用来询问其NodeID
      • Pong:对PingNode消息的响应
    • 协议交互:
      这里写图片描述
      • 在上面的算法描述中,当前节点会向随机选定的节点的附近节点集合中每个节点发送FindNode消息,表示希望查这些节点的附近节点
      • 这些节点在接收到FindNode消息会需要向发送节点回送Neighbours消息,并在此消息内含有所在节点的附近节点集合
      • 当前节点在收到回送的Neighbours消息后,会将Neighbours中所携带的节点加入到自己的网络节点列表中,并对这些携带节点发送Ping消息
      • 等到Pong的消息到达,证明此节点存活,并加入到节点列表中
    展开全文
  • P2P网络及节点发现机制

    万次阅读 2019-04-13 08:35:11
    P2P网络及节点发现机制 1 分布式网络介绍 1.1 Kad网介绍 1.2 Kad网络节点距离 1.3 K桶 1.4 Kad通信协议 2 邻居节点 2.1 NodeTable类主要成员 2.2 邻居节点发现方法 2.3 邻居节点网络拓扑及刷新机制。 1 ...

    P2P网络及节点发现机制

    1 分布式网络介绍

    1.1 Kad网介绍

    1.2 Kad网络节点距离

    1.3 K桶

    1.4 Kad通信协议

    2 邻居节点

    2.1 NodeTable类主要成员

    2.2 邻居节点发现方法

    2.3 邻居节点网络拓扑及刷新机制。

    1 分布式网络介绍

    以太坊底层分布式网络即P2P网络,使用了经典的Kademlia网络,简称kad。

    1.1 Kad网介绍

    Kademlia在2002年由美国纽约大学的PetarP.Manmounkov和DavidMazieres提出,是一种分布式散列表(DHT)技术,以异或运算为距离度量基础,已经在BitTorrent、BitComet、Emule等软件中得到应用。

    1.2 Kad网络节点距离

    以太坊网络节点距离计算方法:

    • Node1:节点1 NodeId
    • Node2:节点2 NodeId

    1.3 K桶

    Kad的路由表是通过称为K桶的数据构造而成,K桶记录了节点NodeId,distance,endpoint,ip等信息。以太坊K桶按照与target节点距离进行排序,共256个K桶,每个K桶包含16个节点。

    图1.1

    1.4 Kad通信协议

    ​ 以太坊Kad网络中节点间通信基于UDP,主要由以下几个命令构成,若两个节点间PING-PONG握手通过,则认为相应节点在线。

    2 邻居节点

    2.1 NodeTable类主要成员

    C++版本以太坊源码中,NodeTable是以太坊 P2P网络的关键类,所有与邻居节点相关的数据和方法均由NodeTable类实现。

    2.2 邻居节点发现方法

    ​ 邻居节点是指加入到K桶,并通过PING-PONG握手的节点。

    图2.1

    邻居节点发现流程说明:

    • 系统第一次启动随机生成本机节点NodeId,记为LocalId,生成后将固定不变,本地节点记为local-eth。
    • 系统读取公共节点信息,ping-pong握手完成后,将其写入K桶。
    • 系统每隔7200ms刷新一次K桶。
    • 刷新K桶流程如下:
    • 随机生成目标节点Id,记为TargetId,从1开始记录发现次数和刷新时间。

    • 计算TargetId与LocalId的距离,记为Dlt

    • K桶中节点的NodeId记为KadId,计算KadId与TargetId的距离,记为Dkt

    • 找出K桶中Dlt大于Dkt的节点,记为k桶节点,向k桶节点发送FindNODE命令,FindNODE命令包含TargetId

    • K桶节点收到FindNODE命令后,同样执行b-d的过程,将从K桶中找到的节点使用Neighbours命令发回给本机节点。

    • 本机节点收到Neighbours后,将收到的节点写入到K桶中。

    • 若搜索次数不超过8次,刷新时间不超过600ms,则返回到b步骤循环执行。

    2.3 邻居节点网络拓扑及刷新机制。

    图2.2

    1 TargetId为随机生成的虚拟节点ID。

    2 以太坊Kad网络与传统Kad网络的区别:

    1) 以太坊节点在发现邻居节点的8次循环中,所查找的节点均在距离上向随机生成的TargetId收敛。

    2) 传统Kad网络发现节点时,在距离上向节点本身收敛。

    展开全文
  • 1、P2P网络节点发现流程 设定每次节点启动需要发现的节点数最小为N,最大值为M,节点ID为160位的二进制值。 根据Kademlia算法,假设启动的客户端(节点)为A,节点A的ID为“NodeIDA”,A启动后,发现其他节点的...

    1、P2P网络节点发现流程

    设定每次节点启动需要发现的节点数最小为N,最大值为M,节点ID为160位的二进制值。

    根据Kademlia算法,假设启动的客户端(节点)为A,节点A的ID为“NodeIDA”,A启动后,发现其他节点的流程如下:

    检测A的K桶下是否已经存在持久化的其他节点信息,如果存在,尝试能否ping-pong握手成功,如果可以,保留该节点。如果不可以,从K桶中删除该节点。如果此时节点A的K桶中没有节点,从种子节点列表中获取一个种子几点,将其节点ID写入K桶中。

    如果K桶中节点数量小于N,启动节点发现。

    节点A生成随机节点ID为“TargetNodeID”,该ID是一个160位的二进制值。

    节点A的K桶中存在节点B,ID为“NodeIDB”。

    记节点A与随机节点的距离DistanceTA= TargetNodeID ^ NodeIDA,^为异或运算符。

    记节点B与随机节点的距离DistanceTB= TargetNodeID ^ NodeIDB,^为异或运算符。

    如果DistanceTB<DistanceTA,说明节点B与随机几点的距离小于节点A与随机节点的距离。

    节点B执行FindNode,比较节点B与B的K桶中的节点与随机节点的距离,查找比节点B距离随机节点更近的节点,将找到的节点发送给节点A,节点A按照与随机节点的距离依次写入K桶。

    依次执行4-8的过程。

    搜索时间超过600ms,停止搜索。

    完成搜索后,使用距离随机节点最近的16个节点作为连接节点。

    使用这种方式发现的节点会呈现一种随机性,使各个节点之间连接呈松散性分布。

    2、代码实现

    1、创建K桶对象,以太坊K桶按照与target节点距离进行排序,共20个Bucket桶,每个Bucket桶包含N个节点。K桶的结构如下图:

    这里,K桶中Buckets数量为20。之所以这样设计是因为go语言包中sha1哈希算法生成的是长度为160位的二进制值,使用byte表示就是[20]byte,每个字节是8位二进制。

    这样我们在计算过程中,不必要每个进制进行比较,只需要按照每个byte进行比较即可。

    代码如下:

    //Kad桶,存储所有bucket桶
    type Kad struct{
    	mutex_n   *sync.Mutex 
    	mutex_a *sync.Mutex 
    	
    	nodes []*Node             //连接的节点
    	currendNode *Node         //当前节点
    	
    	Buckets [HashBits/8]*bucket //K桶
    	
    	asked   []NodeID//存储Ping通的Nodeid
    	
    	ticker *time.Ticker //定时器,用来定时刷新连接的节点
    	
    	closed chan struct{}
    	tc chan Node
    	sc chan Node
    }
    
    //bucket桶,存储不同距离的节点
    
    type bucket struct {
    
             entries      []*Node // 每个bucket中的节点
    
             location     int     //bucket桶在K桶中的位置
    
    }
    
    //节点对象
    type Node struct{
    	Addr string       //节点Url地址,包括ip和端口号
    	Nodeid NodeID     //节点编号
    	TargetID NodeID   //随机节点编号
    	AddedAt time.Time //节点发现时间
    	index uint8         //节点在K桶中的位置
    	distance uint8    //记录每个节点距离目标节点的距离
    }

     

    这样的话,基本的K桶结构已经完成设计,下面我们逐步实现节点查找功能。

    //创建K桶对象
    
    func NewKad()*Kad{
    
    	kad:=Kad{
    		mutex_n:new(sync.Mutex),
    		mutex_a:new(sync.Mutex),
    		nodes:findNodesFromDB(),//持久化数据库中读取已经连接好的节点
    		currendNode:NewNode(Addr), //根据当前IP信息生成本地节点
    		ticker:time.NewTicker(refreshInterval),//节点刷新,这里设置30分钟执行一次
    		closed:make(chan struct{}),
    		tc:make(chan Node),
    		sc:make(chan Node),
    	}
    	log.Println("create new kad...")	    
    
        go kad.checkNodes()
    
        go kad.loop()     
    
        return &kad        
    
    }

    如果该节点已经连接其他节点,为了防止重复读取,可以将已经连接的节点存入持久化数据中,方便下次使用。

    节点刷新是为了防止连接过程有其他节点断开,所以需要定时刷新,如果连接的节点不足,需要重新发现其他新的节点。

    K桶创建时会执行两个goruntime,checkNodes()用来检测当前可以正常连接的节点数量,如果数量不足,执行节点发现功能。

    Loop函数执行刷新及其他goruntime功能。

    展开全文
  • 基于重复博弈的P2P网络节点激励机制
  • P2P网络中,P2P节点需要从不同的节点类型获取数据 因此,节点维护者网络里不同节点类型的节点信息 节点的类型 节点的类型包括:候选节点、活 跃节点、传输节点、淘汰节点或/和僵死节点。 P2P网络中的每个节点可以...

    • 这里的节点,是指p2p客户端
    • 一个p2p 客户端就是一个节点
    • 节点可以根据自身的各种带宽、硬件能力信息等被tracker服务器收集为列表并下发各个节点,
    • 各个节点自身也需要维护节点列表到各个队列,动态的维护队列。
    • P2P网络中,P2P节点需要从不同的节点类型获取数据
    • 因此,节点维护者网络里不同节点类型的节点信息
    • 参考专利的开放 说明 建立P2P网络的方法、装置、终端设备及介质

    节点的类型

    • 节点的类型包括:候选节点、活 跃节点、传输节点、淘汰节点或/和僵死节点。
    • P2P网络中的每个节点可以维护或记录不同类型的节点,节点的类型包括:候选节点、活 跃节点、传输节点、淘汰节点或/和僵死节点。

    候选节点

    • 候选
    展开全文
  • go-ethereum之p2p节点发现原理解析,节省分析代码的时间,一目了然。
  • 网络游戏-P2P网络节点管理系统.zip
  • P2P网络中的节点发现

    千次阅读 2018-11-15 19:13:37
    P2P
  • P2P网络中的节点重要性评价在实际应用中有重要意义。现有的一些重要性评价指标如度、紧密度等存在度量结果较为片面等缺点,单一指标并不能有效地对P2P网络中的节点重要性进行度量。针对此问题,提出了一种基于多重属性...
  • 一种P2P系统节点聚类及信息检索算法.pdf
  • 比特币P2P网络之节点发现

    千次阅读 2020-05-31 01:58:35
    比特币P2P网络的节点发现有两种方式,这两种方式优先选第二种,在没得办法的情况下才使用第一种。 (1)使用DNS seed 比特币源码提供了DNS seed,可以查询到当前可用的一些比特币节点。 DNS节点通常由社区维护。而...
  • P2P节点缓存策略

    2013-12-03 09:44:00
    P2P节点缓存策略
  • p2p(peer to peer)负责以太坊节点间的通信,主要包括底层节点发现(discover)和上层协议运行两大块,本文主要描述其中节点发现部分的实现 数据结构 节点发现功能主要涉及 Server \ Table \ udp 这几个数据结构,...
  • 目前提出的P2P网络节点的博弈模型大多没有考虑节点的类型,没有考虑重复博弈所产生的和一次博弈不同的结果.针对这些问题,根据节点的推荐信任值来对节点进行分类,并分析节点类型的行为特征和重复博弈的特征,提出了一种...
  • NodeTable类负责以太坊的节点发现,NodeTable采用kademlia(KAD)算法进行节点发现 NodeTable维护一个网络节点列表,此列表为当前可用节点,供上层使用 由于NodeID经过sha3生成出的Hash为256位。列表有256-1=255...
  • p2p(peer to peer)负责以太坊底层节点间的通信,主要包括节点发现(discover)和协议运行两大块,本文主要描述其中节点发现部分的实现 数据结构 节点发现功能主要涉及 Server \ Table \ udp 这几个数据...
  • P2P节点 P2P节点项目
  • P2P网络节点间如何互访——详解STUN方式NAT穿透 转载请注明出处:https://www.jzgwind.com/?p=973 by joey 一、背景 P2P网络的核心原理,是将分布在网络上各个节点的资源都利用起来,本着我为人人、人人为我的...
  • 网络游戏-对P2P网络节点进行路由处理的方法和装置.zip
  • 本书用来描述以太坊网络发现的实现原理。很适合相关从事和学习以太坊技术的同学。
  • http://www.cnblogs.com/blockchain/p/7943962.html目录1 分布式网络介绍1.1 Kad网介绍1.2 Kad网络节点距离1.3 K桶1.4 Kad通信协议2 邻居节点2.1 NodeTable类主要成员2.2 邻居节点发现方法2.3 邻居节点网络拓扑...
  •   目录1 分布式网络介绍1.1 Kad网介绍1.2 Kad网络节点距离1.3 K桶 ...2.2 邻居节点发现方法 2.3 邻居节点网络拓扑及刷新机制。   1 分布式网络介绍     以太坊底层分布式网络即P2P网...
  • server启动的时候,除了监听本地的tcp端口之外,还启动了udp端口的监听,而且udp端口的监听与udp通信在节点发现的时候起着关键作用。 先看下为什么udp在节点发现中起着关键作用。 在 ...
  • 基于随机过程理论建立文件共享P2P网络模型,利用该模型系统地分析节点下载、合作、欺骗以及加入/退出等多种动态行为对文件规模及相关的平均负载率、下载成功率、平均下载次数等性能的影响。得出文件规模对下载率和...
  • 在目前的非结构化超级节点查找中,采用简单的泛洪或随机游走消息传递方式,效率不高,同时系统没有将非结构模糊查询和结构化数据定位方式有效地结合。提出一种基于分层象限空间的新型超级节点结构Quad,并在 Quad上...
  • 通过对P2P应用的长期研究,根据P2P节点自身的特点选取了其中典型的特征属性,井提出了一种基于决策树模型的P2P节点识别方法。由于该方法是统计分析传输层数据分组的特征,因此对于采用加密或非加密的P2P应用的网络...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,039
精华内容 12,015
关键字:

p2p如何发现节点