以太坊节点发现协议 (2)

凡含有expiration字段的数据包都是用于防止数据重放的。因为是绝对时间戳,节点时钟必要要十分准确以正确验证时戳的有效性。自从2016年协议发布后起,已经接收到无数的因为用户的时钟不准确造成的错误报告。

端点验证是不严密是因为FindNode的发送方永远法确定接收端十分接收到足够的pong。Geth按如下方式处理:如果在最近12小时内未与收件人进行通信,请通过发送ping启动该过程。等待来自另一方的ping,回复它然后发送FindNode。

第二部分——节点发现协议代码实现流程 流程图

在这里插入图片描述

节点如何加入到对应的K桶

计算节点之间的距离很简单,直接按位异或后的值即为两节点之间的距离值,但节点应该加入那个K桶呢?可以公钥哈希值按位异或后最高位的值(例如: 异或值0000 ... 0000 0101,则桶距离为3 ),则将节点放入第3个桶中。

为什么?

主要是要理解二叉树的拆分过程:
对每一个节点,都可以按照自己的视角对整个二叉树进行拆分。拆分的规则是:先从根节点开始,把不包含自己的那个子树拆分出来;然后在剩下的子树再拆分不包含自己的下一层子树;以此类推,直到最后只剩下自己。

拆分的最后一个K桶(距离自己最近的那个K桶),只有最后1位不同,异或值为0000 ... 0000 0001,最高位为1,第一个K桶;拆分的倒数第二个K桶,异或值为0000 ... 0000 001x,最高位为2,第二个K桶;依此类推......

在具体实现细节上,以太坊节点节点公钥是512位,计算距离时的ID是取节点公钥的哈希,值为256位。所以节点路由表由256个K桶组成,每个K桶最多16个节点。

参考文档:
Node Discovery Protocol v4

Kademlia——A Peer-to-peer Information System Based on the XOR Metric

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspxjp.html