对等节点间通信
Geth 利用 UDP 毗连互换 P2P 网络的信息。有 4 种范例的 UDP 动静。一条 *ping* 动静请求一条 *pong* 动静作为返回。此对动静用来判定相邻节点是否可响应。一条 *findnode* 动静请求一条 *neighbors* 动静(个中包括 16 个已经被响应节点知晓的节点列表)作为返回。当成立好对等节点的毗连之后,Geth 节点通过加密和认证的 TCP 毗连来互换区块链信息。
此文旨在辅佐你领略 P2P 网络,并叙述一些的实现细节。P2P 技能操作终端设备的富厚资源,可以或许缓解中心化系统的短板,并且从九十年月开始,这项技能就已经被 eMule,bitTorrent 和 Skype 等知名软件所回收。P2P 技能也是可能以太坊系统的焦点组件(我们的项目 Shyft Network 就是从这些区块链中衍生出来的)。许多人都传闻过 P2P,可是不知道它到底是什么。那就让我们从相识什么是 P2P 网络开始吧。
以太坊的官方客户端节点软件 Geth,基于一种包围层维护机制 (称作 Kademlia 漫衍式哈希表)实现了对等节点发明协议(RLPx 节点发明协议)。固然 Kademlia 是为了在 P2P 网络中有效地定位和存储内容而设计的,以太坊的 P2P 网络只用它来发明新的对等节点。
参考:
S. Umamaheswari and Dr. V. Leela, (2011, Mar.01). P2P Overlay Maintenance Algorithm, [PDF file] Retrieved from: http://journals.sagepub.com/doi/pdf/10.1260/1748-3018.6.3.555Kademlia
数据布局
P2P 网络中的参加者向其他网络参加者提供部门资源。不需要中心化的协调者,每个对等节点都可孝敬计较周期(CPU),磁盘存储和网络带宽。传统的 客户端-处事器 模子中,处事器提供资源,客户端利用资源;与之相对的,在 P2P 网络中,对等节点既是网络资源的供给者,也是消费者。因此,P2P 网络可以很好地办理 客户端-处事器 模子下的一些短板,好比可扩展性和单点妨碍。
当某个客户端第一次启动时,它的 db 是空的,,只知道 6 个硬编码的引导节点。随后,当客户端开始发明对等节点,客户端依据上面描写的机制,将节点插手 db 和 table。 一般来说,P2P 网络会有一个门槛,节点的资源孝敬高于这个门槛才气插手网络。怀抱资源孝敬的尺度应该是公正的,好比说,要求网络中每个对等节点的平均孝敬应该在 P2P 系统总体平均值的统计范畴内等。资源孝敬应该是两边互惠的。支付孝敬后可获得的好处,吸引着用户插手 P2P 应用。
抱负环境下,所有的对等节点间都应该有一条路径相连。但因为每个节点对网络拓扑和其他对等节点只有一个不完整的视图,所以网络包围层需要中间节点将动静转发至正确目标。图的布局为每对节点提供了多条中间路径,因此就算对等节点改变,也可通过图的连通性提供网络的规复本领。对每个对等节点来说,图的连通性通过与其他对等节点的连接干系来反应。当对等节点插手可能分开网络,连接的对等节点大概会持有不正确的连接信息。因此利用网络包围层维护机制(Overlay maintenance mechanisms)生存更新的连接信息,使得所有节点间保持连通性。
什么是 P2P网络?Geth 客户端用两种数据布局存储其他节点的信息。第一种是称作 db 的恒久数据库,它存储在磁盘内,客户端重启之后数据也是耐久存在的。db 中包括客户端交互过的每个节点信息。db 的每笔记录包括节点 ID,IP 地点,TCP 端口,UDP 端口,(此客户端)最后一次向(记录中)节点发送 ping 的时间,最后一次从节点收到 pong 的时间,节点响应 findnode 动静的失败次数。假如最后一次从一个节点收到 pong 动静的时间高出了一天,此节点将会被移出 db。以太坊的 P2P 网络是如何事情的?
“Kademlia Peer Selection” by James Ray
第二种数据布局是称作 table 的短期数据库。当客户端重启时 table 是空的。table 包括 256 个桶,每个桶存储至多 16 笔记录。每笔记录存储其他以太坊节点的信息——节点的 ID,IP 地点, TCP 端口和 UDP 端口。假如记录中的某个节点对付 findnode 动静持续响应失败,多于 4 次时将被移出 table。
“RLPx Node Discovery Protocol” by Felix Lange, Gustav-Simmonsson, and Roman Mandeleil
点对点(P2P)网络是一种网络包围层(overlay network)——就是说,它是成立在果真互联网之上的。从数学的角度来说,P2P 网络可以被视作一个有向图 G = (V,E),个中 V 是网络中的对等节点荟萃,E 是对等节点所连成的边的荟萃(也即节点间毗连的荟萃)。每个对等节点 p 都有一个唯一无二的标识号 pid。荟萃 E 中的边(p,q)指 p 可通过直接相连的路径向 q 发送动静;也就是说,p 利用 q 的 pid 作为目标地点,在网络之上向 q 发送动静。尽量在底层的 TCP/IP 网络中,相似的 IP 地点可以转译为在地理位置上彼此靠近,但很少有这么明晰的直接关联。
假如你想查阅更多关于以太坊 P2P 网络的内容,可以拜见下面一些由以太坊社区成员孝敬的文章:“Peer to Peer” by Felix Lange
以太坊网络中,每个客户端节点都配备有一个 enode ID,之后将此 ID 用 SHA3 算法散列为一个 256 位的值。Kademlia 利用 XOR 操纵界说间隔,因此两个 256 位的数字之间的间隔是他们的按位异或值(bitwise exclusive OR)。每个对等节点都拥有一个包括 256 个差异的桶(buckets)的数据布局,每个桶 i 中存储与本节点间隔在 2i-1 到 2i 之间的 16 个节点。为了发明一个新的对等节点,以太坊节点选择本身作为方针 x,从桶中寻找到 16 个与方针 x 最近的节点,之后请求这 16 个节点,让它们从本身的桶中各找出 16 个与方针 x “更近” 的节点并返回,这样以来,会获得至多 16×16 个新发明的节点。之后请求这 16×16 个新发明的节点中离方针 x 最近的 16 个节点,让它们返回与 x 更近的 16 个节点。这个进程一连迭代,直到没有新节点被发明。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。