描述

本文章主上下两篇

  • 上篇:讲述以太坊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 层的代码

The Ethereum devp2p and discv4 protocol Part II的更多相关文章

  1. The Ethereum devp2p and discv4 protocol Part I

    描述 本文章分上下两篇 上篇:讲述以太坊devp2p与disc4节点发现协议 下篇:实践篇,实现如何获取以太坊所有节点信息(ip,port,nodeId,client,type,os) 正文 devp ...

  2. RChain节点通信机制(上)

    在介绍RChain的通信机制之前,先简单介绍一些以太坊的通信机制,它包括以下几个方面,如下详细了解以太坊的通信机制,可以查看https://github.com/ethereum/devp2p/blo ...

  3. 死磕以太坊源码分析之rlpx协议

    死磕以太坊源码分析之rlpx协议 本文主要参考自eth官方文档:rlpx协议 符号 X || Y:表示X和Y的串联 X ^ Y: X和Y按位异或 X[:N]:X的前N个字节 [X, Y, Z, ... ...

  4. RFC-TCP

    RFC: 793 TRANSMISSION CONTROL PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION September 1981 ...

  5. OBD Experts OBD II Software OBD II Protocol Stack

    http://www.obdexperts.co.uk/stack.html OBD II Software OBD Experts can provide you with ready to use ...

  6. ethereum/EIPs-1

    https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1.md 介绍了什么是EIP等等的详细信息: eip title status type a ...

  7. The MESI Protocol

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION To provide cache cons ...

  8. Multiplexing SDIO Devices Using MAX II or CoolRunner-II CPLD

    XAPP906 Supporting Multiple SD Devices with CoolRunner-II CPLDs There has been an increasing demand ...

  9. Link Management Protocol (LMP)

    1.1. Link Management Protocol (LMP)   1.1.1.   Introduction and Theory The Link Manager (LM) transla ...

随机推荐

  1. 64位ubuntu安装交叉编译工具链,显示找不到命令

    是因为Ubuntu64位版本已不支持ia32-libs的软件包,而是使用了lib32ncurses5.lib32z1软件包做为替代, 所以在Ubuntu16.04版本当中应该安装执行: sudo ap ...

  2. Smart Indenter for VBE(64bits smart indent addin for VBA Editor),VBA开发必备的智能排版工具。

    原始出处:www.cnblogs.com/Charltsing/p/SmartIndenter64.html 作者QQ: 564955427 最近更换电脑,改用64位office做开发.VBA代码美化 ...

  3. 菜鸟学IT之四则运算升级版

     菜鸟学IT之四则运算升级版 本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 团队代码github远程仓库的 ...

  4. python3.4中自定义数组类(即重写数组类)

    '''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...

  5. echarts实时数据图表

    import React, { PureComponent } from 'react'; import ReactEcharts from 'echarts-for-react'; import m ...

  6. Vue.js 2.x笔记:安装与起步(1)

    1. 环境准备 Vue是一套用于构建用户界面的渐进式框架,设计为可以自底向上逐层应用.Vue 的核心库只关注视图层. 安装Node.js,下载:https://nodejs.org/ 查看安装: $ ...

  7. mac 开发环境安装

    0: 安装brew : mac终端输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ ...

  8. Jetson TX1 SD card启动

    上网DNS /var/run/NetworkManager/resolv.conf nameserver 211.100.225.34 nameserver 219.239.26.42

  9. Mint-UI组件 MessageBox为prompt 添加判断条件

    Mint-UI 的Message Box 是prompt类型时,可以添加正则判断或者function判断条件.具体可以查看Mint-UI源码. 添加正则判断条件: MessageBox({ $type ...

  10. Hadoop系列(三):hadoop基本测试

    下面是对hadoop的一些基本测试示例 Hadoop自带测试类简单使用 这个测试类名叫做 hadoop-mapreduce-client-jobclient.jar,位置在 hadoop/share/ ...