2021年最新以太坊源码导读-p2p架构
前面部分的内容都是源码导读,可能有的朋友没有耐心把所有代码看完。这里我采用尽可能简单的方式来介绍p2p这部分的代码究竟做了什么。
一、概念篇
p2p是peer-to-peer的缩写,以太坊网络是一个去中心的对等网络,因此需要有一个机制来实现网络间节点的相互发现,即当一个新的节点运行起来后,究竟如何加入网络?加入网络之后,节点之间如何通信?p2p部分采用了UDP协议做网络发现,采用了TCP协议用于节点间通信。下面简单介绍两个协议的基本流程。
二、TCP连接
此部分的流程如下图
1.打开TCP端口监听,这是一个可选项,因为有的节点可能只希望从其他的节点同步数据,并不希望监听端口,监听端口意味着有其他节点连入服务器,这会消耗节点的性能及网络的流量。
2.插槽。插槽是一个抽象的概念,默认有50个插槽,只有当插槽有空闲的时候,服务器才会处理新到来的连接。这个设计保证了服务器的安全,设定了服务器最多同时处理新到来的连接的上限,使得服务器不会因为大量连接同时到来而性能骤降。
3.ip白名单。这也是一个关于安全的设计,只有符合网络策略的节点才能与服务器建立连接。
4.握手协议。握手会有两次,第一次是p2p网络通用的RLPx协议(关于此协议,大家请自行百度,我就不赘述了)握手,这个协议实现了加密的通信;第二次是节点支持的协议的握手,可能存在节点间版本不一致的情况,因此,节点间沟通自身支持的协议名称及对应版本,确保双方至少有一个协议相同,否则无法通信。
5.一切完成之后,服务器与对等节点建立了连接,并持续处理节点消息的收发。
三、UDP连接
这部分的内容涉及kademlia算法,如果不明白请先搜索学习。大致的逻辑也很简单,如下图。
1.启动UDP端口监听
2.根据配置的bootstrap node初始化table,此处的table是一个kademlia算法中桶的实现
3.启动一个独立的goroutine,定期更新桶中的节点,并持久化节点到本地DB
4.启动一个独立的goroutine,响应来自其他节点的消息
2021年最新以太坊源码导读-p2p架构相关推荐
- 基于tutk方案的p2p源码_以太坊源码分析--p2p节点发现
p2p(peer to peer)负责以太坊节点间的通信,主要包括底层节点发现(discover)和上层协议运行两大块,本文主要描述其中节点发现部分的实现 数据结构 节点发现功能主要涉及 Server ...
- 3 v4 中心节点固定_死磕以太坊源码分析之p2p节点发现
死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...
- 以太坊源码学习 -- EVM
以太坊源码学习 – EVM 学习文档链接:here 一.虚拟机外 主要功能: 执行前将Transaction类型转化成Message,创建虚拟机(EVM)对象,计算一些Gas消耗,以及执行交易完毕后创 ...
- 以太坊源码分析-交易
以太坊源码分析-交易 机理 先说一点区块链转账的基本概念和流程 用户输入转账的地址和转入的地址和转出的金额 系统通过转出的地址的私钥对转账信息进行签名(用于证明这 笔交易确实有本人进行) 系统对交易信 ...
- 以太坊源码学习(一) 正本清源
以太坊源码学习(一)正本清源 背景 geth源码一直在不断增加,优化,发展到现在已经非常庞大,第一次看geth源码,会有不小的难度.虽然如此,还是可以从geth仓库的第一个commit开始,这时的代码 ...
- php区块链以太坊,兄弟连区块链教程以太坊源码分析CMD深入分析(一)
兄弟连区块链教程以太坊源码分析CMD深入分析. cmd包分析 cmd下面总共有13个子包,除了util包之外,每个子包都有一个主函数,每个主函数的init方法中都定义了该主函数支持的命令,如 geth ...
- 以太坊源码阅读3——MPT原理
以太坊源码阅读3--MPT原理 介绍 MPT(Merkel-Patricia Tree),翻译为梅克尔-帕特里夏树 MPT提供了一个基于密码学验证的底层数据结构,用来存储键值对( key-value) ...
- 以太坊源码阅读2——RLP编码
以太坊源码阅读2--RLP编码 RLP介绍 目前网上的资料都是RLP(Recursive Length prefix),叫递归长度前缀编码,但目前源码的doc.go的第20行里面的注释写的是 The ...
- 以太坊源码分析(2)——以太坊APP对象
前言 从这一节开始,我将开始以太坊代码全覆盖讲解,讲解的流程是: 以太坊程序入口 基本框架 以太坊协议 发送一笔交易后发生了什么 启动挖矿 以太坊共识 p2p 网络 阅读本系列文章,将默认读者具备一定 ...
最新文章
- LabVIEW生成应用程序(exe)和安装程序(installer)
- Linux基础命令(常用的)
- 字符串处理问题[2]:将一个数字型…
- 信息学奥赛一本通C++语言——1023:Hello,World!的大小
- day11 java的继承
- linux 权限管理命令
- 计算机二级python考试大纲2020_【2020年9月全国计算机二级Python考试大纲】- 环球网校...
- java 将bean转化为map,将javabean转化为map对象
- Android无界面编程之使用Service
- 04-cmake语法-STREQUAL
- DelegatingFilterProxy详解
- java 快速创建map_快速创建Map并初始化,超级简单
- Struts2框架之文件下载
- 计算机管理没有Android手机项,电脑没有手机驱动各品牌解决办法
- 4-2. 打印九九口诀表
- Redis列表与集合
- go语言工具_Concurrent Map
- ORALC/HIVE 的STDDEV、STDDEV_POP、STDDEV_SAMP等函数
- 他们为国效力40年,不如Angelababy发呆1天
- 《百度》文库下载券免费下载文档教程