以太坊之P2P

最近研究以太坊代码中的P2P通信,大概记录一下流程

以太坊使用的是Kad(Kademlia)协议,BT和电驴都曾使用的协议,关于Kad协议,可以参看介绍:

https://github.com/ZtesoftCS/go-ethereum-code-analysis/blob/master/references/Kademlia%E5%8D%8F%E8%AE%AE%E5%8E%9F%E7%90%86%E7%AE%80%E4%BB%8B.pdf

(如果要简要看下以太坊的代码也可以直接看上述github的内容,对每部分的代码有些简要介绍,可以做入门用)

我们带着问题来看以太坊的P2P的实现

单个节点如何连入以太坊网络的

如果单个节点运行以太坊程序,它是如何接入网络的呢,这是一个先有蛋还是先有鸡的问题。

所以需要有一些固定节点供大家接入,主网的节点是写在变量MainnetBootnodes中(跟比特币类似,比特币也配置了一些dns服务器用来获取其他比特币节点的ip地址),以太坊运行起来的时候先连接配置的这些节点,然后再从连接成功的节点继续获取更多的节点,最终建立自己的节点列表

K桶的概念

单个节点会保存若干个其他节点的信息

每个节点的ID是自己随机生成的512位的NodeId(每个节点的id都是这么来的,因为位数多,所以随机生成的基本不会重复),然后跟其他节点的NodeId异或的值(最高位为1的位数)算作节点间的距离,

然后不同距离建立一个list,称为一个K桶(K桶内节点是一个队列),所以最终根据距离的远近建立了若干个K桶

每个K桶有一定的数量限制(待读以太代码确认),当新加入一个节点并且所在K桶已经满的情况下,会先查询下最早加入的队头的节点是否还活跃,如果还活跃移到队尾同时丢弃新加入的节点(因为一个节点如果在线时间越长就意味着继续在线的概率更高),如果不活跃删除节点然后添加新的节点到队尾

节点的存储

以太坊的节点是存储在leveldb里的,存储的节点信息的是节点的NodeId,IP地址和UDP port num等



猜你喜欢

转载自blog.csdn.net/csds319/article/details/80354531