建议和反馈

请填写你的反馈内容

以太坊交易池(txpool)的管理

2018-07-19 ·7182次阅读 ·读完需要5分钟

在使用节点的过程中txpool是不可不了解的知识点,交易从发出到被打包都经历了哪些过程?txpool在这个过程中又起到什么作用?今天这篇文章就带大家简单了解一下。

txpool对应的启动参数

我们先来了解一下,针对txpool有哪些参数项可以设置,然后着重分析。


  1. --txpool.nolocals 为本地提交交易禁用价格豁免

  2. --txpool.journal value 本地交易的磁盘日志:用于节点重启(默认:"transactions.rlp")

  3. --txpool.rejournal value 重新生成本地交易日志的时间间隔(默认:1小时)

  4. --txpool.pricelimit value 加入交易池的最小的gas价格限制(默认:1)

  5. --txpool.pricebump value 价格波动百分比(相对之前已有交易)(默认:10)

  6. --txpool.accountslots value 每个帐户保证可执行的最少交易槽数量(默认:16)

  7. --txpool.globalslots value 所有帐户可执行的最大交易槽数量(默认:4096)

  8. --txpool.accountqueue value 每个帐户允许的最多非可执行交易槽数量(默认:64)

  9. --txpool.globalqueue value 所有帐户非可执行交易最大槽数量(默认:1024)

  10. --txpool.lifetime value 非可执行交易最大入队时间(默认:3小时)

txpool内容的查看


  1. > txpool.content

  2. {

  3. pending:{},

  4. queued:{}

  5. }

很显然,txpool中由两部分构成pending和queued组成。那么他们两者有什么分别呢。最明显的是一个为待打包状态,一个为队列中。这里我们发起了两笔不同的交易:


  1. >eth.sendTransaction({from:"0xdae19174969a7404e222c24b6726e4d089c12768",to:"0x5929a871f57a1C5F7E4eA304CAe92DACD1C1556b",value:web3.toWei(0.01,"ether"),gasPrice:21000000000,nonce:2});

  2. "0x7db7883bb23a31deb9f01b5e6fb28363b1aee1b9b6797ea8b5706be170a1187c"

  3. >eth.sendTransaction({from:"0xdae19174969a7404e222c24b6726e4d089c12768",to:"0x5929a871f57a1C5F7E4eA304CAe92DACD1C1556b",value:web3.toWei(0.01,"ether")});

  4. "0x2784a79a8c454c72700e7be3b31c1c98ceaea232ca4992a6830b0fc999ebb653"

很显然,第一笔交易指定了nonce为2,第二笔交易未指定nonce值,因为此地址没有发起过交易那么nonce值默认为0。这时我们再看一下txpool中的内容:


  1. > txpool.content

  2. {

  3. pending:{

  4. 0xdAE19174969A7404e222c24B6726E4D089c12768:{

  5. 0:{

  6. blockHash:"0x0000000000000000000000000000000000000000000000000000000000000000",

  7. blockNumber:null,

  8. from:"0xdae19174969a7404e222c24b6726e4d089c12768",

  9. gas:"0x15f90",

  10. gasPrice:"0x1",

  11. hash:"0x2784a79a8c454c72700e7be3b31c1c98ceaea232ca4992a6830b0fc999ebb653",

  12. input:"0x",

  13. nonce:"0x0",

  14. r:"0xdabcd46d8d0b61e468d9f10119d544437f89cd094c35a89e5cbed298faf52c4a",

  15. s:"0x3670f23ecfb0a12e982a60438640fe042eefc50646a077de0244a8d67a84af9e",

  16. to:"0x5929a871f57a1c5f7e4ea304cae92dacd1c1556b",

  17. transactionIndex:"0x0",

  18. v:"0xa95",

  19. value:"0x2386f26fc10000"

  20. }

  21. }

  22. },

  23. queued:{

  24. 0xdAE19174969A7404e222c24B6726E4D089c12768:{

  25. 2:{

  26. blockHash:"0x0000000000000000000000000000000000000000000000000000000000000000",

  27. blockNumber:null,

  28. from:"0xdae19174969a7404e222c24b6726e4d089c12768",

  29. gas:"0x15f90",

  30. gasPrice:"0x4e3b29200",

  31. hash:"0x7db7883bb23a31deb9f01b5e6fb28363b1aee1b9b6797ea8b5706be170a1187c",

  32. input:"0x",

  33. nonce:"0x2",

  34. r:"0xa8953a87c326c02da9d7a712d6c7ac0cd415cbc71ea0c24423f9e01b1fec65bd",

  35. s:"0x3faefc3a0db585a67f02996a7167890e41ff5fd8fd4be6efff3bea7a797fad29",

  36. to:"0x5929a871f57a1c5f7e4ea304cae92dacd1c1556b",

  37. transactionIndex:"0x0",

  38. v:"0xa96",

  39. value:"0x2386f26fc10000"

  40. }

  41. }

  42. }

  43. }

