以太坊笔记综合

###源码目录结构:

accounts         实现了一个高等级的以太坊账户管理
bmt         二进制的默克尔树的实现
build           主要是编译和构建的一些脚本和配置
cmd         命令行工具,又分了很多的命令行工具,下面一个一个介绍/abigen     Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages/bootnode    启动一个仅仅实现网络发现的节点/evm     以太坊虚拟机的开发工具, 用来提供一个可配置的,受隔离的代码调试环境/faucet     /geth       以太坊命令行客户端,最重要的一个工具/p2psim        提供了一个工具来模拟http的API/puppeth  创建一个新的以太坊网络的向导/rlpdump  提供了一个RLP数据的格式化输出/swarm      swarm网络的接入点/util        提供了一些公共的工具/wnode        这是一个简单的Whisper节点。 它可以用作独立的引导节点。此外,可以用于不同的测试和诊断目的。
common          提供了一些公共的工具类
compression     Package rle implements the run-length encoding used for Ethereum data.
consensus       提供了以太坊的一些共识算法,比如ethhash, clique(proof-of-authority)
console         console类
contracts
core            以太坊的核心数据结构和算法(虚拟机,状态,区块链,布隆过滤器)
crypto          加密和hash算法,
eth         实现了以太坊的协议
ethclient       提供了以太坊的RPC客户端
ethdb           eth的数据库(包括实际使用的leveldb和供测试使用的内存数据库)
ethstats        提供网络状态的报告
event           处理实时的事件
les         实现了以太坊的轻量级协议子集
light           实现为以太坊轻量级客户端提供按需检索的功能
log         提供对人机都友好的日志信息
metrics         提供磁盘计数器
miner           提供以太坊的区块创建和挖矿
mobile          移动端使用的一些warpper
node            以太坊的多种类型的节点
p2p         以太坊p2p网络协议
rlp         以太坊序列化处理
rpc         远程方法调用
swarm           swarm网络处理
tests           测试
trie            以太坊重要的数据结构Package trie implements Merkle Patricia Tries.
whisper         提供了whisper节点的协议。

PS:

账户信息管理-哈希值32byte-地址20byte

RLP编码-通过反射取出不同类型的编码器解码器

LevelDB数据库-MPT数据结构{Trie-提高查找速度。Patricia Trie-节约存储空间。Merkle Tree-防止篡改}

geth-命令行工具-解释器Interpreter(将solidity转换为二进制)

P2P-NAT穿透-端口30303-Kad

RPC通信

P2P 四种不同的网络模型:

​ 1.集中式: 存在一个中心节点保存了其他所有节点的索引信息,索引信息一般包括节点 IP 地址、端口、节点资源等。

2.纯分布式: 移除了中心节点,在 P2P 节点之间建立随机网络,就是在一个新加入节点和 P2P 网络中的某个节点间随机建立连接通道,从而形成一个随机拓扑结构。

3.混合式: 混合式其实就是混合了集中式和分布式结构,网络中存在多个超级节点组成分布式网络,而每个超级节点则有多个普通节点与它组成局部的集中式网络。

4.结构化模型:比特币模型,以太坊模型,超级账本模型

比特币模型:

P2P-Kad算法

1.核心数据结构:

  • 由于NodeID经过sha3生成出的Hash为256位。(看源码)

  • 源码node-table列表中有256-1=255项,其中-1是因为刨除了当前节点(本机)

  • 列表的每一项位一个节点桶(NodeBucket),每个桶中最多放16个节点

  • 列表的第i项代表据当前节点(本机)距离为i+1的网络节点集合

  • 总而言之,Kad算法就是在以太坊p2p网络中怎么去找到自己想要的节点,不可能挨个节点去遍历。

  • 怎么节省空间,怎么节省资源,怎么查找速度快,这就利用到了Kad算法模型。

2.K桶

概念:

​ Kad的路由表是通过称为K桶的数据构造而成,K桶记录了节点NodeId,distance,port,ip等信息。以太坊K桶按照与target节点距离进行排序,共256个K桶(因为节点ID是32byte==256bit),每个K桶包含16个节点。

####1.设想以下情景:

​ 以0000110为基础节点,如果一个节点的ID,前面所有位数都与它相同,只有最后1位不同,这样的节点只有1个——0000111,与基础节点的异或值为0000001,即距离为1;对于0000110而言,这样的节点归为“k-bucket 1”;

​ 如果一个节点的ID,前面所有位数相同,从倒数第2位开始不同,这样的节点只有2个:0000101、0000100,与基础节点的异或值为0000011和0000010,即距离范围为3和2;对于0000110而言,这样的节点归为“k-bucket 2”

####2.如果将整个网络的节点梳理为一个按节点ID排列的二叉树,每个叶子便是一个节点。

3.节点间的距离–异或

查找距离:

4.Kad通信协议

以太坊Kad网络中节点间通信基于UDP,主要由以下几个命令构成,若两个节点间PING-PONG握手通过,则认为相应节点在线。

​ PS:TCP用于数据传输,UDP用于节点发现

​ ####四种协议:基于UDP(看源码)

PING 探测一个节点,判断其是否在线
PONG PING命令响应
FIND-NODE 向节点查询某个与目标节点ID距离接近的节点
NEIGHBORS FIND_NODE命令响应,发送与目标节点ID距离接近的K桶中的节点

5.发现邻居节点

####(邻居节点是指加入到K桶,并通过PING-PONG握手的节点。 )

1.通过上诉四种协议查找邻居节点

看我画的:

跟新K桶的法则:

  • 通过距离d选择路由表中对应的K-桶,如果目标节点ID已经在K-桶中,则把对应项移到该K-桶的尾部

  • 如果目标节点ID不在K-桶中,则有两种情况:

    • 如果该K-桶存储的节点小于16个,则直接把目标节点插入到K-桶尾部;
    • 如果该K-桶存储节点大于等于16个,则选择K-桶中的头部节点进行PING操作,检测节点是否存活。如果头部节点没有响应,则移除该头部节点,并将目标节点插入到队列尾部;如果头部节点有响应,则把头部节点移到队列尾部,同时忽略目标节点。
    • 根据距离插入对应的K桶当中。

PS:以上查找循环K次, 这 里 k 是为平衡系统性能 和网络负载而设置的一个常数,但必须是偶数,以太坊取8.

PSS:查找目标节点和发现邻居节点类似

以太坊P2P中Kad算法解析相关推荐

  1. Etherscan以太坊浏览器中Input Data解析方法

    Etherscan是目前比较好用的一个以太坊浏览器,在上面可以查看到以太坊上面的每一笔交易,区块等详细信息,这里我们要来研究的是对于某一次的交易,其中的Input Data如果不使用浏览器提供的UTF ...

  2. 以太坊源码解析 - 以太坊P2P协议

    创建P2P server func (n *Node) Start() error {...// Initialize the p2p server. This creates the node ke ...

  3. 以太坊 p2p Server 原理及实现

    以太坊p2p原理与实现 区块链技术的去中心依赖于底层组网技术,以太坊的底层实现了p2pServer,大约可以分为这样三层. 底层路由表.封装了kad路由,节点的数据结构以及计算记录,节点搜索,验证等功 ...

  4. 深入理解以太坊 P2P 网络设计

    前言 在设计公链时,节点与节点之间建立连接需要 P2P 协议,从而实现数据的同步,于此同时上层应用还需要封装一些通信逻辑,比如节点之间的区块同步.交易数据同步等. 本篇文章将对 P2P 网络发展进行简 ...

  5. 以太币转帐速度_燃起来吧!一文带你读懂以太坊网络中的Gas、Gas Fee、Gas Price、Gas...

    曾用过区块链相关应用,不管是交易所.DApp 或是虚拟货币钱包的人,一定都听过矿工费(Gas Fee) 这个词.它是当你要在区块链网路发起一笔交易时,所要支付给矿工的一笔手续费.其实很容易理解,就好比 ...

  6. 以太坊交易中的nonce和confirmation

    1. 以太坊交易中的nonce及其价值 1.1 以太坊交易中的nonce值 在以太坊中,每笔交易都有一个nonce值,该nonce值代表的是从该交易发起地址发出的交易数.(当存在使用同一地址从多个客户 ...

  7. 以太坊PoA共识引擎算法介绍(1)

    1. 以太坊中PoA产生的背景 如果你想用以太坊搭建一个联盟/私有链, 并要求该链交易成本更低甚至没有, 交易延时更低,并发更高, 还拥有完全的控制权(意味着被攻击概率更低). 目前以太坊采用PoW或 ...

  8. signature=cb30417dfa65eef445418827e0f0e0e6,以太坊P2P网络节点初始化

    问题 以太坊底层采用了P2P去中心化网络,在不知道任何其它节点的情况之下,它是如何寻找到其它节点并与之通信的呢? 答案 本身一定事先知道了其它节点的 首先厘清两个概念 bootnode 从名字上看得出 ...

  9. 【问链财经-区块链基础知识系列】 第三十八课 以太坊智能合约账户全解析

    以太坊是有账户的,每个用户都可以开设账户,账户余额是我们拥有的以太币或其他基于 ERC20 标准的通证.账户的设计使得以太坊与比特币不同,根据之前的讨论我们知道,比特币只有钱包地址和未使用的交易输出. ...

最新文章

  1. WPF查找子控件和父控件方法
  2. 面试官:能说一说Mysql缓存池吗?
  3. 今天有了自己得博客,心情不错。
  4. MyBatis之使用JSONObject代替JavaBean优雅返回多表查询结果
  5. Xgboost调参小结
  6. hiberante 二级缓存设置
  7. outlook里面邮件不能显示图片
  8. Qt+VS2013编译报错:'cl' 不是内部或外部命令,也不是可运行的程序
  9. Yii的gii-modules
  10. matlab中的导函数驻点,Matlab用导数作定性分析
  11. 不用写代码,就能训练测试深度学习模型!Uber开源AI工具箱Ludwig
  12. Java程序设计(基础)- 概述
  13. flash关闭硬件加速 关闭自动升级
  14. mysql root不能登录密码怎么办_mysql 忘记root密码,重置密码,及重置密码后权限问题不能登录的解决方案...
  15. js高级第三天(原型链及继承)
  16. OSI七层模型——数据链路层
  17. Android 获取局域网内网IP地址
  18. echart自定义图例icon的形状
  19. 微博评论数据——requests——保存在本地
  20. 产品经理VISIO操作

热门文章

  1. c++基础语法命令(C程序员刷leetcode)
  2. python识别图片验证码,踩坑亲测
  3. 在URL中传递中文的解决方式
  4. java redis 发送短信验证码
  5. arduino8266控制引脚
  6. Pytorch Note 快乐星球
  7. 增量表、全量表和拉链表
  8. 基于像素匹配的MATLAB平台身份证号码实时识别
  9. 编译原理-16-语法分析概述
  10. 购买服务器并设置Nginx