文章详细介绍了如何使用Python中的Web3.py库估算以太坊交易中的gas价格。内容包括gas的基本概念、为什么需要估算gas、Web3.py的安装和配置,以及通过待处理交易来估算gas价格的Python代码示例。
更新于
2025年1月30日
所有 以太坊 Gas Web3.py Python 市场附加功能 Gas 估算 API
在此页面
6分钟阅读
本指南将为你提供如何使用 Python 通过待处理交易估算 gas 价格的深入讲解。如果你希望更快地完成这一任务并将繁重的工作交给我们,我们建议你使用Gas 估算 API 附加功能。通过使用 Gas 估算 API,你可以改善工作流程,避免手动编写自定义脚本从内存池中提取 gas 价格。
在以太坊网络上发送交易,你需要支付费用以将交易包含在区块中以及交易所需的计算;此费用称为 gas。交易根据它们附带的 gas 量被接受到区块中,因此能够查看当前的 gas 价格是一项有利的能力。 本指南将介绍如何使用 Python 中的 Web3Py 库通过待处理交易估算 gas 价格。
前提条件
你的系统上安装了 Python(版本 3.6 及以上)和 Pip3。
一个文本编辑器。
Gas 是衡量执行特定操作所需计算努力的单位。大多数运行在 EVM(以太坊虚拟机)上的智能合约都是用 Solidity 编写的。每行代码或每个 Solidity 函数在执行时都需要 gas。
下图源于以太坊黄皮书。它大致说明了特定指令可能花费多少 gas。
 图片来源:以太坊黄皮书
