クイズ — 残高チェッカー
問い
指定アドレスの 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_balanceは wei をU256で返す、ETH は 10¹⁸ wei、format_etherで表示用変換、f64は精度損失で絶対 NG。
具体例 + ステップで組み立てる
クイズ:残高チェッカー
ゴール:指定したアドレスの ETH 残高がゼロなら true、それ以外なら false を返す関数を書く。
必要な要素
Alloy で既に出会った2つ:
Provider—ProviderBuilder::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 スタックマシンの基本構造へ。