FABRKNT
Reth Fundamentals — Alloy で動かす最初の一歩
Alloyを使う
レッスン 5 / 11·QUIZ15 分30 XP
コース
Reth Fundamentals — Alloy で動かす最初の一歩
レッスンの役割
QUIZ
順序
5 / 11

クイズ — 残高チェッカー

問い

指定アドレスの ETH 残高がゼロなら true を返す関数を書く。Provider + get_balance + .await? + Option/Result の組み合わせを 1 関数で使う実践クイズ。Vitalik のアドレスで動作確認。

原理(最小モデル)

  • 関数シグネチャ. async fn is_empty_wallet(provider: &impl Provider, address: Address) -> eyre::Result<bool>
  • &impl Provider. 任意の Provider 実装を受け取れる、トレイト境界によるポリモーフィズム = HTTP / WebSocket / Anvil-fork どれでも。
  • get_balance(address).await?. Future を完了まで待つ + エラー伝播、U256 残高を取り出す。
  • .is_zero(). U256 のゼロ判定慣用表現、balance == 0u64 は型不一致でコンパイルエラー。
  • Wei 単位. get_balanceweiU256 で返す、ETH は 10¹⁸ wei、format_ether で表示用変換、f64 は精度損失で絶対 NG。

具体例 + ステップで組み立てる

クイズ:残高チェッカー

ゴール:指定したアドレスの ETH 残高がゼロなら true、それ以外なら false を返す関数を書く。

必要な要素

Alloy で既に出会った2つ:

  • ProviderProviderBuilder::new().connect_http(url) で作る(Provider レッスン)
  • get_balance(address) — 残高を返す async メソッド

加えて、前の Rust レッスンで扱った ? 演算子async 呼び出しでのエラー伝播:x.await?)。

自分で書いてみる

Rust Playground には Alloy が無いので、ローカルで新規プロジェクト:

cargo new balance-check && cd balance-check

Cargo.toml

[dependencies]
alloy = { version = "1.0", features = ["full"] }
tokio = { version = "1", features = ["full"] }
eyre = "0.6"

src/main.rs に、このシグネチャで関数を書く:

async fn is_empty_wallet(
    provider: &impl Provider,
    address: Address,
) -> eyre::Result<bool> {
    // ここを書く
}

main から呼ぶ:

#[tokio::main]
async fn main() -> eyre::Result<()> {
    let provider = ProviderBuilder::new()
        .connect_http("https://ethereum.reth.rs/rpc".parse()?);

    let vitalik = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045".parse::<Address>()?;
    println!("vitalik empty? {}", is_empty_wallet(&provider, vitalik).await?);

    Ok(())
}

詰まったとき:

  • provider.get_balance(address) は Future を返す — .await? で残高を取り出す
  • 残高の型は U256。「ゼロか?」を聞く慣用メソッドがある — Alloy ドキュメントで探す
  • Result<...> を返す関数なら最後は Ok(...) で包む

cargo run で公開 Reth RPC に問い合わせ、Vitalik のウォレットが空かどうかを返す(空ではない)。

クイズ

まとめ(3行)

  • async fn is_empty_wallet(&impl Provider, Address) -> eyre::Result<bool> + get_balance(addr).await?.is_zero() の 1 行。
  • impl Provider でトレイト境界ポリモーフィズム、is_zero() で U256 のゼロ判定、wei 単位を U256 で扱う(f64 不可)。
  • 次は EVM の中身を覗くモジュール、まず EVM スタックマシンの基本構造へ。