现在txpool中有两笔交易,其中nonce为0的在pending中,nonce为2的在queued中。为什么只有nonce不同的两笔交易,在txpool中的位置却不同呢?

txpool的处理流程

首先,如果不传入nonce值,那么geth节点会默认计算当前地址已经发起了的交易中最大的nonce值为多少,然后将其+1,然后将此交易放置在pending中,等待节点打包。

其次,如果传入的nonce值过大,在进入txpool中检查到它之前的nonce并没有使用过,那么此笔交易不会发送到pending中,而且放置在queued中。只有当前面的nonce补齐之后,才会进入到pending中。那么,我们再发一笔交易把nonce补齐看看:


  1. >eth.sendTransaction({from:"0xdae19174969a7404e222c24b6726e4d089c12768",to:"0x5929a871f57a1C5F7E4eA304CAe92DACD1C1556b",value:web3.toWei(0.01,"ether")});

  2. "0x7ee17d38405c01bab4eec4d9dc62a6bba98283e243a2d9132187706485878ef5"

  3. > txpool.content

  4. {

  5. pending:{

  6. 0xdAE19174969A7404e222c24B6726E4D089c12768:{

  7. 0:{

  8. blockHash:"0x0000000000000000000000000000000000000000000000000000000000000000",

  9. blockNumber:null,

  10. from:"0xdae19174969a7404e222c24b6726e4d089c12768",

  11. gas:"0x15f90",

  12. gasPrice:"0x1",

  13. hash:"0x2784a79a8c454c72700e7be3b31c1c98ceaea232ca4992a6830b0fc999ebb653",

  14. input:"0x",

  15. nonce:"0x0",

  16. r:"0xdabcd46d8d0b61e468d9f10119d544437f89cd094c35a89e5cbed298faf52c4a",

  17. s:"0x3670f23ecfb0a12e982a60438640fe042eefc50646a077de0244a8d67a84af9e",

  18. to:"0x5929a871f57a1c5f7e4ea304cae92dacd1c1556b",

  19. transactionIndex:"0x0",

  20. v:"0xa95",

  21. value:"0x2386f26fc10000"

  22. },

  23. 1:{

  24. blockHash:"0x0000000000000000000000000000000000000000000000000000000000000000",

  25. blockNumber:null,

  26. from:"0xdae19174969a7404e222c24b6726e4d089c12768",

  27. gas:"0x15f90",

  28. gasPrice:"0x1",

  29. hash:"0x7ee17d38405c01bab4eec4d9dc62a6bba98283e243a2d9132187706485878ef5",

  30. input:"0x",

  31. nonce:"0x1",

  32. r:"0xe03fb4d94b0ff04107c855bfd88a84ecdefb03f4c9b0cea5341591aa69d4751e",

  33. s:"0x4d2f60f4045e5492cd4818145cec73c78b00e0cff57026c4528d91a82dee76e1",

  34. to:"0x5929a871f57a1c5f7e4ea304cae92dacd1c1556b",

  35. transactionIndex:"0x0",

  36. v:"0xa96",

  37. value:"0x2386f26fc10000"

  38. },

  39. 2:{

  40. blockHash:"0x0000000000000000000000000000000000000000000000000000000000000000",

  41. blockNumber:null,

  42. from:"0xdae19174969a7404e222c24b6726e4d089c12768",

  43. gas:"0x15f90",

  44. gasPrice:"0x4e3b29200",

  45. hash:"0x7db7883bb23a31deb9f01b5e6fb28363b1aee1b9b6797ea8b5706be170a1187c",

  46. input:"0x",

  47. nonce:"0x2",

  48. r:"0xa8953a87c326c02da9d7a712d6c7ac0cd415cbc71ea0c24423f9e01b1fec65bd",

  49. s:"0x3faefc3a0db585a67f02996a7167890e41ff5fd8fd4be6efff3bea7a797fad29",

  50. to:"0x5929a871f57a1c5f7e4ea304cae92dacd1c1556b",

  51. transactionIndex:"0x0",

  52. v:"0xa96",

  53. value:"0x2386f26fc10000"

  54. }

  55. }

  56. },

  57. queued:{}

  58. }

