LAN ETH 構築手順 / Documents (2025/11/27版)

ローカル LAN 上に Ethereum (Geth / Clique PoA) を構築し、トランザクション等をテストするための覚え書きです。

はじめに

このページは、Ethereum ネットワークを LAN 上に構築し、 ブロック生成やトランザクションのテストを行うためのメモです。

一般向けとしては難解な部分があるかもしれません。 もっとわかりやすく解説した改訂版の作成も予定しています。

- author : T.Otsubo ( Jagaemon & Company 2025 ) -

目的

Ethereum ネットワークを LAN で構築し、 ブロック生成ノードやトランザクション等のテストを行い原理を理解する。

環境・前提条件

事前準備

Geth のダウンロードとインストール

Geth を環境変数 Path に登録

例として、Geth を C:\Program Files\geth にインストールした場合:

  1. コントロールパネル → 「システム」 → 「詳細情報」 → 「システムの詳細設定」
  2. 「詳細設定」タブ → 「環境変数」ボタン
  3. 「Path」を選択して「編集」→「新規」
  4. C:\Program Files\geth を追加 → OK で閉じる

ポート 30303/TCP を開放

  1. Windows Defender ファイアウォール → 「受信の規則」 → 「新しい規則」
  2. 種類「ポート」 → TCP / 「特定のローカルポート」→ 30303
  3. 適切な名前(例:Geth 30303 TCP)を付けて保存
  4. 「送信の規則」側も同様に設定(念のため)

IP アドレスの固定割り当て(例)

Python / web3.py

セキュリティ上、実運用環境では パスワードや秘密鍵・ニーモニックをファイル内に平文保存しない ことを強く推奨します。 このドキュメントはあくまでローカル LAN テスト用の例です。

ノード構成とアカウント作成

ノード構成

各 PC を以下のように役割分担します(「ノード」と同義)。

ディレクトリ作成例(PC5)

例:C ドライブにデータディレクトリを作成する場合:

C:\eth_lan_pc5

他のドライブを使いたい場合は、D:\eth_lan_pc5 など任意のパスで問題ありません。

パスワードファイルの作成(PC5 の例)

PowerShell で以下を実行します。

# 任意のパスワードを設定する(例: "your_password_here")
Set-Content -Path C:\eth_lan_pc5\password.txt -Value 'your_password_here' -NoNewline -Encoding ascii

# password.txt が生成される
公開環境にこのページを載せる場合は、実際に使用しているパスワード文字列や秘密鍵を絶対に掲載しない でください。 上記はあくまで「サンプル」です。

ノードアカウント作成

geth account new --datadir C:\eth_lan_pc5\data --password C:\eth_lan_pc5\password.txt

実行するとアカウントアドレスが生成されて表示されます(例):

0x1a929b99d.....省略.....4A62aDA6264

アカウントの一覧を確認してメモしておきます。

geth account list --datadir C:\eth_lan_pc5\data

上記の手順を PC1 〜 PC4 でも同様に実行します。

genesis.json の作成(Clique PoA)

以下は PC2(validatorノード)での作業例です。

genesis.json は「Clique 用の標準 genesis テンプレート」を元に作成し、 必要な値を埋め込んでいきます。

初期テンプレート例

