以太坊P2P中Kad算法解析

以太坊笔记综合

###源码目录结构:

accounts        	实现了一个高等级的以太坊账户管理
bmt			二进制的默克尔树的实现
build			主要是编译和构建的一些脚本和配置
cmd			命令行工具,又分了很多的命令行工具,下面一个一个介绍
	/abigen		Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages
	/bootnode	启动一个仅仅实现网络发现的节点
	/evm		以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境
	/faucet		
	/geth		以太坊命令行客户端,最重要的一个工具
	/p2psim		提供了一个工具来模拟http的API
	/puppeth	创建一个新的以太坊网络的向导
	/rlpdump 	提供了一个RLP数据的格式化输出
	/swarm		swarm网络的接入点
	/util		提供了一些公共的工具
	/wnode		这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。
common			提供了一些公共的工具类
compression		Package rle implements the run-length encoding used for Ethereum data.
consensus		提供了以太坊的一些共识算法,比如ethhash, clique(proof-of-authority)
console			console类
contracts	
core			以太坊的核心数据结构和算法(虚拟机,状态,区块链,布隆过滤器)
crypto			加密和hash算法,
eth			实现了以太坊的协议
ethclient		提供了以太坊的RPC客户端
ethdb			eth的数据库(包括实际使用的leveldb和供测试使用的内存数据库)
ethstats		提供网络状态的报告
event			处理实时的事件
les			实现了以太坊的轻量级协议子集
light			实现为以太坊轻量级客户端提供按需检索的功能
log			提供对人机都友好的日志信息
metrics			提供磁盘计数器
miner			提供以太坊的区块创建和挖矿
mobile			移动端使用的一些warpper
node			以太坊的多种类型的节点
p2p			以太坊p2p网络协议
rlp			以太坊序列化处理
rpc			远程方法调用
swarm			swarm网络处理
tests			测试
trie			以太坊重要的数据结构Package trie implements Merkle Patricia Tries.
whisper			提供了whisper节点的协议。

PS:

账户信息管理-哈希值32byte-地址20byte

RLP编码-通过反射取出不同类型的编码器解码器

LevelDB数据库-MPT数据结构{Trie-提高查找速度。Patricia Trie-节约存储空间。Merkle Tree-防止篡改}

geth-命令行工具-解释器Interpreter(将solidity转换为二进制)

P2P-NAT穿透-端口30303-Kad

RPC通信

P2P 四种不同的网络模型:

​ 1.集中式: 存在一个中心节点保存了其他所有节点的索引信息,索引信息一般包括节点 IP 地址、端口、节点资源等。

以太坊P2P中Kad算法解析_第1张图片

2.纯分布式: 移除了中心节点,在 P2P 节点之间建立随机网络,就是在一个新加入节点和 P2P 网络中的某个节点间随机建立连接通道,从而形成一个随机拓扑结构。

以太坊P2P中Kad算法解析_第2张图片

3.混合式: 混合式其实就是混合了集中式和分布式结构,网络中存在多个超级节点组成分布式网络,而每个超级节点则有多个普通节点与它组成局部的集中式网络。

以太坊P2P中Kad算法解析_第3张图片

4.结构化模型:比特币模型,以太坊模型,超级账本模型

比特币模型:

以太坊P2P中Kad算法解析_第4张图片

P2P-Kad算法

1.核心数据结构:

  • 由于NodeID经过sha3生成出的Hash为256位。(看源码)

  • 源码node-table列表中有256-1=255项,其中-1是因为刨除了当前节点(本机)

  • 列表的每一项位一个节点桶(NodeBucket),每个桶中最多放16个节点

  • 列表的第i项代表据当前节点(本机)距离为i+1的网络节点集合

  • 总而言之,Kad算法就是在以太坊p2p网络中怎么去找到自己想要的节点,不可能挨个节点去遍历。

  • 怎么节省空间,怎么节省资源,怎么查找速度快,这就利用到了Kad算法模型。

2.K桶

概念:

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

####1.设想以下情景:

​ 以0000110为基础节点,如果一个节点的ID,前面所有位数都与它相同,只有最后1位不同,这样的节点只有1个——0000111,与基础节点的异或值为0000001,即距离为1;对于0000110而言,这样的节点归为“k-bucket 1”;

​ 如果一个节点的ID,前面所有位数相同,从倒数第2位开始不同,这样的节点只有2个:0000101、0000100,与基础节点的异或值为0000011和0000010,即距离范围为3和2;对于0000110而言,这样的节点归为“k-bucket 2”

img

####2.如果将整个网络的节点梳理为一个按节点ID排列的二叉树,每个叶子便是一个节点。

img

3.节点间的距离–异或

1545756058871

查找距离:

img

4.Kad通信协议

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

​ PS:TCP用于数据传输,UDP用于节点发现

​ ####四种协议:基于UDP(看源码)

PING 探测一个节点,判断其是否在线
PONG PING命令响应
FIND-NODE 向节点查询某个与目标节点ID距离接近的节点
NEIGHBORS FIND_NODE命令响应,发送与目标节点ID距离接近的K桶中的节点

5.发现邻居节点

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

1.通过上诉四种协议查找邻居节点

img

看我画的:

以太坊P2P中Kad算法解析_第5张图片

跟新K桶的法则:

  • 通过距离d选择路由表中对应的K-桶,如果目标节点ID已经在K-桶中,则把对应项移到该K-桶的尾部

  • 如果目标节点ID不在K-桶中,则有两种情况:

    • 如果该K-桶存储的节点小于16个,则直接把目标节点插入到K-桶尾部;
    • 如果该K-桶存储节点大于等于16个,则选择K-桶中的头部节点进行PING操作,检测节点是否存活。如果头部节点没有响应,则移除该头部节点,并将目标节点插入到队列尾部;如果头部节点有响应,则把头部节点移到队列尾部,同时忽略目标节点。
    • 根据距离插入对应的K桶当中。

PS:以上查找循环K次, 这 里 k 是为平衡系统性能 和网络负载而设置的一个常数,但必须是偶数,以太坊取8.

PSS:查找目标节点和发现邻居节点类似

你可能感兴趣的:(以太坊源码解析笔记)