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

核心功能

交易池状态重置

  1. 启动
  2. 收到新块~

图2: 缓冲区状态重置

启动时,从本地获取当前区块状态,设置pending和queue缓冲,设置txpool状态db;收到合法块的时候,重置交易池状态到新块root,调整pending和queue缓冲区以对应新的区块高度。
注:eth按照td最大作为最长链,在交易池重置状态时需要计算old链与new链中交易的差集,并重新进行广播,重新打包。

交易入池

  1. p2p网络
  2. 本地节点

图3: 交易入池和检查

交易的来源包括p2p广播和本地节点rpc接收。当txpool接收到交易后,会对每笔交易进行一连串严格的检查,包括:

余额
nonce
交易Gas
签名
交易大小
交易value,等等

交易的升级和降级

  1. Queue —> Pending
  2. Pending —> Queue

图4: 交易升级和降级

pending和queue两个缓冲区的交易是动态调整的,比如当由于删除了某笔交易造成较大nonce从可执行状态变为不可执行状态,会导致pending中的交易迁移到queue中;当由于新添加交易消除了queue中nonce-gap交易时,queue中缓存的部分交易会迁移到pending中,变为可执行状态。

缓冲区溢出及处理

在txpool中,缓冲区不是无限的,受限于硬件设备以及出于安全性考虑,pending和queue所容纳的交易量通过一组参数/阈值进行限制:AccountSlotsGlobalSlotsAccountQueueGlobalQueue。 其中,前两个与pending缓冲区有关,后两个用来限制queue缓冲区大小。
缓冲区溢出(交易超过阈值)的三种情况:

  1. all溢出, Count(all) > GlobalSlots + GlobalQueue
  2. pending溢出, Count(pending) > GlobalSlots
  3. queue溢出, Count(queue) > GlobalQueue

第一种情况起因一般是有新的交易入池,后两种情况起因除了新交易入池外,还有可能是删除交易或交易替换引起的两者之间的动态调整。
对应的处理策略:

  1. all溢出。新交易如果是Unpriced,拒绝;否则删除旧交易,插入新交易
  2. pending溢出。建立一个关于账户交易数的优先队列,对超过交易数限额AccountSlots的账户进行惩罚,按照图5所示策略剔除交易,降低交易池负载
  3. queue溢出。删除滞留在queue中最旧的交易。

图5. pending溢出交易剔除策略
说明:首先,建立一个超限额账户的优先队列;取出交易最多的两个账户(蓝色和红色),从交易最多的账户开始删除交易,直到与红色相等,如果pending仍溢出,从优先队列中取出下一个账户(紫色),重复前面的过程。
最后,如果优先队列为空,pending仍溢出,那么按照账户的取出顺序,每次删除一笔交易,直到pending内交易量小于GlobalSlots阈值。

交易过滤

  1. 超时过滤
  2. gas最大过滤,GasLimit
  3. gasPrice过滤
  4. Local白名单

local交易会被登记入pool.locals,类似一个白名单,添加交易的时候不对gasPrice进行检查。缓冲区执行交易剔除相关策略时,不删除在pools.locals中登记账户的交易

以太坊工作原理之txpool详解的更多相关文章

  1. NFS工作原理及配置文件详解

    nfs工作原理流程       如上图所示,当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程如下几点:     1.首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能 ...

  2. 场效应管种类-场效应管N、P沟道与增强、耗尽型工作原理等知识详解 如何选用晶体三极管与场效应管的技巧

    http://www.kiaic.com/article/detail/1308.html 场效应管种类场效应管 场效应晶体管(Field Effect Transistor缩写(FET))简称场效应 ...

  3. vmware三种网络模式的工作原理及配置详解

    vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开vmware虚拟机,我们可以在选项栏的“编辑”下的 ...

  4. ansible 工作原理以及使用详解

    内容:1.ansible的作用以及工作结构2.ansible的安装以及使用3.ansible的playbook使用 一.ansible的作用以及工作结构        1.ansible简介:     ...

  5. Go语言备忘录:反射的原理与使用详解

    目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能   1.预备知识: Go的变量都是静态类 ...

  6. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

  7. Go语言备忘录(2):反射的原理与使用详解

    本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...

  8. 基础 | batchnorm原理及代码详解

    https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...

  9. Oracle中的SQL分页查询原理和方法详解

    Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006

随机推荐

  1. XSS SQL CSRF

    XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意脚本 ...

  2. Python数据结构应用5——排序(Sorting)

    在具体算法之前,首先来看一下排序算法衡量的标准: 比较:比较两个数的大小的次数所花费的时间. 交换:当发现某个数不在适当的位置时,将其交换到合适位置花费的时间. 冒泡排序(Bubble Sort) 这 ...

  3. Android 7.0 启动篇 — init原理(二)(转 Android 9.0 分析)

    ========================================================          ================================== ...

  4. JPushDemo【极光推送集成,基于v3.1.8版本】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个Demo只是记录极光推送的集成,不能运行. 使用步骤 一.项目组织结构图 注意事项: 1.  导入类文件后需要change包名以 ...

  5. SpringBoot自动配置原理

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...

  6. .net MVC +EF+VUE做回合制游戏(一)

    刚毕业的新人,工作的时候试过用.net 框架,但是我发现写的前端代码都非常多,要写很多很多的原生,然后最近在看vue.js觉得还不错,可以减少前端很多dom操作. 至于做的东西我是想做一个游戏,一个回 ...

  7. 必看!如何让你的LBS服务性能提升十倍!

    本文由云+社区发表 作者:腾讯云数据库团队 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战.MongoDB对LB ...

  8. Ftp修改为主被动模式命令

    FTP是有两种数据连接模式的,主动模式和被动模式. PORT(主动)方式:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路.当需要传送数据时,客户端在命令链路上用 ...

  9. Windows Server 2016-命令行批量导出AD用户列表信息

    本章节为大家带来如何通过Powershell或ldifde命令行方式导出域用户列表信息,方便大家日常运维工作中使用. Powershell方式导出现有Staff目录下所有用户信息列表: Get-ADU ...

  10. python3 装饰器初识 NLP第三条

    还是先抄一条NLP假设... 三,有效果比有道理更重要   光说做法有道理或者正确而不顾是否有效果,是在自欺欺人. 在三赢(我好,人好,世界好)的原则基础上追求效果,比坚持什么是对的更有意义. 说道理 ...