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

レッスン1 — Rust:所有権と借用の5分入門

問い

これから Alloy を書き始めると必ず突き当たるのが 所有権(ownership)。Rust 最大の特徴で最初の壁。完璧な理解は不要、「コードを読みながらルールを思い出せる」 状態を目指す。

原理(最小モデル)

  • 所有権 = コンパイル時のメモリ管理. C/C++ は人間が、Java/JS は GC が、Rust はコンパイラが「誰が所有し、いつ解放するか」を検証 → GC なし安全 + 二重解放 / use-after-free 防止 + データ競合防止。
  • 3 ルール. ① 各値には所有者がちょうど 1 人、② 所有者がスコープを抜けると値はドロップ、③ 値はムーブ or 借用される。
  • 借用 &&mut. & = 読み取り(複数同時可)/ &mut = 書き換え(同時に 1 つだけ)= データ競合をコンパイル時に防ぐ。
  • &str = 文字列の借用. String を所有 + その一部を &str として貸す、関数引数 &str は「読み取りで十分、所有権不要」の宣言。
  • Alloy で頻出する 3 パターン. "...".parse()?(文字列パース + エラー伝播)/ provider.get_balance(&address).await?(借用渡し)/ let mut signer = ...(書き換え許可)。

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

Rust:所有権と借用の5分入門

これからAlloyを書き始めると、必ず突き当たるのが 所有権(ownership) である。Rust最大の特徴であり、最初の壁でもある。完璧な理解は不要で、「コードを読みながらルールを思い出せる」 状態を目指す。

1. なぜ所有権が必要なのか

C/C++は人間がメモリ管理を担い、Java/JSはGCが担う。Rustは コンパイル時に「誰が所有し、いつ解放するか」を検証 する第三の道を取る。

そのおかげで、

  • ガベージコレクタなしで安全
  • メモリ二重解放やuse-after-freeがコンパイル時に検出される
  • 並行処理でデータ競合がコンパイル時に検出される

…という「金融資産を扱うコードに適した性質」が得られる。

2. 所有権のルール(3つだけ)

1. 各値には「所有者」がちょうど一人いる
2. 所有者がスコープを抜けると値はドロップ(解放)される
3. 値はムーブ(所有権の移動)か、借用される

3. ムーブ(所有権の移動)

let s1 = String::from("hello");
let s2 = s1;          // 所有権が s1 → s2 へ「ムーブ」
// println!("{}", s1); // ❌ コンパイルエラー:s1はもう使えない
println!("{}", s2);    // OK

4. 借用(&):読み取り専用の参照

書き換えずに見るだけなら、所有権を渡さなくていい:

fn print_addr(addr: &String) {
    println!("{}", addr);
}

let a = String::from("0xABCD...");
print_addr(&a);   // & で「貸す」
print_addr(&a);   // 所有権はaに残ったままなので何度でも貸せる

5. 可変参照(&mut):書き換える参照

fn append_suffix(s: &mut String) {
    s.push_str("...");
}

let mut a = String::from("Hello");
append_suffix(&mut a);

ルール: 同時に存在できるのは、

  • 複数の &(読み取り) OR
  • ただ1つの &mut(書き換え)

このルールで、データ競合はコンパイル時に防がれる。

6. &str は何者なのか

実は &str「文字列の借用」 である。String を所有し、その一部を &str として貸し出すイメージになる。

let owned: String = String::from("Hello, Alloy");
let borrowed: &str = &owned;   // 借用

関数引数で &str を要求するのは、「読み取りで十分で所有権は不要」という宣言である。

7. これからAlloyコードで見るパターン

// 「.parse()?」 → 文字列をパースしてエラーは伝播
let url = "https://eth.llamarpc.com".parse()?;

// 「&」で借用を渡す
provider.get_balance(&address).await?;

// 「mut」で書き換え許可
let mut signer = PrivateKeySigner::random();

これらはすべて所有権ルールに由来する。次のレッスンでAlloyコードを書くときに「これは借用だ」と気づければ十分である。

まとめ

記号意味
x所有
&x借用(読み取り)
&mut x借用(書き換え)
mut x変数を書き換え可にする

所有権の感覚は 書きながら身につける ものなので、いま完璧でなくて大丈夫。次へ進みましょう。

まとめ(3行)

  • 所有権 3 ルール = 各値 1 所有者、スコープ離脱でドロップ、ムーブ or 借用、コンパイル時メモリ管理 = GC なし安全。
  • & 読み取り(複数可)+ &mut 書き換え(1 つだけ)= データ競合防止、&strString の借用。
  • 完璧な理解は不要、「コードを読みながら思い出せる」が目標、次レッスンで Alloy 基本型と署名へ。