http://www.7klian.com

点对点网络组建:从 Kademlia 到 Discv5

其次,为了防止重放进攻,discv4 利用了时间戳。当某个主机的时钟产生错误时,这种方法会导致各类百般的问题。欲相识更多详情,请查阅 discv4 类型的 “Known Issues” 部门。
另外,一个节点向几多个对等节点上宣布告白,以及向哪些对等节点投放都是不清楚的。更多详情请查阅 devp2p#136 。
对值来说也是同样的进程。值跟节点之间的间隔是确定的,因为值和节点的标识符 ID 以沟通的方法组织,因此我们可以计较这个间隔。假如我想查找一个值,我只需要寻找离这个值的键最近的邻人节点,直到找到存储这个值的节点。
固然 discv5 办理了一些 discv4 中存在的问题,但尚有一些问题,discv5 仍没有办理,好比不行靠的终端验证。写这篇博文之时,discv5 还没有提出新的要领去晋升终端验证的处理惩罚进程。
    ——–
假定一个网络中,有 9 个键值对和 3 个节点,抱负环境下,每个节点只需要存储 3 个键值对(最好的方法是存储6个键值对,以提供冗余),意味着假如要更新某个键值对,只有部门网络节点需要更新。大抵想法是这样的,网络中的任何节点都可以基于信息在节点间漫衍的方法,知道要去那边寻找它所需要的特定键值对。
· STORE – 在一个节点上存储给定键的值。
Kademlia 利用 XOR(异或操纵符) 作为间隔函数。XOR 函数的特点在于,只有当输入差异时,输出才为 true。下面是用二进制标识符暗示的例子。
Discv5 中尚有许多小的改变,可是这些改变没那么重要,因此在这篇总结中就省略了。
上面的这个例子是说,十进制数字 153 和 50 之间的间隔是 171。
Kademlia
漫衍式哈希表(DHT)是一个漫衍式的键值列表。参加到 DHT 的节点可以很轻松地检索到某个键对应的值。
· PING – 用来检测一个节点是否还在运行。
假如你想知道关于 ENRs 的更多细节,请移步至我的另一篇博文 Network Addresses in Ethereum。
综上,,节点可以按照间隔函数来确定哪个节点离它更近,并基于这种 “间隔” 来做决定。
另外,discv4 添加了彼此的终端验证成果。这是为了确保提倡 FINDNODE 请求的节点正在参加同一个节点发明协议。
上文中一直都在说 DHT。那么 DHT 到底是什么呢?
最后,终端的互验证事情中也存在问题。因为信息有丢包的大概,所以没有步伐断定两个对等节点是否都已验证过对方。也就是说,我们大概自认为已经被验证过了,但跟我们通信的对等节点却并不这么认为;他们大概会因此扬弃我们的 FINDNODE 包。

假如你一直在研究可能相关的技能,你大概传闻过 discv4 或 discv5。但这些毕竟是什么呢?它们是如何事情的呢?它们出众的处地址那边呢?想要答复这些问题,我们需要从新开始梳理一下。这篇博文假定读者对这个规模较量生疏,因此没有技能配景的人也可以阅读。
早年间的 P2P 文件共享技能,好比 Napster,利用单个处事器共享信息,信息中记录谁拥有什么文件。某个节点向中心处事器提倡毗连并提交记录本身所拥有文件的列表。另一个节点之后向同一其中心处事器提倡毗连,寻找本身所需文件的存储节点,然后和找到的节点成立接洽。然而这是一个有缺陷的系统 —— 系统很容易蒙受进攻,并且中心化处事器节点大概会吃讼事。(译者注:单个处事器上存储文件内容和节点的对应干系,假如提供了一些受版权掩护内容的链接干系,那么这其中心化处事器的提供者将直接管到原版权方的法令追责)
最后,所有的 discv4 节点都应该维护最新的 ENR 记录。记录里包括一个节点的信息。任何节点都可以利用特定于 discv4 的包,叫做 ENRRequest,去请求 ENR 记录。
首先,凭据 discv4 今朝的事情方法,是无法区分节点间的次级协议的。也就是说,假如一个以太坊节点将以太坊 Classic 节点,Swarm 或 Whisper 节点插手它的 DHT,那么只有和这些节点产生多次通信之后,才气发明这些节点的无效性。这种无法区分次级协议的本领使得它很难找到特定的节点,好比支持轻客户端的以太坊节点。
因此,点对点网络亟需另一种办理方案。研究者们颠末数年研究和尝试,提出了漫衍式哈希表(DHT)。
· FINDVALUE – 和 FINDNODE 一样,区别在于,假如一个节点存储着特定的值,它将会直接将值返回。
假定我想要找到一个特定的节点。我要做的就是向我已知的节点发送请求,这些节点返回他们的记录中离我的方针节点更近的邻人节点。我反复此进程,直到某群邻人帮我找到方针节点。
1. 某个 ID 与它本身的间隔是 0。
3. 遵循三角不等式,假如 A,B,C 是三角形上的三点,那么 A 到 B 的间隔,小于或便是 A 到 C 的间隔加上 B 到 C 的间隔。
停止本文写作之时,这个次级协议区分方案中的写操纵依然存在一些问题。对一个节点来说,今朝没有有效的要领将告白宣布在多个对等节点上,因此需要向每个对等节点发送单独的请求,这对付大局限网络来说效率很低。
前文中,Kademlia 的查询要领描写了节点如何获得对等节点。节点向另一些节点提倡请求,获得离本身更近的节点。反复此请求进程,直到无法找到任何新的节点。
2001 年,研究者们为 DHT 提出了 4 种新的协议,别离是 Tapestry、Chord、CAN 以及 Pastr,这 4 个协议在焦点成果上各有取舍和改变,因此拥有差异的特性。
最后,终端的互验证事情中也存在问题。因为信息有丢包的大概,所以没有步伐断定两个对等节点是否都已验证过对方。也就是说,我们大概自认为已经被验证过了,但跟我们通信的对等节点却并不这么认为;他们大概会因此扬弃我们的 FINDNODE 包。
Discv5
然而,discv4 也引入了一些问题。让我们来看看个中的几个。
Kademlia 主要用于网络的组织,因此我们可以利用路由表定位其他节点。但 discv4 中完全不利用 DHT 中的值部门,因此我们可以丢弃 Kademlia 中利用的呼吁 FINDVALUE 和 STORE。
故事的初步:在 P2P(peer-to-peer) 网络中,节点的彼此发明及网络成型的进程谋面对一些问题。
    10101011
