#ethers #ethereum #crypto #celo #web3

ethers-middleware

ethers-rs crate的中间件实现

33个版本 (16个稳定版本)

2.0.14 2024年3月6日
2.0.11 2023年11月16日
2.0.8 2023年7月15日
2.0.2 2023年3月28日
0.2.2 2021年3月3日

#854 in 神奇豆

Download history 34279/week @ 2024-04-10 34592/week @ 2024-04-17 33128/week @ 2024-04-24 28208/week @ 2024-05-01 31404/week @ 2024-05-08 30593/week @ 2024-05-15 28862/week @ 2024-05-22 30175/week @ 2024-05-29 35089/week @ 2024-06-05 36080/week @ 2024-06-12 35154/week @ 2024-06-19 33700/week @ 2024-06-26 29035/week @ 2024-07-03 31583/week @ 2024-07-10 32551/week @ 2024-07-17 28884/week @ 2024-07-24

每月下载量128,155
用于 203 个crate(直接使用9个)

MIT/Apache

1.5MB
34K SLoC

ethers-middleware

您的ethers应用程序通过一个 Provider 抽象与区块链交互。 Provider 是一种特殊的 Middleware 类型,可以与其他中间件组合以获得分层架构。这种方法促进了“开闭原则”、“单一职责”和可组合模式。构建过程以包装的方式发生,从堆栈中的第一个元素 Provider 开始。这个过程继续,新的中间件被推送到分层数据结构之上。

有关更多信息,请参阅 书籍

警告

此库正在弃用中。有关更多信息,请参阅 #2667

可用的中间件

  • Signer:使用私钥或硬件钱包在本地签名交易。
  • Nonce Manager:在本地管理nonce。允许在不等待它们到达mempool的情况下连续签名多个交易。
  • Gas Escalator:在后台提高交易气体价格,以避免交易被卡在内存池中。一个 GasEscalatorMiddleware 支持不同的提升策略(见 GasEscalator)和提升频率(见 Frequency)。
  • Gas Oracle:允许从除 eth_gasPrice 以外的其他地方获取您的气体价格估算,包括基于 REST 的气体站(例如,Etherscan、ETH Gas Station 等)。
  • Transformer:允许拦截和转换将通过代理钱包广播的交易,例如 DSProxy

示例

每个 Middleware 都实现了 MiddlewareBuilder 特性。此特性帮助开发者组合自定义的 Middleware 栈。

以下示例展示了如何从 Provider 开始构建组合的 Middleware

# use ethers_providers::{Middleware, Provider, Http};
# use ethers_signers::{LocalWallet, Signer};
# use ethers_middleware::{gas_oracle::GasNow, MiddlewareBuilder};
let key = "fdb33e2105f08abe41a8ee3b758726a31abdd57b7a443f470f23efce853af169";
let signer = key.parse::<LocalWallet>()?;
let address = signer.address();
let gas_oracle = GasNow::new();

let provider = Provider::<Http>::try_from("https://127.0.0.1:8545")?
    .gas_oracle(gas_oracle)
    .with_signer(signer)
    .nonce_manager(address); // Outermost layer
# Ok::<_, Box<dyn std::error::Error>>(())

可以使用 wrap_into 函数显式地包装 Middleware 层。这在需要推送不是由构建器接口直接处理的 Middleware 时很有用。

# use ethers_providers::{Middleware, Provider, Http};
# use std::convert::TryFrom;
# use ethers_signers::{LocalWallet, Signer};
# use ethers_middleware::{*,gas_escalator::*,gas_oracle::*};
let key = "fdb33e2105f08abe41a8ee3b758726a31abdd57b7a443f470f23efce853af169";
let signer = key.parse::<LocalWallet>()?;
let address = signer.address();
let escalator = GeometricGasPrice::new(1.125, 60_u64, None::<u64>);

let provider = Provider::<Http>::try_from("https://127.0.0.1:8545")?
    .wrap_into(|p| GasEscalatorMiddleware::new(p, escalator, Frequency::PerBlock))
    .wrap_into(|p| SignerMiddleware::new(p, signer))
    .wrap_into(|p| GasOracleMiddleware::new(p, GasNow::new()))
    .wrap_into(|p| NonceManagerMiddleware::new(p, address)); // Outermost layer
# Ok::<_, Box<dyn std::error::Error>>(())

Middleware 栈也可以通过显式包装层手动构建。

# use ethers_providers::{Provider, Http};
# use ethers_signers::{LocalWallet, Signer};
# use ethers_middleware::{
#     gas_escalator::{GasEscalatorMiddleware, GeometricGasPrice, Frequency},
#     gas_oracle::{GasOracleMiddleware, GasCategory, GasNow},
#     signer::SignerMiddleware,
#     nonce_manager::NonceManagerMiddleware,
# };
// Start the stack
let provider = Provider::<Http>::try_from("https://127.0.0.1:8545")?;

// Escalate gas prices
let escalator = GeometricGasPrice::new(1.125, 60u64, None::<u64>);
let provider = GasEscalatorMiddleware::new(provider, escalator, Frequency::PerBlock);

// Sign transactions with a private key
let key = "fdb33e2105f08abe41a8ee3b758726a31abdd57b7a443f470f23efce853af169";
let signer = key.parse::<LocalWallet>()?;
let address = signer.address();
let provider = SignerMiddleware::new(provider, signer);

// Use GasNow as the gas oracle
let gas_oracle = GasNow::new();
let provider = GasOracleMiddleware::new(provider, gas_oracle);

// Manage nonces locally
let provider = NonceManagerMiddleware::new(provider, address);
# Ok::<_, Box<dyn std::error::Error>>(())

依赖关系

~23–39MB
~721K SLoC