对于EVM系链交易缓冲池txpool的理解

这篇具有很好参考价值的文章主要介绍了对于EVM系链交易缓冲池txpool的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

区块链就是和交易打交道,我们今天就介绍下,交易处理过程中的一个重要组成部分:txpool。这篇文章主要从功能角度介绍,通过这篇文章会了解:

  1. txpool的在交易中的位置和作用。
  2. txpool的功能,核心组成部分queued和pending。
  3. txpool如何实现它的功能。
  4. txpool源码的重要关注点。

以太坊内部有个重要的内部功能是txpool,从字面意思就能看出来,交易池就是存放交易的池子。它在以太坊中的位置如下图,只要有新交易,无论是本节点创建的,还是其他peer节点广播来的,都会先加入到交易池里,在打包区块的时候,就从这个池子里提取,区块产生之后,共识区块,交易上链。
对于EVM系链交易缓冲池txpool的理解,BlockChain,区块链,大数据

txpool有4个功能:

  1. 作为存放交易的缓冲区,大量交易到来时,先存起来
  2. 为打包区块服务,合适交易会被打包到区块
  3. 清理交易
  4. 当交易的数量多于缓冲区大小时,过滤/惩罚发送大量交易的账户(攻击者)

我们来一张稍微详细点的模块交互图,看txpool怎么实现上面4个功能的。

对于EVM系链交易缓冲池txpool的理解,BlockChain,区块链,大数据

缓存功能的设计

txpool中的交易分为queued和pending 2种,其中queued存放未来的、当前无法执行的交易。以太坊使用nonce值决定某个账户的交易顺序,多条交易值nonce值必须连续,如果和过去的交易不连续,则无法执行,我们不妨使用nonce值,标记交易的号码,nonce为10的交易,称为第10号交易。举个例子,当前账户的nonce是10,txpool中有该账户的第100号交易,但txpool中没有第11~99号交易,这些交易的缺失,造成第100号交易无法执行,所以第100号交易就是未来的交易、不可执行的交易,存放在queue中。

pending存放可执行的交易。比如我们把上面的11~ 99号交易补全了,那么11~ 100号交易都可以进入到pending,因为这些交易都是连续的,都可以打包进区块。

当节点收到交易(本地节点发起的或peer广播来的)时,会先存放到queued,txpool在某些情况下,把queued中可执行的交易,转移到pending中。

为区块打包服务

这是txpool最核心的功能,worker在打包区块的时候,会获取所有的pending交易,但这些交易还存在txpool中,worker只是读取出来,至于txpool何时删除交易,稍后从txpool清理交易的角度单独在看。

清理交易

txpool清理交易有以下几种条件,符合任意以下1条的,都是无效交易,会被从pending或者queued中移除

  1. 交易的nonce值已经低于账户在当前高度上的nonce值,代表交易已过期,交易已经上链就属于这种情况
  2. 交易的GasLimit大于区块的GasLimit,区块容不下交易
  3. 账户的余额已不足以支持该交易要消耗的费用
  4. 交易的数量超过了queued和pending的缓冲区大小,需要进行清理

交易清理主要有3个场景

  1. txpool订阅了ChainHeadEvent事件,该事件代表主链上有新区块产生,txpool会根据最新的区块,检查每个账号的交易,有些无效的会被删除,有些由于区块回滚会从pending移动到queued,然后把queued中可执行的交易移动到pending,为下一轮区块打包组号准备。

  2. queued交易移动到pending被称为“提升”(promote),这个过程中,同样会检查交易,当交易不符合以上条件时,就会被直接从queued中删除。

  3. 删除停留在queued中超过3小时的交易,3小时这个超时时间是可以通过geth的启动参数调整的。txpool记录了某个账户交易进入pending的时间,如果这个时间超过了3小时,代表该账号的交易迟迟不能被主链打包,既然无法被主链接受,就删除掉在queued中本来就无法执行的交易。

惩罚恶意账号

这也是txpool很重要的一个属性,可以防止恶意账户以发起大量垃圾交易。防止恶意用户造成:

  1. 占用txpool空间
  2. 浪费节点大量内存和CPU
  3. 降低打包性能

只有当交易的总数量超过缓冲区大小时,txpool才会认为有恶意账户发起大量交易。pending和queued缓冲区大小不同,但处理策略类似:

  1. pending的缓冲区容量是4096,当pending的交易数量多于此时,就会运行检查,每个账号的交易数量是否多于16,把这些账号搜集出来,进行循环依次清理,什么意思呢?就是每轮只删除(移动到queued)这些账号的每个账号1条交易,然后看数量是否降下来了,不满足再进行下一轮,直到满足。
  2. queued的缓冲区容量是1024,超过之后清理策略和pending差不多,但这里可是真删除了。

该部分功能未抽象成单独的函数,而是在promoteExecutables()中,就是在每次把queued交易转移到pending后执行的。

本地交易的特权,txpool虽然对交易有诸多限制,但如果交易是本节点的账号发起的,以上数量限制等都对他无效。所以,如果你用本节点账号不停的发送交易,并不会被认为是攻击者,你用txpool.status命令,可以查看到交易的数量,肯定可以大于4096,我曾达到过60000+。

