レッスン4 — Provider — ノードへ接続する
問い
ここまでの 3 レッスンで Rust と Alloy 型を扱えるようになった。次は Ethereum ノードと話す方法 — Provider がそのインターフェース。HTTP / WebSocket / IPC / Anvil-fork どれでも、同じ trait の同じメソッド で叩ける。
原理(最小モデル)
Providerトレイト. ノードへの RPC クライアント抽象、get_block_number/get_balance/call/send_transaction等の動詞。ProviderBuilder::new().connect_http(url). HTTP 経由のプロバイダを作る、url.parse()?でUrl型に。- Public RPC エンドポイント.
https://ethereum.reth.rs/rpc(rethlab 公式、無料)/https://eth.llamarpc.com(llamarpc)/ Alchemy / Infura(API key 必要)。 - async メソッド.
provider.get_block_number().await?= ネットワーク往復、Tokio ランタイム上で実行。 #[tokio::main].main()を async 化、ランタイム起動 + 最後まで待つ、初心者の boilerplate。
具体例 + ステップで組み立てる
Provider — ノードへ接続する
Alloyの Provider は「ノードへの窓口」である。これを通じてブロック番号・残高・トランザクション情報を取得する。
最小コード — 一字一句そのまま
これは alloy-rs/examples の http.rs をベースにした最小プロジェクトである。
まず Cargo.toml:
[package]
name = "hello_provider"
version = "0.1.0"
edition = "2024"
[dependencies]
alloy = "2.0.5"
alloy-provider = "2.0.5"
eyre = "0.6.12"
tokio = { version = "1", features = ["full"] }
次に src/main.rs:
use alloy::providers::{Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> Result<()> {
let rpc_url = "https://ethereum.reth.rs/rpc".parse()?;
let provider = ProviderBuilder::new().connect_http(rpc_url);
let latest_block = provider.get_block_number().await?;
println!("Latest block number: {}", latest_block);
Ok(())
}
cargo run するとメインネットの最新ブロック番号が表示される。これが監視Botの出発点 になる。
URLに注目: https://ethereum.reth.rs/rpc は Reth プロジェクトが運営する公開RPCエンドポイント である。コードは既に文字通り Reth ノードと通信している。
よく使うProviderメソッド
| メソッド | 役割 |
|---|---|
get_block_number | 最新ブロック番号 |
get_balance(address) | ETH残高 |
get_block(...) | ブロックの詳細 |
get_transaction_by_hash(hash) | トランザクション詳細 |
get_logs(filter) | イベントログの取得 |
任意のEVM互換チェーンに繋ぐ
URLを差し替えるだけで、HyperEVM、Optimism、Anvil(ローカル)などにも接続できる。
let provider = ProviderBuilder::new()
.connect_http("https://api.hyperliquid.xyz/evm".parse()?); // HyperEVM
let provider = ProviderBuilder::new()
.connect_http("http://127.0.0.1:8545".parse()?); // Anvil
ローカルで試すなら Anvil
Foundry に同梱の Anvil を使うと、自分のマシン上でローカルなEthereumノードを立てられます(後で --fork-url を付ければメインネットフォークにもできます)。
anvil
ガス代なしで残高変更や送金を試せるため、学習用途に向く。
次のステップ
これでAlloyの「Read」(読み取り)まで来た。次のモジュールでは、EVMが実際に「動く」中身(スタック、メモリ、Opcode)に踏み込む。
まとめ(3行)
Provider= ノードへの RPC クライアント抽象、HTTP / WebSocket / IPC / Anvil-fork どれでも同じ trait + 同じメソッド。ProviderBuilder::new().connect_http(url)で作成、public RPC はethereum.reth.rs/rpc等、async メソッドで往復。#[tokio::main]で main async 化、次は学んだ要素を組み合わせた残高チェッカークイズ。