The Ethereum devp2p and discv4 protocol Part II

描述

本文章主上下两篇

  • 上篇:讲述以太坊devp2p与disc4节点发现协议
  • 下篇:实践篇,实现如何获取以太坊所有节点信息(ip,port,nodeId,client)

正文

本片为下篇:实践篇,主要描述如何获取以太坊所有节点信息(ip、port、nodeId、clientId)

因为以太坊创世块发展到如今,中间也有过很多次的迭代,所以通讯多少也有改变,这里不做一一说明,就以目前V62 V63 版本来做就可以了

根据上篇的理论知识,我们先理一下思路,如何去获取;

  1. 列出一组已备的节点ip地址,便于更好的快速的获取节点
  2. 定义基本数据结构,如 DHT、P2P Message(这里主要用到HelloMessage)、 disc v4 Message(ping、pong、findNode、Neighbors)、定义枚举做返回码与发送码
  3. 定义kademlia 结构,节点实体
  4. 按协议规定编写RLP、rlpx、Eckey 编码(此处参考以太坊源码),为后续协议之间通讯做编解码
  5. 遍历节点,
    • 利用disc v4 协议进行ping
    • 等待pong
    • find_Node 发出节点请求
    • Neighbors 获取节点信息nodes = [[ip, udp-port, tcp-port, node-id], ... ] 此处只能拿到ip、port、nodeId,clientId还未有
    • 将node 放入到nodetable 做缓存,nodetable存在阀值,当nodetable到达阀值则清除部分内容,保留部分(作用为去重复,提高效率,后期考虑效率可以尝试使用分布式获取节点信息,共享同一个nodetable缓存来提供效率)
    • 利用ip port nodeId,利用devp2p 协议与对方进行握手认证,并发送HelloMessage ,获取如下信息
    p2pVersion Specifies the implemented version of the P2P protocol. Now must be 1.
    clientId Specifies the client software identity, as a human-readable string (e.g. "Ethereum(++)/1.0.0").
    cap Specifies a peer capability name as an ASCII string, e.g. "eth" for the eth subprotocol. capVersion Specifies a peer capability version as a positive integer. listenPort specifies the port that the client is listening on (on the interface that the present connection traverses). If 0 it indicates the client is not listening. nodeId is the unique identity of the node and specifies a 512-bit secp256k1 public key that identifies this node. 

因为这也是小编工作的内容,所以代码不方便开源,建议去看以太坊源码的net 层的代码

转载于:https://www.cnblogs.com/chenshouchang/p/10386094.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值