重点关注的源码

txpool的主要设计上面就讲完了,如果你想把txpool的代码阅读一番,我建议你重点关注一下这些函数和变量,按图索骥能就完全掌握txpool的实现。文章来源地址https://www.toymoban.com/news/detail-753000.html

  • TxPoolConfig:txpool的配置参数
  • chainHeadCh:txpool订阅了新区块事件
  • pending:pending的交易,每个账号都有一个交易列表
  • queue:queued的交易,每个账号都有一个交易列表
  • loop:txpool的事件处理函数
  • addTx:添加1条交易的源头,你能找到类似的函数
  • promoteExecutables:queued交易移动到pending
  • reset:根据当前区块的最新高度,重置txpool中的交易
  • 仔细阅读一遍,你会发现txpool会涉及多个锁(TxPool.mu, TxPool.all, TxPool.priced.all),所以当txpool中的交易很多时,它的性能是很低的,这也会影响到区块的打包。

到了这里,关于对于EVM系链交易缓冲池txpool的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链知识系列 - 系统学习EVM(二)-存储与安全

    区块链知识系列 - 系统学习EVM(一) EVM出于所谓运算速度和效率方面考虑,采用了非主流的256bit整数。 不支持浮点数 缺乏标准库支持,例如字符串拼接、切割、查找等等都需要开发者自己实现 给合约打补丁或是部分升级合约代码在EVM中是完全不可能的 Code code 部署合约时储存

    2024年02月02日
    浏览(48)
  • 区块链知识系列 - 系统学习EVM(一)-架构与执行流程

    EVM有一个基于栈的架构,在一个栈中保存了所有内存数值。EVM的数据处理单位被定义为256位的“字”( 这主要是为了方便处理哈希运算和椭圆曲线运算操作 ) 这里所说的内存数值是指那些EVM字节码运行所需要的输入、输出参数数据和智能合约程序运行中所需要的局部变量等

    2024年02月02日
    浏览(38)
  • blockchain layer区块链分层

    目录 1.layer0 2.layer1 3.layer2 ​4.layer3   第0层的定义目前行业还没有完全一致的理解。多数人认为第0层是 加密数据连接层及其硬件 ,对应上图下半部分。 也有一些人把跨链或可以创建链的基础设施为作为第0层,他们的代表有: LayerZero、Substrate / Polkadot 及 Cosmos layer1是我们常说

    2024年02月09日
    浏览(49)
  • Blockchain classification区块链分类

    目录 1.public blockchain 2.private blockchain 3.consortium blockchain 区块链采用不同的共识机制,区块链分为三类:公链、私链、联盟链。 公链公开、透明的,信息对任何人都可见;任何人都可以在链上发起交易,任何人都可以按共识接入区块链。没有人可以修改链上数据、也没有机构或

    2024年02月09日
    浏览(39)
  • Go语言Blockchain与区块链

    区块链技术是一种分布式、去中心化的数字账本技术,它允许多个节点共同维护一个共享的、有序的、不可篡改的数据库。区块链技术的核心概念是通过加密技术和分布式共识算法来确保数据的安全性、完整性和可靠性。 Go语言是一种静态类型、垃圾回收、并发简单的编程语

    2024年02月20日
    浏览(38)
  • web3:区块链Blockchain

    在此声明,仅做分享,绝不存在倡导炒币行为

    2024年02月09日
    浏览(46)
  • 【Blockchain】区块链浏览器 | 以太坊Etherscan比特币Blockchain门罗币Monero

    区块链浏览器是一种软件,它使用API(应用程序编程接口)和区块链节点从区块链中提取各种数据,然后使用数据库来排列搜索到的数据,并以可搜索的格式将数据呈现给用户。 用户的输入是资源管理器上的可搜索项,然后通过数据库上的组织表进行搜索。浏览器已经将区块链中

    2024年04月08日
    浏览(43)
  • 【Blockchain】区块链游戏GameFi | NFT

    GameFi是游戏和金融的组合,它涉及区块链游戏,对玩家提供经济激励,也被称为“玩赚钱游戏”。 通常,玩家可以通过完成任务、与其他玩家战斗或通过名种游戏关卡来获得游戏内的奖励。现在很多赚钱游戏都严重依赖于游戏设计师所说的研磨机制,在这种机制中,玩家必须

    2024年04月13日
    浏览(66)
  • Overview of Blockchain区块链概述

    目录 1.def 2.smart contract 3.Consensus mechanism 4.blockchain fork 比特币诞生的几年后,人们开始意识到区块链技术本身的潜力,慢慢走出了自己的发展路线。 通常区块链被定义为一种去中心化的分布式账本技术,最初用来记录信息,使记录具备不可篡改性,随着以太坊的出现,还可以

    2024年02月07日
    浏览(35)
  • Go语言的Blockchain与区块链

    区块链技术是一种分布式、去中心化的数字账本技术,它允许多个节点在网络中共享和同步数据。区块链技术的核心概念是将数据以链式结构存储,每个数据块(block)包含前一个数据块的哈希值,形成一条链。这种结构使得数据的完整性和不可篡改性得到保障。 Go语言是一种静

    2024年04月10日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包