RChain节点通讯机制

在介绍RChain的通讯机制以前,先简单介绍一些以太坊的通讯机制,RChain是借鉴的以太坊的通讯机制,它包括如下几个方面,以下详细了解以太坊的通讯机制,能够查看https://github.com/ethereum/devp2p/blob/master/rlpx.mdjava

一、Nodes

每一个节点用一组信息来表明它所知道的其余节点,这些信息包括每一个节点的连接信息以及表结构(好比链接这个节点的平均延迟)。每一个节点是经过它的加密公钥来识别的,Kademlia的距离度量用的是256位散列(sha3/Keccak-25)的公钥。git

二、Distance Metric

假设有N0和N1两个节点,节点的keys用K0和K1来标识,N0N1的距离是K0和K1的公共前缀的长度,它能够经过简单的查找K0 ^ K1操做的第一个bit(^是一个bit的XOR操做)。由于key是随机指定的,和地理无关,所以一个中国的节点,最近的一个邻居节点是古巴的。github

三、Node Table

对于一个特定的节点N,它的对等节点是保存在一个表T当中。下图的表中有256行数据,每一条记录是N在上述的XOR操做的度量距离。表的最大记录数是由一个全局的参数副本数k来定义的。在节点的新增和剔除当中有一些灵活的策略来保证副本数。安全

在N的整个生命周期当中,这个表T是会被修改。例如咱们喜欢基于延迟的路由,咱们会在表里面慢慢积累这种信息。表T还能够存储除了表路由以外的数据,好比说信誉数据。网络

四、Routing

Kademlia是为寻找明确的节点开发的(或者是持有特定的数据的节点),可是在以太坊里面不是这样的。但这是一个RChain能够无偿使用的有效想法。它的基于通道的网络须要那些被挑选出来的我的节点。app

Kademlia协议的查询部分能够保证N有一个很是良好的大量节点的全局视图,它能够确保咱们能够在log2 n的时间内把特定的节点找出来,n是key的比特长度。区块链

为了减小节点的跳数,表能够划分红一堆长度为b比特的chunk,因此每一行表明在B位第i组的差别(而不是在每一个单位连续的不一样)。编码

RLPx协议指定b=8,可是Go, Java, and Rust的以太坊客户能够设置b=1。客户单和服务端使用不一样的b值是没有问题的。 加密

五、Discovery Protocol

RLPx协议遵循了Kademlia协议密切发现和维护已知节点列表的特色,可是Kademlia并不包括安全通讯。RLPx在这点上作了加强,它在第一次链接的时候增长了一个二阶段握手协议。经过公钥来交换,而且全部的通讯都是加密的。 spa

六、Bootstrapping

在大多数的P2P系统当中,至少要有一个节点H是已知的,咱们的节点N先和节点H握手(尝试把本身添加到H的表T中),若是N像H查询本身的公钥,H将会给N返回离它最近的节点。而后N就能够查询那些新添加的节点的表去发现新的节点,来获取整个网络的全貌。

七、Maintaining Peers

对等列表T每一次收到远程节点的消息的时候都有可能更新,这能够经过周期性的PING/PONG来强制触发。一般,维护对等列表的策略利用了文件共享统计数据的观察结果,那些暂时保持活动的节点将保持更长的活动时间,所以保留响应的节点一般比替换它们要好。

RLPx并不试图规定节点应该做为直接链接节点维护区块链的工做。这些一般是较少的,他们是根据测得的延迟或其余特性选出来的。

八、总结

使用RLPx协议的Ethereumj(以太坊java客户端),是一个网络创建的最直接的途径。RLP编码方案能够用Protocol Buffer代替,网络维护协议的其他部分会变得更简单。拿过来,而后进行二次开发。Kademlia的子集、RLPx、握手协议,提供全部须要的rchain网络机制。若是直接通讯节点是从发现的节点列表中选择,在P2P层均可以屏蔽从rchain节点代码内部,没有进一步的认证必要的机器。 

 

 

岑玉海

转载请注明出处,谢谢!

相关文章
相关标签/搜索