はじめに
このページは、Ethereum ネットワークを LAN 上に構築し、 ブロック生成やトランザクションのテストを行うためのメモです。
一般向けとしては難解な部分があるかもしれません。 もっとわかりやすく解説した改訂版の作成も予定しています。
- author : T.Otsubo ( Jagaemon & Company 2025 ) -
目的
Ethereum ネットワークを LAN で構築し、 ブロック生成ノードやトランザクション等のテストを行い原理を理解する。
環境・前提条件
- ハードウェア要件:Windows PC 5 台(Windows 8.1 / 10 / 11 混在可。10 以上を推奨)
- 通信回線要件:1 Gbps 程度の有線 LAN 接続が望ましい
- WAN 側要件:Geth などのソフトウェアダウンロード用にインターネット接続が必要
- ルーター要件:
- ファイアウォールの適切な設定
- DHCP を使用する場合は 192.168.1.10 以上に割り当て(固定 IP と競合しないようにする)
事前準備
Geth のダウンロードとインストール
- 公式サイト: https://geth.ethereum.org/downloads/
- 例:Windows 8.1〜11 混在 LAN 環境で使用したバージョン
geth-windows-amd64-1.13.15-c5ba367e
Geth を環境変数 Path に登録
例として、Geth を C:\Program Files\geth にインストールした場合:
- コントロールパネル → 「システム」 → 「詳細情報」 → 「システムの詳細設定」
- 「詳細設定」タブ → 「環境変数」ボタン
- 「Path」を選択して「編集」→「新規」
C:\Program Files\gethを追加 → OK で閉じる
ポート 30303/TCP を開放
- Windows Defender ファイアウォール → 「受信の規則」 → 「新しい規則」
- 種類「ポート」 → TCP / 「特定のローカルポート」→
30303 - 適切な名前(例:
Geth 30303 TCP)を付けて保存 - 「送信の規則」側も同様に設定(念のため)
IP アドレスの固定割り当て(例)
- Gateway (Router):
192.168.1.1 - PC1:
192.168.1.2 - PC2:
192.168.1.3 - PC3:
192.168.1.4 - PC4:
192.168.1.5 - PC5:
192.168.1.6
Python / web3.py
- 各 PC に Python がインストール済みであること
web3ライブラリがインストールされていること(pip install web3等)
ノード構成とアカウント作成
ノード構成
各 PC を以下のように役割分担します(「ノード」と同義)。
- PC1:BOOT ノード
- PC2:validator ノード
- PC3〜PC5:クライアントノード
ディレクトリ作成例(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 のポイント
chainId:例では1234difficulty:"0x1"(テスト用に低難易度)gasLimit:任意(例:"8000000")"clique": { "period": 2, "epoch": 30000 }をconfigに追加allocに signer アドレスを登録(初期資金付与)extraDataの中央に signer アドレスを埋め込む
上記をすべて整えて、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 接続し同期させるために、例として以下のスクリプトを使用します。
connect_peers3.py(別途スクリプト後述)
PC1 の PowerShell でスクリプトのあるディレクトリへ移動し、次を実行:
python connect_peers3.py
これで各 PC の起動 & 同期が完了します。
残高確認
Python スクリプトによる残高確認
PC1 の PowerShell だけで全 PC の残高照会ができます。
list_balances.py(別途スクリプト後述)
実行:
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 間の送金を行うことができます。
send_eth_pk2.py(別途スクリプト後述)
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 リポジトリ / スクリプト
- peer connect_peers3.py
- balance list_balances.py
- send send_eth_pk2.py
備考・注意事項
- 本ドキュメントはローカル LAN 上での検証用を想定しており、 インターネット公開チェーンや本番環境での利用には別途セキュリティ設計が必要です。
- 実際の秘密鍵・ニーモニック・実サービス用パスワード等は決して公開しないでください。
- ここに記載の IP アドレスやアカウントアドレスはあくまで例です。 ご自身の環境に合わせて適宜読み替えてください。