IPC Provider
The IPC (Inter-Process Communication) transport allows our program to communicate with a node over a local Unix domain socket or Windows named pipe.
Using the IPC transport allows the ethers library to send JSON-RPC requests to the Ethereum client and receive responses, without the need for a network connection or HTTP server. This can be useful for interacting with a local Ethereum node that is running on the same network. Using IPC is faster than RPC, however you will need to have a local node that you can connect to.
Initializing an Ipc
Provider
The recommended way of initializing an Ipc
provider is by using the
on_ipc
method on the
ProviderBuilder
with an
IpcConnect
configuration.
//! Example of creating an IPC provider using the `on_ipc` method on the `ProviderBuilder`.
use alloy::providers::{IpcConnect, Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> eyre::Result<()> {
// Set up the IPC transport which is consumed by the RPC client.
let ipc_path = "/tmp/reth.ipc";
// Create the provider.
let ipc = IpcConnect::new(ipc_path.to_string());
let provider = ProviderBuilder::new().on_ipc(ipc).await?;
Ok(())
}
An alternative way of initializing is to use the
on_builtin
method on the
ProviderBuilder
. This method will automatically determine the connection type (Http
, Ws
or Ipc
) depending on the format of the URL. This method is particularly useful if you need a boxed transport.
//! Example of creating an IPC provider using the `on_builtin` method on the `ProviderBuilder`.
use alloy::providers::{Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> eyre::Result<()> {
// Create a provider with the IPC transport.
let provider = ProviderBuilder::new().on_builtin("/tmp/reth.ipc").await?;
Ok(())
}
Example: ipc
Example
To run this example:
- Clone the examples repository:
git clone git@github.com:alloy-rs/examples.git
- Run:
cargo run --example ipc
//! Example of using the IPC provider to get the latest block number.
use alloy::providers::{IpcConnect, Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> Result<()> {
// Set up the IPC transport which is consumed by the RPC client.
let ipc_path = "/tmp/reth.ipc";
// Create the provider.
let ipc = IpcConnect::new(ipc_path.to_string());
let provider = ProviderBuilder::new().on_ipc(ipc).await?;
let latest_block = provider.get_block_number().await?;
println!("Latest block: {latest_block}");
Ok(())
}
Find the source code on Github here.