以太坊工作原理之txpool详解
txpool详解
交易池txpool
作为区块链系统的重要组成部分,对系统的安全性和稳定性具有重要作用。功能可归纳为:交易缓存、交易验证和交易过滤。
基本介绍
交易分类和缓存
txpool主要包含两个重要的缓冲区:pending和queue。交易在进行打包验证和p2p广播前,首先要通过txpool来进行层层验证,验证过的交易会被换存在pending和queue中,等待进一步处理。
图1: peding和queue缓冲区
其中,换存在pending中的交易可被立即处理并打包,queue中的交易是nonce-gap交易,当nonce-gap消除后,会被迁移到pending缓存中。
事件处理
交易池在符合条件下,会处理以下事件:
- report:统计交易池中pending和queue中交易数量(default 8s)
- evict:交易失效检查事件(1min),从queue中剔除3个小时前的交易,(类似挂单,超时删除)
- journal:本地交易日志(缓存pending和queue队列中属于本地的交易,白名单交易,默认存储于transactions.rlp)
- chainHeadEvent:收到新块后交易池的处理,调用reset
核心功能
交易池状态重置
- 启动
- 收到新块~
图2: 缓冲区状态重置
启动时,从本地获取当前区块状态,设置pending和queue缓冲,设置txpool状态db;收到合法块的时候,重置交易池状态到新块root,调整pending和queue缓冲区以对应新的区块高度。
注:eth按照td最大作为最长链,在交易池重置状态时需要计算old链与new链中交易的差集,并重新进行广播,重新打包。
交易入池
- p2p网络
- 本地节点
图3: 交易入池和检查
交易的来源包括p2p广播和本地节点rpc接收。当txpool接收到交易后,会对每笔交易进行一连串严格的检查,包括:
余额
nonce
交易Gas
签名
交易大小
交易value,等等
交易的升级和降级
- Queue —> Pending
- Pending —> Queue
图4: 交易升级和降级
pending和queue两个缓冲区的交易是动态调整的,比如当由于删除了某笔交易造成较大nonce从可执行状态变为不可执行状态,会导致pending中的交易迁移到queue中;当由于新添加交易消除了queue中nonce-gap交易时,queue中缓存的部分交易会迁移到pending中,变为可执行状态。
缓冲区溢出及处理
在txpool中,缓冲区不是无限的,受限于硬件设备以及出于安全性考虑,pending和queue所容纳的交易量通过一组参数/阈值进行限制:AccountSlots
、GlobalSlots
、AccountQueue
和GlobalQueue
。 其中,前两个与pending缓冲区有关,后两个用来限制queue缓冲区大小。
缓冲区溢出(交易超过阈值)的三种情况:
- all溢出, Count(all) > GlobalSlots + GlobalQueue
- pending溢出, Count(pending) > GlobalSlots
- queue溢出, Count(queue) > GlobalQueue
第一种情况起因一般是有新的交易入池,后两种情况起因除了新交易入池外,还有可能是删除交易或交易替换引起的两者之间的动态调整。
对应的处理策略:
- all溢出。新交易如果是Unpriced,拒绝;否则删除旧交易,插入新交易
- pending溢出。建立一个关于账户交易数的优先队列,对超过交易数限额
AccountSlots
的账户进行惩罚,按照图5所示策略剔除交易,降低交易池负载- queue溢出。删除滞留在queue中最旧的交易。
图5. pending溢出交易剔除策略
说明:首先,建立一个超限额账户的优先队列;取出交易最多的两个账户(蓝色和红色),从交易最多的账户开始删除交易,直到与红色相等,如果pending仍溢出,从优先队列中取出下一个账户(紫色),重复前面的过程。
最后,如果优先队列为空,pending仍溢出,那么按照账户的取出顺序,每次删除一笔交易,直到pending内交易量小于GlobalSlots
阈值。
交易过滤
- 超时过滤
- gas最大过滤,GasLimit
- gasPrice过滤
- Local白名单
local交易会被登记入pool.locals,类似一个白名单,添加交易的时候不对gasPrice进行检查。缓冲区执行交易剔除相关策略时,不删除在pools.locals中登记账户的交易
以太坊工作原理之txpool详解的更多相关文章
- NFS工作原理及配置文件详解
nfs工作原理流程 如上图所示,当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程如下几点: 1.首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能 ...
- 场效应管种类-场效应管N、P沟道与增强、耗尽型工作原理等知识详解 如何选用晶体三极管与场效应管的技巧
http://www.kiaic.com/article/detail/1308.html 场效应管种类场效应管 场效应晶体管(Field Effect Transistor缩写(FET))简称场效应 ...
- vmware三种网络模式的工作原理及配置详解
vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开vmware虚拟机,我们可以在选项栏的“编辑”下的 ...
- ansible 工作原理以及使用详解
内容:1.ansible的作用以及工作结构2.ansible的安装以及使用3.ansible的playbook使用 一.ansible的作用以及工作结构 1.ansible简介: ...
- Go语言备忘录:反射的原理与使用详解
目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能 1.预备知识: Go的变量都是静态类 ...
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- Go语言备忘录(2):反射的原理与使用详解
本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...
- 基础 | batchnorm原理及代码详解
https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...
- Oracle中的SQL分页查询原理和方法详解
Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006
随机推荐
- 操作系统--进程管理(Processing management)
一.进程的组成 进程通常由程序.数据和进程控制块(Process Control Block,PCB)组成. 二. 进程的状态以及状态切换 进程执行时的间断性决定了进程可能具有多种状态,最基本的三种状 ...
- zookeeper配置管理+集群管理实战
引言 之前就了解过kafka,看的似懂非懂,最近项目组中引入了kafka,刚好接着这个机会再次学习下. Kafka在很多公司被用作分布式高性能消息队列,kafka之前我只用过redis的list来做简 ...
- TF.learn学习
官网地址:https://www.tensorflow.org/versions/r1.1/get_started/tflearn 1.代码例子 实现自定义的Estimator 使用DNNClassi ...
- 用python把一个txt文件中所有逗号,替换成空格?
string = "word 2 3 4 5 6 7" string = ",".join(string.split()) import numpy as np ...
- ArrayList的add(E e)方法与扩容
ArrayList是Java开发中经常用到的集合类,它是List接口的实现类,具有很高的查询性能,但不是线程安全的.本文主要讲述了ArrayList的add(E e)方法及该方法中涉及到的容量扩容技术 ...
- 页面性能优化-原生JS实现图片懒加载
在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再 ...
- 读书笔记:深入理解java虚拟机(二)创建对象的时候需要访问哪几块内存
@TOC 对象在内存中如何储存 对象访问在java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及到java栈,java堆,方法去三个最重要的内存区域的关联关系,比如下面这段代码: ...
- ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx
一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...
- Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- 学习 JavaScript (七) 内存问题
内存问题是 JavaScript 比较底层的东西,依葫芦画瓢学会了怎么使用变量,但是对于内存的概念依然模糊,今天让我们一起来了解一下内存在这门语言是怎么样的存在. 内存在不同类型的数值面前表现有很大的 ...