因此,gas 费用是用户支付的补偿以太坊网络在其交易中使用的计算能量的费用。打个比方,驾驶一辆汽车在一定距离 A 上需要一定量的 gas/Gas B。同样,发送一定量的 ETH 或发送智能合约 A 需要一定量的费用(gas) B。
收取 gas 费用也防止了以太坊网络上的滥用行为,例如网络垃圾信息泛滥。它还鼓励开发人员编写更高效的代码以避免高昂的计算操作和无限循环。
Gas 以 Gwei(GigaWei 的缩写)为单位进行计量 - 它是以太坊网络中使用的货币以太(ETH)的一个子单位(1,000,000,000 Gwei = 1 ETH)。设置一个独立单位有助于区分货币 ETH 的估值和使用 EVM 的计算成本。
我们为什么要估算 gas?因为在现在的情况下,矿工选择哪些交易被挖入区块。矿工如何选择将哪些交易放入区块?他们往往选择包括最多 gas 的交易。为什么他们选择包含最多 gas 的交易?因为矿工可以保留包含在交易中的 gas 费用。通常情况下,gas 低于当前平均 gas 的交易可能会花很长时间才能被确认,甚至在最坏的情况下被矿工丢弃。
所以,如果我们支付很多 gas,我们的交易会被包含。如果我们支付的 gas 不够,我们的交易可能会被丢弃。但我们应该支付多少 gas 来激励矿工呢?这就是 gas 估算要发挥作用的地方。
为了更好地理解 gas 和 gas 价格的估算,我们来给它们一些正式的定义:
Gas:衡量在 EVM 上执行特定操作的计算成本的单位。例如 - 我可以包含 25000 gas 来完成某个交易。
Gas Limit:用户愿意为执行该操作支付的最大 gas 数量(最低为 21000)。
Gas Price:用户愿意在每个 gas 单位上花费的 Gwei 数量。
我们想确定什么 gas 价格是平均的,然后为我们的交易包含稍高一点的 gas 价格。我们不太关心 gas 限制或发送的 gas;只要它们足够高,我们会退还未使用的 gas。
现在,让我们尝试估算一次简单的 ETH 转移交易的 gas。我们通过查看待处理交易来获得 gas 的实际估算。
我们的第一步是检查系统上是否安装了 Python 3.6 或更高版本; 你可以在终端/命令提示符中输入以下内容来检查 Python 是否已安装:
$ python --version
如果未安装,你可以遵循Python 官方网站的下载页面上的说明进行安装。
我们将使用 Web3.py,这是一个用于与以太坊交互的 Python 库。我们将使用 PIP 安装 Web3.py。在终端/命令提示符中键入以下内容:
$ pip install web3
注意: Python 和其他库的版本可能导致常见安装问题。因此,如果你遇到任何问题,请尝试设置虚拟环境并进行故障排除 web3.py 的安装。
如果一切正常,Web3.py 将安装到你的系统中。如果你想查看 Web3.py 还可以做些什么,可以查看我们关于如何使用 Web3.py 连接到以太坊和如何使用 Web3.py 生成新以太坊地址的指南的指南。
对于我们今天的目的,我们几乎可以使用任何支持内存池的以太坊客户端,例如 Geth 或 OpenEthereum(前 Parity)。由于这对估算 gas 来说稍显复杂,因此我们可以在这里设置一个免费的 QuickNode 帐户,并轻松生成一个以太坊端点。创建免费以太坊端点后,复制你的 HTTP Provider 端点:
你将稍后需要此信息,因此请复制并保存。
我们要做的第一件事是简单估算发送交易所需的 gas 数量。创建一个名为 gas.py 的 python 文件,并将以下代码复制粘贴到其中。这是一个有关 ETH 转移交易的估算 gas 示例。
from web3 import Web3, HTTPProvider
web3 = Web3(HTTPProvider("ADD_YOUR_ETHEREUM_NODE_URL"))
estimate = web3.eth.estimateGas({'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601', 'from': '0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE', 'value': 145})
print("Gas estimate is: ", estimate)
简化调试的日志
你现在可以访问 RPC 端点的日志,更有效地帮助你解决问题。如果你在 RPC 调用中遇到问题,只需查看 QuickNode 仪表板中的日志,即可快速识别和解决问题。了解有关日志历史限制的更多信息,请访问我们的定价页面。
那么继续,将 ` ADD_YOUR_ETHEREUM_NODE_URL ` 替换为上面部分的 http provider。
上述代码的解释:
第 1 行:导入 web3 和 HTTPProvider。
第 2 行:设置我们的节点 URL。
第 3 行:使用 estimateGas 函数估算 ETH 转移交易的 gas。
第 4 行:打印估算值。
现在,运行你的 Python 脚本:
python gas.py
它应该看起来是这样的。
上述实例估算并没有实际告诉我们应该为交易支付多少 gas 价格。让我们通过查看我们以太坊节点的待处理交易来获取我们愿意支付的 gas 价格的衡量。
创建一个名为 gas_pt.py 的 Python 文件,并将以下代码复制粘贴到其中。
from web3 import Web3, HTTPProvider
import statistics
web3 = Web3(HTTPProvider("ADD_YOUR_ETHEREUM_NODE_URL"))
pending_transactions = web3.provider.make_request("parity_pendingTransactions", [])
gas_prices = []
gases = []
for tx in pending_transactions["result"[:10]]:
gas_prices.append(int((tx["gasPrice"]),16))
gases.append(int((tx["gas"]),16))
print("Average:")
print("-"*80)
print("gasPrice: ", statistics.mean(gas_prices))
print(" ")
print("Median:")
print("-"*80)
print("gasPrice: ", statistics.median(gas_prices))
继续,将 ` ADD_YOUR_ETHEREUM_NODE_URL ` 替换为上面部分的 http provider。
上述代码的解释:
第 1 行:导入 web3 和 HTTPProvider。
第 2 行:导入 Statistics 包。
第 3 行:设置我们的节点 URL。
第 4 行:获取待处理交易并将其存储到数组中,然后赋值给 pending_transactions 变量。
第 5-6 行:创建 gas_prices 和 gases 数组。
第 7-9 行:从 pending_transactions 的结果数组中获取前十个(交易)元素,并将 gasPrice 的值添加到 gas_prices 数组中,即将其从十六进制转换为十进制后进行添加,并将 gas 的值添加到 gases 数组中,同样进行转换。
第 11-12 行:打印字符串 “Averages:” 以及 80 个破折号以获得清晰输出。
第 13 行:打印平均 gas 价格,字符串为 “gasPrice:” 通过获取保存在 gas_prices 数组中的 gasPrice 值的均值来获得。
第 14 行:打印一个空格。
第 15-16 行:打印字符串 “Median:” 以及 80 个破折号以获得清晰输出。
第 17 行:打印中位数 gas 价格,字符串为 “gasPrice:” 通过获取保存在 gas_prices 数组中的 gasPrice 值的中位数来获得。
现在,运行 Python 脚本。
$ python gas_pt.py
如果代码成功执行,结果应该类似如下。由于首先需要获取待处理交易(可能数量较多),然后查询它们,因此可能需要一些时间才能完全执行代码。
你可以在上述图像中看到平均和中位数 gas 及其价格。
现在你知道如何估算 gas 及其价格,请确保在 sendTransaction 函数之前估算 gas 成本或估算部署智能合约的成本。查看如何使用 JavaScript 在较高 gas 值下重新发送交易的示例。
订阅我们的时事通讯,获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过Twitter与我们联系。你也可以随时在我们的Discord社区服务器上与我们交谈,那里有一些有趣的开发者等着你 :)
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!