但愿这篇文章能辅佐你领略什么是发明协议以及发明协议是如何事情的。假如你对整个协议感乐趣,可以在 github 上查阅。

XOR 10011001
对配景做好铺垫之后,终于来到 discv4(暗示 discovery v4) 了,这是以太坊当前的节点发明协议。Discv4 协议自己是基于 Kademlia 的,但在某些部门做了窜改。譬喻,discv4 中不再利用 DHT 中的值部门。
开篇
Discv4
此刻我们知道 DHT 是什么了,那我们来看看 discv4 的前身 Kademlia。Kademlia 是 Petar Maymounkov 和 David Mazières 于 2002 年发现的 DHT 协议。我以为这个协议大概是最风行,并且利用最遍及的 DHT 协议。它的事情道理很简朴,让我们来看看吧。
对数间隔指:先计较出间隔,然后利用以 2 为底数的 log 函数,即 log2(A xor B)。
这是对 Kademlia 的一个很是简化的讲授,中间跳过了各类重要的细节。想要更全面的相识,力荐原论文可能更深条理的设计类型。
漫衍式哈希表
第一个改变是 FINDNODE 的事情方法。传统的 Kademlia 以及 discv5 都利用标识符。而在 discv5 中,我们利用对数间隔,也就是说,发送 FINDNODE 请求后,响应中包括的节点,都与发送方节点在特定的对数间隔内。
在 Kademlia 中,节点和值通过间隔来分列(其分列有严格数学化的界说)。这里的间隔不是地理位置上的间隔,而是基于标识符的暗示要领。通过利用一些间隔函数,可以计较出两个标识符之间的间隔。
· FINDNODE – 向给定 ID 返回所请求的最近节点。
最后,让我们来看一下 discv5。Discv5 是 discv4 的迭代版本,将作为 Eth 2.0 的节点发明协议。Discv5 旨在修复 discv4 中存在的诸多问题。
其次一个很重要的改变就是 discv5 一直致力于办理的,存在于 discv4 的最大问题:次级协议的区分。Discv5 添加了主题表(topic tables)。主题表是先进先出的列表,表中包括提供特定处事的节点。节点通过在对等节点中注册告白将本身添加进这个列表。
2. 间隔是对称的,A 到 B 的间隔和 B 到 A 的间隔沟通。
    00110010
Kademlia 节点存储着一个路由表。路由表中包括多个列表。每后一个列表所记实的节点都比前一个列表中的节点离得远一点。每个节点维护离本身最近节点的信息;另一个节点离得越远,当地节点生存的相关信息就越少。
为了让 Kademlia 节点支持这些成果,协议通过下面这些动静来通信。
正如你所见,discv5 的事情仍在举办中,今朝还需要降服一些很大的挑战。假如这个协议办理了这些问题,那么它将会是对原始 Kademlia 实现的一个庞大晋升。
利用 XOR 作为间隔函数有许多原因,包罗:

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

相关文章阅读