燃气价格 API
警告
燃气价格策略仅支持传统交易。伦敦分支引入了maxFeePerGas
和maxPriorityFeePerGas
交易参数,这些参数应该尽可能在gasPrice
上使用。
对于以太坊(遗产)交易,气价是一个微妙的属性。因此,Web3 包含了一个用于配置它的 API。
燃气价格 API 允许您定义 Web3 填充燃气价格的行为。这是使用“燃气价格策略”完成的——该方法采用 Web3 对象和一个交易字典,并返回燃气价格(以 wei 为单位)。
检索燃气价格
要使用所选策略检索燃气价格,只需调用 generate_gas_price()
>>> web3.eth.generate_gas_price()
20000000000
制定燃气价格策略
燃气价格策略以 python 方法的形式实施,具有以下特征:
def gas_price_strategy(web3, transaction_params=None):
...
该方法必须返回一个表示汽油价格(单位为魏)的正整数。
为了演示,这里有一个燃气价格策略的基本示例,当交易的价值高于 1 以太网时,该策略返回更高的燃气价格。
from web3 import Web3
def value_based_gas_price_strategy(web3, transaction_params):
if transaction_params['value'] > Web3.toWei(1, 'ether'):
return Web3.toWei(20, 'gwei')
else:
return Web3.toWei(5, 'gwei')
选择燃气价格策略
通过调用 set_gas_price_strategy()
可以设置气价策略。
from web3 import Web3
def value_based_gas_price_strategy(web3, transaction_params):
...
w3 = Web3(...)
w3.eth.set_gas_price_strategy(value_based_gas_price_strategy)
## 可用的燃气价格策略
web3.gas_strategies.rpc.rpc_gas_price_strategy(*web3*, *transaction_params=None*)
调用 JSON-RPC eth_gasPrice 方法,该方法返回由连接的以太坊节点配置的燃气价格。
```py web3.gas_strategies.time_based.construct_time_based_gas_price_strategy(max_wait_seconds, sample_size=120, probability=98, weighted=False)
构建一个策略,该策略将计算燃气价格,使得交易将在由`max_wait_seconds`定义的几秒钟内以由`probability`定义的概率被挖掘。燃气价格是通过对最近开采区块的`sample_size`取样计算出来的。如果`weighted=True`,区块时间将向最近开采的区块加权。
* `max_wait_seconds`挖掘事务所需的最大秒数。
* `sample_size`要采样的最近块的数量
* `probability`在`max_wait_seconds`内挖掘交易的期望概率的整数表示。0 表示 0%,100 表示 100%。
以下是该策略的现成版本。
* `web3.gas_strategies.time_based.fast_gas_price_strategy`:60 秒内挖掘的交易。
* `web3.gas_strategies.time_based.medium_gas_price_strategy`:5 分钟内挖掘的交易。
* `web3.gas_strategies.time_based.slow_gas_price_strategy`:1 小时内挖掘的交易。
* `web3.gas_strategies.time_based.glacial_gas_price_strategy`:24 小时内挖掘的交易。
警告
由于采样最近数据块的开销,建议使用缓存解决方案来减少每次请求需要重新获取的链数据量。
```py
from web3 import Web3, middleware
from web3.gas_strategies.time_based import medium_gas_price_strategy
w3 = Web3()
w3.eth.set_gas_price_strategy(medium_gas_price_strategy)
w3.middleware_onion.add(middleware.time_based_cache_middleware)
w3.middleware_onion.add(middleware.latest_block_based_cache_middleware)
w3.middleware_onion.add(middleware.simple_cache_middleware)