在使用节点的过程中txpool是不可不了解的知识点,交易从发出到被打包都经历了哪些过程?txpool在这个过程中又起到什么作用?今天这篇文章就带大家简单了解一下。 昨天的文章《以太坊如何清除已发出未打包的交易》已经聊到txpool中未被清除的交易如何清除,今天就系统的再聊一聊txpool。 txpool对应的启动参数 我们先来了解一下,针对txpool有哪些参数项可以设置,然后着重分析。 ") --txpool.rejournal value 重新生成本地交易日志的时间间隔 (默认: 1小时) --txpool.pricelimit value 加入交易池的最小的gas价格限制 (默认: 3小时) txpool内容的查看 > txpool.content { pending: {}, queued: {} } 很显然,txpool中由两部分构成pending和queued
/build/bin/geth --help 成功 --txpool.globalqueue value (default: 1024) Maximum number of non-executable transaction slots for all accounts --txpool.globalslots value (default : 5120) Maximum number of executable transaction slots for all accounts --txpool.journal "transactions.rlp") Disk journal for local transaction to survive node restarts --txpool.lifetime (default: 1) Minimum gas price limit to enforce for acceptance into the pool --txpool.rejournal
为本地提交交易禁用价格豁免 --txpool.journal value 本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp") --txpool.rejournal value 重新生成本地交易日志的时间间隔 (默认: 1小时) --txpool.pricelimit value 加入交易池的最小的gas价格限制(默认: 1) --txpool.pricebump value 价格波动百分比(相对之前已有交易) (默认: 10) --txpool.accountslots value 每个帐户保证可执行的最少交易槽数量 (默认: 16) --txpool.globalslots value 所有帐户可执行的最大交易槽数量 (默认: 4096) --txpool.accountqueue value 每个帐户允许的最多非可执行交易槽数量 (默认: 64) --txpool.globalqueue value 所有帐户非可执行交易最大槽数量 (默认: 1024) --txpool.lifetime value 非可执行交易最大入队时间(默认: 3小时) 性能调优的选项 --cache
了解零手续费的交易如何产生,如何被txpool接受,打包了零手续费交易的区块能否被认可,确认上述问题的答案。 0x03 零手续费交易测试 a. into the pool (default: 1) 将其启动时改为0,但节点二的txpool中仍未出现这笔交易。 阅读源码知,此参数确实是控制txpool增加的交易的最低gasPrice,但不能小于1。 虽然这笔交易无法进入其他节点的txpool,但对于含此交易的区块,可以达成共识。 我们将进行简要的源代码分析,支持我们的结论。 通过收集此类0 gasPrice交易并添加至部分矿工的txpool中,当该矿工挖出一个新的区块,这类交易也将会被打包。
下面的更新操作,也达到了包含插入的目的:以替换的手段,从文件删除旧交易,存储新交易到文件 func (pool *TxPool) loop() { ... //输入 func (pool *TxPool) local() map[common.Address]types.Transactions { ... if config.TxPool.Journal ! = "" { config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) } // 初始化交易池 eth.txPool = 赋值给函数变量 addTxs manager.txFetcher = fetcher.NewTxFetcher(txpool.Has, txpool.AddRemotes, fetchTx) } 接收
在这里可以做很多事情——很多人都可以做,并使这个 txpool 业务成为一个竞争激烈的市场。 Txpool API Txpool 是一个特定于 Geth 的 API 命名空间,它在本地内存池中保存待处理和排队的交易。Geth 的默认值为 4096 个待处理交易和 1024 个排队交易。 如果你看到 txpool_status 为空,则可能意味着你的节点尚未完全同步。 txpool 命名空间仅在 Chainstack 专用节点上受支持。 使用‘txpool_content’获取待处理和排队的交易 cURL 创建过滤器 请求体: {"jsonrpc":"2.0","method":"txpool_content","id":1} 响应体 GraphQL 中的查询会遍历 txpool 中的元素。因此,它的限制与上述 txpool 的限制相同。 以下是显示待处理交易信息的示例。
为本地提交交易禁用价格豁免 --txpool.journal value 本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp") --txpool.rejournal value 重新生成本地交易日志的时间间隔 (默认: 1小时) --txpool.pricelimit value 加入交易池的最小的gas价格限制(默认: 1) --txpool.pricebump value 价格波动百分比(相对之前已有交易) (默认: 10) --txpool.accountslots value 每个帐户保证可执行的最少交易槽数量 (默认: 16) --txpool.globalslots value 所有帐户可执行的最大交易槽数量 (默认: 4096) --txpool.accountqueue value 每个帐户允许的最多非可执行交易槽数量 (默认: 64) --txpool.globalqueue value 所有帐户非可执行交易最大槽数量 (默认: 1024) --txpool.lifetime value 非可执行交易最大入队时间(默认: 3小时) 性能调优的选项: ––cache
(chain, accounts, txPool, newBlockCh) // ... c, accountManager: accountManager, txPool: txPool, numWorkers: *protocol.TxPool numWorkers uint64 started bool discreteMining block, err := mining.NewBlockTemplate(m.chain, m.txPool, m.accountManager) // ... // *protocol.TxPool, accountManager *account.Manager) (b *types.Block, err error) { // ...
主要包含对区块链进行访问和交互相关的方法; net:主要包含查看 p2p 网络状态的方法; admin:主要包含与管理节点相关的方法; miner:主要包含挖矿相关的一些方法; personal:包含账户管理的方法; txpool 获取区块信息; miner.start():开始挖矿; miner.stop():停止挖矿; web3.fromWei():Wei 换算成以太币; web3.toWei():以太币换算成 Wei; txpool.status
(default: 5120) Maximum number of executable transaction slots for all accounts --txpool.journal "transactions.rlp") Disk journal for local transaction to survive node restarts --txpool.lifetime (default: 3h0m0s) Maximum amount of time non-executable transaction are queued --txpool.locals Comma separated accounts to treat as locals (no flush, priority inclusion) --txpool.nolocals (default: 1) Minimum gas price limit to enforce for acceptance into the pool --txpool.rejournal
web3)之外,geth还提供了以下额外的管理API名称空间: admin:Geth节点管理 debug:Geth节点调试 miner:矿工和DAG管理 personal: 帐户管理 txpool x19Ethereum Signed Message:\n" + len(message) + message)))"计算sign签名 personal_ecRecover 功能介绍:反解地址 Txpool 模块 TxPool API允许您访问几个非标准的RPC方法,以检查包含当前所有挂起事务的事务池的内容以及排队等待将来处理的事务池的内容。 txpool_content 功能介绍:查询Content Inspection属性,以列出当前待包含在下一个块中的所有事务的确切详细说明信息以及仅计划将来执行的事务的详细说明信息 详细说明:结果是一个对象 ,这些批本身就是将nonce与实际事务关联起来的映射,请注意可能有多个事务与同一帐户和随机数关联,如果用户广播多个具有不同天然气配额(甚至完全不同的交易)的多个许可证就会发生这种情况 执行示例: txpool_inspect
GlobalSlots: 4096, AccountQueue: 64, GlobalQueue: 1024, Lifetime: 3 * time.Hour, } TxPool 数据结构如下所示: // TxPool contains all currently known transactions. Transactions move between those // two states over time as they are received and processed. type TxPool ): // Create the transaction pool with its initial settings pool := &TxPool{ config: func (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction, local bool, addAll bool) (bool
eth":"1.0", "miner":"1.0", "net":"1.0", "personal":"1.0", "shh":"1.0", "txpool 、shh、web3),Geth提供了以下额外的管理API命名空间: admin:Geth节点管理 debug:Geth节点调试 miner:挖矿和有向无环图(DAG)管理 personal:账户管理 txpool lockAccount:锁定账户 newAccount:创建新账户 unlockAccount:解锁账户 sendTransaction:发送交易 sign:签名 ecRecover:提取签名中的发起方地址 txpool txpool系列的API提供一组非标RPC方法,可用来审视包含所有待定及排队交易的交易池中的内容。
--txpool.lifetime value Maximum amount of time non-executable transaction are queued (default: 3h0m0s ) 我们知道队列是存在于txpool里面的,不指定此参数值时,默认为3小时失效。 那么,解决问题的方案就显而易见了,我们可以将此参数设置较小,然后重启参数,等待失效,等待txpool中交易失效之后,再改会此参数正常值,再重启项目即可。
= nil { cmn.Exit(cmn.Fmt("Failed to start switch: %v", err)) } // 初始化交易池 txPool := protocol.NewTxPool () chain, err := protocol.NewChain(store, txPool) if err ! bc.Hash, maxNewBlockChSize) // 初始化网络节点同步管理 syncManager, _ := netsync.NewSyncManager(config, chain, txPool miningEnable: config.Mining, } // 初始化挖矿 node.cpuMiner = cpuminer.NewCPUMiner(chain, accounts, txPool , newBlockCh) node.miningPool = miningpool.NewMiningPool(chain, accounts, txPool, newBlockCh) node.BaseService
接口层 接口层包括交易池(TxPool)、区块链(BlockChain)和区块执行器(BlockVerifier)三个模块。 · 交易池(TxPool): 与网络层以及调度层交互,负责缓存客户端或者其他节点广播的交易,调度层(主要是同步和共识模块)从交易池中取出交易进行广播或者区块打包; · 区块链(BlockChain): Sealer线程从交易池(TxPool)取交易,并打包成新区块;Engine线程执行共识流程,共识过程会执行区块,共识成功后,将区块以及区块执行结果提交到区块链(BlockChain),区块链统一将这些信息写入底层存储 2 整体架构 整体架构如下图所示: Node:区块节点 TxPool:交易池,节点自身维护的、用于暂存收到的交易的内存区域 Sealer:打包器 Consensus Engine:共识引擎 BlockVerifier 节点收到交易后,若当前交易池未满则将交易附加至TxPool中并向自己所连的节点广播该交易;否则丢弃交易并输出告警。
/passwd –networkid 112233 –datadir “jhdata” –http –http.api “admin,debug,web3,eth,txpool,personal,ethash /passwd –networkid 112233 –datadir “jhdata” –http –http.api “admin,debug,web3,eth,txpool,personal,ethash /passwd –networkid 112233 –datadir “jhdata” –http –http.api “admin,debug,web3,eth,txpool,personal,ethash
--http --http.port "8545" --http.addr "192.168.204.139" --nodiscover --http.api "eth,net,web3,admin,txpool --http --http.port "8545" --http.addr "192.168.204.139" --nodiscover --http.api "eth,net,web3,admin,txpool 查看已提交但还未被处理的交易,pending表示已提交但还未被处理的交易: txpool.inspect.pending 查看当前待确认交易: eth.getBlock("pending",true ).transactions 为了完成交易我们需要再次挖矿,之后再次看交易信息: miner.start(100) miner.stop() txpool.status 之后我们查看已提交但还未被处理的交易 ,目前没有已提交但还未被处理的交易 txpool.inspect.pending //查看已提交但是未被处理的交易,发现为空 eth.getBlock("pending",true).transactions
交易已经提交到区块链,返回了交易的hash,但还未被处理,这可以通过查看txpool来验证: txpool.status { pending: 0, queued: 0 } 7,查看区块里面的交易信息
syncManager, _ := netsync.NewSyncManager(config, chain, txPool, newBlockCh) // ... } 在创建SyncManager 的时候,又创建了Switch: netsync/handle.go#L42 func NewSyncManager(config *cfg.Config, chain *core.Chain, txPool *core.TxPool, newBlockCh chan *bc.Hash) (*SyncManager, error) { // ... protocolReactor := NewProtocolReactor(chain, txPool, manager.sw, manager.blockKeeper, manager.fetcher