很明显,当中间的nonce被补齐之后,原来处于queued当中的交易被放置到了pending中。

经验之谈

前文提到的如何处理过期交易中提到了补齐nonce和设置—txpool.lifetime也是基于今天这批文章讲述的基础逻辑。除此之外,我们还要了解一下—txpool.accountqueue参数,它定义了每个账户在本节点queued中存放的最多的交易个数,默认是64个交易。

另外为了避免手续费过低导致交易一直存在于txpool当中占用内存,可以通过console设置手续费的最低值:


  1. >miner.setGasPrice(51000000000)

  2. true

或者在启动参数上添加:


  1. --gasprice "51000000000"


评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

节点是什么意思

节点是什么意思在数据通信中,节点是连接到网络的任何活动的物理电子设备。这些设备能够发送,接收或转发信息; 有时是三者的组合。节点的示例包括桥接器,交换机,集线器和调制解调器到其他计算机,打印机和服务器......
区块链社区 · 2019-09-21
132阅读 · 0赞赏 · 0问答

以太坊智能合约Demo

智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力。智能合约其实是“......
区块链开发 · 2019-09-20
130阅读 · 0赞赏 · 0问答

Bittrex一个著名的加密货币交易所

Bittrex最近完成了大幅削减交易费的推出,现在他们正准备宣布费用的时间表以及基于交易量的市场费用给Bittrex.com以及Bittrex的国际适用账户。根据新的费用表,更多的交易将带来更多的节省......
雨落清双 · 2019-09-20
169阅读 · 0赞赏 · 0问答

remoteaddr,net:当epoll失败时不接受conn #

您使用的是什么版本的Go(go version)?去版本go1.12.9 linux / amd64$ go版本此问题是否与最新版本一起重现?代码审查您使用的是哪种操作系统和处理器架构(go env)......
calculator · 2019-09-20
189阅读 · 0赞赏 · 0问答

YottaChain存储挖矿服务器:YTA币的投资价值你知道多少?

数字货币 的核心是去中心化,所以没有类似国家信用背书作强力保障,早期数字货币的价值也不和任何实业挂钩,而比特币为首的数字货币在这两年的价格不断攀升,大多原因是国际投机资本的介入推波助澜,全面炒作拉升价......
YTA超级节点 · 2019-09-19
108阅读 · 0赞赏 · 0问答

RabbitMQ教程(译)-Topics

为什么需要topic交换机?(使用Go客户端)尽管direct交换机能够改善我们的系统,但是它也有它的限制 —— 没办法基于多个标准执行路由操作。在我们的日志系统中,我们不只希望订阅基于严重程度的日志......
Moon · 2019-09-19
237阅读 · 0赞赏 · 0问答

2139

LK币

19

粉丝

28

笔记

感谢"区块技术花"

这篇精彩的笔记,目前已经帮助

  • 0
  • 7
  • 1
  • 8
  • 2
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!