{
  "config": {
    "chainId": 1234,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "difficulty": "1",
  "gasLimit": "8000000",
  "alloc": {}
}

alloc(初期残高付与)の例

"alloc": {
  "0x2ce81f-----省略-----ea7c685": {
    "balance": "0x3635c9adc5dea00000"
  }
}

ここでは PC2 の signer アカウント(最初に PC2 で account new して作成したアドレス)に 初期資金を付与し、validatorとして登録しています。

extraData(Clique 署名者の埋め込み)

Clique PoA では extraData の中央部分に「署名者一覧」を入れます。

"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000
               2ce81f42.....省略.....61ea7c685
               000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

この中央の 2ce81f4... が PC2 の signer アドレス (=最初の Clique 署名者)です。

Clique 用 genesis.json のポイント

上記をすべて整えて、PC2 の例では:

C:\eth_lan_pc2\genesis.json

として保存します。この genesis.json が LAN チェーンの起点になります。

重要:
PC2 の genesis.json は必ず PC1 および PC3〜PC5 にコピーして、 全ノードで同一の genesis を使用 してください。

例:

(PC2) C:\eth_lan_pc2\genesis.json
   → (PC4) C:\eth_lan_pc4\genesis.json

各ノードの初期化

データディレクトリのドライブが PC によって異なる場合があるので注意してください。

# PC1 の data ディレクトリ初期化
geth --datadir D:\eth_lan_pc1 init D:\eth_lan_pc1\genesis.json

# PC2 の data ディレクトリ初期化
geth --datadir D:\eth_lan_pc2 init C:\eth_lan_pc2\genesis.json

# PC3 の data ディレクトリ初期化
geth --datadir D:\eth_lan_pc3 init D:\eth_lan_pc3\genesis.json

# PC4 の data ディレクトリ初期化
geth --datadir C:\eth_lan_pc4 init C:\eth_lan_pc4\genesis.json

# PC5 の data ディレクトリ初期化
geth --datadir C:\eth_lan_pc5 init C:\eth_lan_pc5\genesis.json

各ノードの起動(手動操作)

以下を各 PC の PowerShell にコピペしてノードを起動します。

PC1 用起動コマンド(BOOT ノード)

geth --datadir D:\eth_lan_pc1 ^
  --networkid 1234 ^
  --port 30303 ^
  --nat extip:192.168.1.2 ^
  --http --http.addr "0.0.0.0" --http.port 8545 ^
  --http.api eth,net,web3,admin,clique ^
  console

PC2 用起動コマンド(validator)

geth --datadir D:\eth_lan_pc2 ^
  --networkid 1234 ^
  --port 30303 ^
  --nat extip:192.168.1.3 ^
  --http --http.addr "0.0.0.0" --http.port 8545 ^
  --http.api eth,net,web3,admin,clique,miner,personal ^
  --mine ^
  --miner.etherbase 0x2ce81f4.....省略.....861ea7c685 ^
  --unlock         0x2ce81f4.....省略.....861ea7c685 ^
  --password D:\eth_lan_pc2\password.txt ^
  --allow-insecure-unlock ^
  --verbosity 3 ^
  console

PC3 用起動コマンド(クライアント)

geth --datadir D:\eth_lan_pc3 ^
  --networkid 1234 ^
  --port 30303 ^
  --nat extip:192.168.1.4 ^
  --http --http.addr "0.0.0.0" --http.port 8545 ^
  --http.api "eth,net,web3,admin,clique" ^
  --unlock 0xeba0.....省略.....a2624ee7.....省略.....7b530b09537 ^
  --password D:\eth_lan_pc3\password.txt ^
  --allow-insecure-unlock ^
  console

PC4 用起動コマンド(クライアント)

geth --datadir C:\eth_lan_pc4 ^
  --networkid 1234 ^
  --port 30303 ^
  --nat extip:192.168.1.5 ^
  --http --http.addr "0.0.0.0" --http.port 8545 ^
  --http.api "eth,net,web3,admin,clique" ^
  --unlock 0x7f247f.....省略.....614a7a030cf920 ^
  --password C:\eth_lan_pc4\password.txt ^
  --allow-insecure-unlock ^
  console

PC5 用起動コマンド(クライアント)

geth --datadir C:\eth_lan_pc5 ^
  --networkid 1234 ^
  --port 30303 ^
  --nat extip:192.168.1.6 ^
  --http --http.addr "0.0.0.0" --http.port 8545 ^
  --http.api "eth,net,web3,admin,clique" ^
  --unlock 0x1a929b.....省略.....1684A62aDA6264 ^
  --password C:\eth_lan_pc5\password.txt ^
  --allow-insecure-unlock ^
  console
--allow-insecure-unlock はテスト用途のオプションです。 インターネットに公開される環境では使用しないでください。

Python からのノード接続と同期

各ノードを Python から P2P 接続し同期させるために、例として以下のスクリプトを使用します。

PC1 の PowerShell でスクリプトのあるディレクトリへ移動し、次を実行:

python connect_peers3.py

これで各 PC の起動 & 同期が完了します。

残高確認

Python スクリプトによる残高確認

PC1 の PowerShell だけで全 PC の残高照会ができます。

実行:

python list_balances.py

全 PC のアドレスと残高一覧が表示されます。

geth コンソールからの手動確認例

PC1 は BOOT 専用なので残高確認は省略可能です。

PC3 の残高確認例:

web3.fromWei(eth.getBalance("0xeba01b.....省略.....530b09537"), "ether")

PC4 の残高確認例:

web3.fromWei(eth.getBalance("0x7f24fa.....省略.....4a30cf920"), "ether")

PC5 の残高確認例:

web3.fromWei(eth.getBalance("0x1a929b.....省略.....62aDA6264"), "ether")

送金テスト

Python スクリプトによる送金テスト

PC1 の PowerShell から、全 PC 間の送金を行うことができます。

PC2 → PC3 に 3 ETH 送金:

python send_eth_pk2.py --from-node pc2 --to-node pc3 --amount 3

PC3 → PC4 に 1.5 ETH 送金:

python send_eth_pk2.py --from-node pc3 --to-node pc4 --amount 1.5

PC5 → PC3 に 0.1 ETH 送金:

python send_eth_pk2.py --from-node pc5 --to-node pc3 --amount 0.1

geth コンソールからの手動送金例

PC2 → PC3 へ送金:

eth.sendTransaction({
  from:  "0x2ce81f42.....省略.....30861ea7c685",
  to:    "0xeba01b50.....省略.....3fa2b27b530b09537",
  value: web3.toWei(3, "ether")
});

PC2 → PC4 へ送金:

eth.sendTransaction({
  from:  "0x2ce81f42.....省略.....30861ea7c685",
  to:    "0x7f247fa4.....省略.....891614a7a030cf920",
  value: web3.toWei(3, "ether")
});

PC2 → PC5 へ送金:

eth.sendTransaction({
  from:  "0x2ce81f42.....省略.....0861ea7c685",
  to:    "0x1a929b99d.....省略.....1684A62aDA6264",
  value: web3.toWei(3, "ether")
});

ノードの終了

通常終了

geth コンソール上で:

Ctrl + D

強制終了(Windows)

別ウィンドウの PowerShell から:

taskkill /IM geth.exe /F

GitHub リポジトリ / スクリプト

GH このページで使用している Python スクリプト一式

スクリプトは GitHub の公開リポジトリで配布しています。 アドレスや秘密鍵などの機密情報は、すべてダミー値に置き換え済みです。

https://github.com/T-Otsubo-Git/ETH-Python.git

備考・注意事項