The Ethereum devp2p and discv4 protocol Part II
描述
本文章主上下两篇
- 上篇:讲述以太坊devp2p与disc4节点发现协议
- 下篇:实践篇,实现如何获取以太坊所有节点信息(ip,port,nodeId,client)
正文
本片为下篇:实践篇,主要描述如何获取以太坊所有节点信息(ip、port、nodeId、clientId)
因为以太坊创世块发展到如今,中间也有过很多次的迭代,所以通讯多少也有改变,这里不做一一说明,就以目前V62 V63 版本来做就可以了
根据上篇的理论知识,我们先理一下思路,如何去获取;
- 列出一组已备的节点ip地址,便于更好的快速的获取节点
- 定义基本数据结构,如 DHT、P2P Message(这里主要用到HelloMessage)、 disc v4 Message(ping、pong、findNode、Neighbors)、定义枚举做返回码与发送码
- 定义kademlia 结构,节点实体
- 按协议规定编写RLP、rlpx、Eckey 编码(此处参考以太坊源码),为后续协议之间通讯做编解码
- 遍历节点,
- 利用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的更多相关文章
- The Ethereum devp2p and discv4 protocol Part I
描述 本文章分上下两篇 上篇:讲述以太坊devp2p与disc4节点发现协议 下篇:实践篇,实现如何获取以太坊所有节点信息(ip,port,nodeId,client,type,os) 正文 devp ...
- RChain节点通信机制(上)
在介绍RChain的通信机制之前,先简单介绍一些以太坊的通信机制,它包括以下几个方面,如下详细了解以太坊的通信机制,可以查看https://github.com/ethereum/devp2p/blo ...
- 死磕以太坊源码分析之rlpx协议
死磕以太坊源码分析之rlpx协议 本文主要参考自eth官方文档:rlpx协议 符号 X || Y:表示X和Y的串联 X ^ Y: X和Y按位异或 X[:N]:X的前N个字节 [X, Y, Z, ... ...
- RFC-TCP
RFC: 793 TRANSMISSION CONTROL PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION September 1981 ...
- 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 ...
- ethereum/EIPs-1
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1.md 介绍了什么是EIP等等的详细信息: eip title status type a ...
- The MESI Protocol
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION To provide cache cons ...
- 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 ...
- Link Management Protocol (LMP)
1.1. Link Management Protocol (LMP) 1.1.1. Introduction and Theory The Link Manager (LM) transla ...
随机推荐
- 64位ubuntu安装交叉编译工具链,显示找不到命令
是因为Ubuntu64位版本已不支持ia32-libs的软件包,而是使用了lib32ncurses5.lib32z1软件包做为替代, 所以在Ubuntu16.04版本当中应该安装执行: sudo ap ...
- Smart Indenter for VBE(64bits smart indent addin for VBA Editor),VBA开发必备的智能排版工具。
原始出处:www.cnblogs.com/Charltsing/p/SmartIndenter64.html 作者QQ: 564955427 最近更换电脑,改用64位office做开发.VBA代码美化 ...
- 菜鸟学IT之四则运算升级版
菜鸟学IT之四则运算升级版 本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 团队代码github远程仓库的 ...
- python3.4中自定义数组类(即重写数组类)
'''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...
- echarts实时数据图表
import React, { PureComponent } from 'react'; import ReactEcharts from 'echarts-for-react'; import m ...
- Vue.js 2.x笔记:安装与起步(1)
1. 环境准备 Vue是一套用于构建用户界面的渐进式框架,设计为可以自底向上逐层应用.Vue 的核心库只关注视图层. 安装Node.js,下载:https://nodejs.org/ 查看安装: $ ...
- mac 开发环境安装
0: 安装brew : mac终端输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ ...
- Jetson TX1 SD card启动
上网DNS /var/run/NetworkManager/resolv.conf nameserver 211.100.225.34 nameserver 219.239.26.42
- Mint-UI组件 MessageBox为prompt 添加判断条件
Mint-UI 的Message Box 是prompt类型时,可以添加正则判断或者function判断条件.具体可以查看Mint-UI源码. 添加正则判断条件: MessageBox({ $type ...
- Hadoop系列(三):hadoop基本测试
下面是对hadoop的一些基本测试示例 Hadoop自带测试类简单使用 这个测试类名叫做 hadoop-mapreduce-client-jobclient.jar,位置在 hadoop/share/ ...