{"content":{"title":"挂起(pending)和排队(queued)交易的解释","body":"## 概述\r\n\r\n以太坊网络每天处理超过一百万个交易。这些交易源自希望转移以太币或与智能合约进行交互的用户。在本指南中，我们将教你有关以太坊网络上交易的待处理（Pending）和排队（Queued）状态。我们还将演示如何通过 Python 和 [Web3.py](https://web3py.readthedocs.io/en/stable/) 以编程方式请求数据，利用我们的快速节点（QuickNode）端点作为与以太坊网络通信的基础设施。\r\n\r\n**我们将做什么**：\r\n\r\n- 定义待处理和排队交易\r\n\r\n- 使用快速节点（QuickNode）设置以太坊节点\r\n\r\n- 编写 Python 代码以检索待处理和排队交易数据\r\n\r\n\r\n**你需要什么：**\r\n\r\n- [对交易的基本理解](https://learnblockchain.cn/article/11470)\r\n- 在你的机器上安装 Python（版本 3.6+）和 Pip\r\n- 一个文本编辑器\r\n- 终端\r\n\r\n## 待处理交易与排队交易的区别\r\n\r\n以太坊上的交易由不同的组件组成，例如加密签名（源自发送者的私钥）、一组指令、要广播的节点以及将给矿工的费用。一旦交易被广播到网络，它可能会根据交易中使用的 nonce 字段的值进入两种不同的状态。这些状态分为以下类别：\r\n\r\n**待处理（Pending）** \\- 可被处理并包含在下一个区块中的交易。\r\n\r\n**排队（Queued）** \\- 无法包含在下一个区块中的不按序交易。\r\n\r\n交易必须包含一个 nonce。交易中的 nonce 值由发送者设置，它允许对交易进行排序，同时防止重放攻击。从一个账户提交的所有交易必须遵循其 nonce 顺序，以放入待处理交易状态。\r\n\r\n例如，假设一个账户发送其第一个交易，并将其 nonce 设置为 0。该账户发送的第二个交易应包含 nonce 值 1。发送的第三个交易应具有 nonce 值 2，依此类推，每个交易递增 _1_。在提交多个交易的情况下，如果第一个交易（即 nonce=0）仍在待处理状态，则来自发送账户的其余交易（具有 nonce 为 1 及更大的交易）将处于排队状态，直至第一个交易被处理。\r\n\r\n另外，如果一个账户意外发送了带有不按序的 nonce 的交易，该交易将在排队状态，直到用正确的 nonce 替换该交易或提交并优先处理包含缺失 nonce 的另一个交易。\r\n\r\n交易可以处于排队状态的两个原因是：\r\n\r\n1. 可能存在需要先处理的待处理交易。\r\n\r\n2. 该交易已提交且具有不按序的 nonce。\r\n\r\n\r\n现在我们已经对交易及其不同状态有了理论理解，我们将演示如何使用 Web3.py 和 Python 程序化地查看它们。\r\n\r\n设置你的快速节点（QuickNode）以太坊端点\r\n\r\n为了演示如何查看待处理和排队交易，我们可以使用以太坊客户端，如 Geth 或 OpenEthereum（前称为 Parity）。因为这对于仅查看交易而言过于复杂，我们将使用来自 QuickNode 的免费端点来简化此过程。要获取免费的以太坊节点，请导航到 [QuickNode](https://www.quicknode.com/signup?utm_source=internal&utm_campaign=guides&utm_content=pending-and-queued-transactions-explained) 并注册！创建免费以太坊端点后，复制你的 HTTP 提供程序端点：\r\n\r\n![快速节点以太坊端点的截图](https://img.learnblockchain.cn/2025/02/28/0-c74dcf8c492328bc5920d91a6f5f6dea.png)\r\n\r\n## 检索待处理和排队交易\r\n\r\n现在我们已准备好以太坊节点，可以开始编写代码从以太坊区块链中检索数据。\r\n\r\n首先，我们将在终端打开并运行以下命令以创建新的项目目录并导航到该目录中：\r\n\r\n然后通过运行以下命令创建一个空的 Python 文件：\r\n\r\n接下来，安装运行我们 Python 项目所需的依赖项：\r\n\r\n现在我们完成了项目设置，打开 main.py 文件并添加以下代码：\r\n\r\n```\r\nfrom web3 import Web3, HTTPProvider\r\n\r\nprovider_url = \"YOUR_QUICKNODE_NODE_URL\"\r\nprovider = Web3.HTTPProvider(provider_url)\r\n\r\ntxpool_data = provider.make_request('txpool_content', [])\r\nfirst_queued_address =  list(txpool_data['result']['queued'].keys())[0]\r\nfirst_queued_transaction = txpool_data['result']['queued'][first_queued_address]\r\nprint(\"排队交易： \", [i for i in first_queued_transaction.items()])\r\n\r\n```\r\n\r\n\r\n\r\n_注意：你可以将单词 queued 替换为 pending，以查看待处理交易。_\r\n\r\n对上面代码的快速解释：\r\n\r\n_行 1:_ 导入依赖\r\n\r\n_行 3:_ 将我们的 QuickNode 端点 URL 存储在名为 _provider\\_url_ 的变量中。\r\n\r\n_行 4:_ 使用我们的变量 _provider\\_url_ 创建一个 Web3 HTTPProvider 对象。\r\n\r\n_行 6:_ 我们使用我们的提供程序调用 txpool\\_content RPC 方法。\r\n\r\n_行 8:_ 声明一个变量 _first\\_queued\\_address_，将存储排队交易数组中第一个 _from_ 地址。\r\n\r\n_行 9:_ 将排队交易数组中的第一个交易对象存储在名为 _first\\_queued\\_transaction_ 的变量中。\r\n\r\n_行 11:_ 使用列表解析和打印语句查看排队数组中的第一个交易对象。\r\n\r\n上述 Python 脚本中使用的 _Txpool\\_content_ RPC 端点允许我们从以太坊主网检索排队和待处理交易。关于我们请求数据的端点的更多信息在这里找到：\r\n\r\n- [Txpool\\_content RPC 方法](https://www.quicknode.com/docs/ethereum/txpool_content)\r\n\r\n\r\n保存文件并导航回终端，运行以下命令：\r\n\r\n```\r\npython3 main.py\r\n\r\n```\r\n\r\n代码执行完成后，你将看到打印语句显示排队交易。我们的代码限制了每个数组中排队交易的显示为一条记录，因为显示所有内容可能需要额外的计算工作：\r\n\r\n![包含排队交易数据的日志](https://img.learnblockchain.cn/2025/02/28/1-9850a2c141dc01b6c4c6daa98452dedf.png)\r\n\r\n要验证交易是否排队，你可以复制上面哈希字段中的交易哈希，并在 [Etherscan](https://etherscan.io/) 上搜索它：\r\n\r\n![在 Etherscan 上搜索交易哈希](https://img.learnblockchain.cn/2025/02/28/2-03e2fbd3c86f3587ba22a8ac4180d5a1.png)\r\n\r\n从我们的 Python 脚本检索的交易数据与 Etherscan 上显示的数据相匹配。我们可以将此交易归类为智能合约交易，因为交易的接收者是智能合约地址，并且数据字段用于调用合约的 _approve_ 函数。注意交易的 nonce 为 9；这条信息在下一步中将有用。\r\n\r\n![查看排队订单的交易详情](https://img.learnblockchain.cn/2025/02/28/3-ed8a0087736d7b4e0b16e2645f6a884f.png)\r\n\r\n要找出为什么上面的交易处于排队状态，我们可以检查该 _from_ 地址的交易活动。如果发送者没有其他待处理交易，则排队状态很可能是由于 nonce 不正确。如果发送者有待处理的交易，则该交易很可能由于其他待处理交易等待先处理而处于排队状态。\r\n\r\n![要找出为什么上面的交易处于排队状态，我们可以检查该 _from_ 地址的交易活动。如果发送者没有其他待处理交易，则排队状态很可能是由于 nonce 不正确。如果发送者有待处理的交易，则该交易很可能由于其他待处理交易等待处理而处于排队状态。](https://img.learnblockchain.cn/2025/02/28/4-93bffde60ed6c6e79417c5c4ad47636c.png)\r\n\r\n经过进一步研究，我们可以得出结论，交易之所以排队，是因为同一账户的另一个交易的 nonce 较低且仍在待处理。处理 nonce 为 8 的交易后，下一个排队交易（即 nonce 为 9）将转变为待处理状态。\r\n\r\n## 结论\r\n\r\n现在你知道如何区分以太坊上的待处理交易和排队交易。此外，我们还演示了如何使用 Python 和 Web3.py 请求待处理和排队交易。\r\n\r\n订阅我们的 [通讯](https://go.quicknode.com/newsletter)，获取更多关于以太坊的文章和指南。如果你有任何反馈，请随时通过 [Twitter](https://twitter.com/QuickNode) 联系我们。你可以随时在我们的 [Discord](https://discord.gg/quicknode) 社区服务器与我们聊天，在那里你会遇到一些最酷的开发者 :)\r\n\r\n>- 原文链接： [quicknode.com/guides/eth...](https://www.quicknode.com/guides/ethereum-development/transactions/pending-and-queued-transactions-explained)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/25306","address":null},"history":null,"timestamp":1740740298,"version":1}