概要
こんにちは、サイオステクノロジーの安藤 浩です。 Ethereum のテストネット: Sepolia でフルノードを構築したのでその手順を記載します。
Ethereumのログを取得したい、ノードを運用したい方はぜひ参考にしていただければと思います。
基本的に Quickstart: Run a node and (optionally) stake ETH
using Prysm に従って構築します。
Nodes の説明にありますが、Beacon node と Execution node が共に実行されてNodeが構築されます。バリデータになりたいなら、32ETHをステークしてValidator を実行する必要があります。いまはバリデータになる必要はないので、省略します。
なお、本日時点で prysm v6.0.0 がリリースされていました。
今回は、prysm(consensus-layer client) + geth(execution-layer client) , beacon node と execution node 間の接続はHTTP-JWTとして、フルノードを構築していきます。
以下の図のNodeに対応する部分を構築します。

事前準備
物理マシンを利用したいところですが、調達が大変なのでCloud(Azure)上で構築しました。その際には以下を利用しました。
リソース名 | 備考 |
---|---|
VM | OS: Ubuntu コストを安くしたかったため、Spot VMとした |
Standard SSD | 2025.04.03 時点で650GB程度必要。メインネットでは2TB以上必要。 |
その他、パブリックIPやネットワークセキュリティグループなどAzure のPortal 上から作成すると作成されるリソース。
Step1. prysm のインストール
適当な場所に以下のような階層でディレクトリを作成します。
📂ethereum
┣ 📂consensus
┣ 📂execution
consensus ディレクトリに移動し、以下を実行します。(version 5.3 を利用)
mv ./ethereum/consensus
curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh
beacon node と execution node 間の接続は HTTP-JWT とするため、JWT トークンの生成をします。
./prysm.sh beacon-chain generate-auth-secret
Prysm で jwt.hex が生成されるので、ethereum ディレクトリに移動します。
このような階層構造になります。
📂ethereum
┣ 📂consensus
┣ 📄prysm.sh
┣ 📂execution
┣ 📄jwt.hex
Step2. geth による Execution node の実行
geth Download Page からダウンロードします。(version 1.15.5を利用)
etherem/execution
に移動して、geth の実行ファイルを配置してあげればよいです。
配置出来たら、以下を実行します。
./geth --sepolia --http --http.api eth,net,engine,admin --authrpc.jwtsecret=<PATH_TO_JWT_FILE> --datadir <PATH_TO_GETH_DIR> --syncmode snap
PATH_TO_JWT_FILE
は ethereum/jwt.hex
へのパスを指定します。 PATH_TO_GETH_DIR
は geth のデータディレクトリを指定します。
正確に検証していませんが、パスは絶対パスで指定したほうが良いかもしれません。
📂ethereum
┣ 📂consensus
┣ 📄prysm.sh
┣ 📂execution
┣ 📄geth
┣ 📄jwt.hex
Step3. prysm による Beacon node の実行
Beacon node を同期する方法は2つあり、Genesis から同期する方法とCheckpointから同期する方法があります。
Checkpointから同期する方法が速く、推奨されているためCheckpointでの同期します。
./prysm.sh beacon-chain --execution-endpoint=http://localhost:8551 --sepolia --jwt-secret=<PATH_TO_JWT_FILE> --checkpoint-sync-url=https://sepolia.beaconstate.info --genesis-beacon-api-url=https://sepolia.beaconstate.info --datadir=<PATH_TO_PRYSM_DIR>
PATH_TO_PRYSM_DIR
は prysm のデータディレクトリを指定します。 Default の場合、~/.eth2
に作成されるため、ディレクトリ指定したかったため指定します。
Genesis から同期したい場合は --genesis-state
のパラメータに genesis.ssz からダウンロードしたファイルを指定するようですが、試しましたが時間が掛かかっていた(5時間以上経っても同期が進んでいなさそうだった)ため断念しました。 Discord でコミュニティに確認しましたが、同期は出来そうだとのことでした。
正常性チェック
同期されるまで時間が掛かる可能性があり、同期できているか不安になるので確認ポイントをいくつか挙げておきます。
- データディレクトリの容量が増えているか
- geth コマンドで
net
のpeerCount
が増えているか - geth コマンドで
eth.syncing
のcurrentBlock
が増えているか (2時間以上待って、currentBlock が増えていないと遅すぎる気がします)
geth コマンドでの同期の確認は以下のようになります。
コンソールの起動
./geth attach http://127.0.0.1:8545
> net
{
listening: true,
peerCount: 6,
version: "11155111",
getListening: function(callback),
getPeerCount: function(callback),
getVersion: function(callback)
}
> eth.syncing
{
currentBlock: 2406514,
healedBytecodeBytes: 0,
healedBytecodes: 0,
healedTrienodeBytes: 0,
healedTrienodes: 0,
healingBytecode: 0,
healingTrienodes: 0,
highestBlock: 7800198,
startingBlock: 0,
syncedAccountBytes: 393532328,
syncedAccounts: 1687120,
syncedBytecodeBytes: 921068927,
syncedBytecodes: 191721,
syncedStorage: 14257899,
syncedStorageBytes: 3217044931,
txIndexFinishedBlocks: 0,
txIndexRemainingBlocks: 1
}
eth.syncing がfalse になったら、完全に同期されたことを意味します。
同期できない場合はTroubleshooting checklist を参照すると良いと思います。
それでも解決できなければ、Discord で聞いてみるのが良いと思います。
eth.syncing がfalseになった後で、7000000 番目のブロックをGethで取得した結果(一部省略)を以下に記載しておきます。
このようにログが取得できました。
> eth.getBlock(7000000)
{
baseFeePerGas: 1740326177,
blobGasUsed: 786432,
difficulty: 0,
excessBlobGas: 655360,
extraData: "0xd883010d0b846765746888676f312e32312e36856c696e7578",
gasLimit: 30000000,
gasUsed: 23850754,
hash: "0x7dedce8c46563ce800f91e3bdb2ef03282709fce14883ed1d496eb0dc9fb2e97",
logsBloom: "0x0109280004014014021020860200000000c98014068204403010000202024200008800441818311000020003230440a00110000008000c600006121624200142022800020204000a401030ca0000000004800804000400008000020000201002024228490a0005030024862100800990000822c000410802200014144000e8008a22100100802004a008002020000008010514a0002086022001040a2400080802080000000040000a600800c00000530011c06000480a1000c0022a0420000b011008c204002800000900000a420a08404449000110000011224542000120a08230000040e801200100008020820000300882222a0000000c08a80400801000",
miner: "0x9b7e335088762ad8061c04d08c37902abc8acb87",
mixHash: "0x7ee4d0677635b1cc2fd443879da4715890042461ff57d0441ff0dcd9715e47e0",
nonce: "0x0000000000000000",
number: 7000000,
parentBeaconBlockRoot: "0x83ac49f3eb40d5278d3857bedde44d67351ef01057f0e9d5be465e3224d95849",
parentHash: "0x20f7a3250f0af68aafc4e6101a90d330a1238067e5dc5fcb3882c0c76d3a9c14",
receiptsRoot: "0xcdc50cd52f33de7a52ba55cb26be903a98cd6be5cc59da8beb85151606865beb",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 27053,
stateRoot: "0x17a59c5581a6be7e72ebae62df30efa8260ce4444b5aa3daee1141f1ee981c96",
timestamp: 1730590644,
transactions: ["0xe087184469bd23ed38701af221f3e633db981888bef1434010217474025643e6", "0x576bd50d7e565c327c68e6b9f0d2b92cc15627479cbf3a519a54cb796e2421e6", "0xdcb727a2e3272e9bdb550c3d0100fc929a7e9fdeda547fa891fd2e4501f984f7", "0x5ab5f34109fb65aa6b7b9ee9c88c49375d6ffa7e6f85451d09a781c7a42ae982", "0x371296c8648c4e441619e93edc378d097763fad6c4404c0c1cfb16f0f0eb72bc", "0xcc8da422c0b63bba9fac14d54c995519cfb7b79ffe232daf222e924da29fab14", "0x4f76de8ccc1342fc79460b310becd41870a9754f88ab7ea46d72ab36d854eb87", "0x4615a209ac88196a27fb43d85bb6461fa18ac3badf7dc3c8d2535d691f8e726a", "0x5bbcc5bdb8060be00f5c059bdd78cef85035a6f1ab16a002465714cb466d5529", "0xb3aaf6ed75a6112c1e9eacb8f040558071f0bc3b16135919c9894044693f10ed", "0xfc3fcc4cbef1fc2d81c0ab8b5c2fa47cf821af5e5321b3100bfe39f00dba2b70", "0xb0168aa3dbcc588d8434402f6bd1fe2bc98b058c8822d77ef1f57070d6fd3a33", "0x45111b4ad3b0c314d12854446ac97ffb66f2241be0d8cfd1d618b55cdccbb0a1", "0xdf0e0a9fa138d21a9003d718bde1cf51c428aefdf6067591c95600bf62b2fd6f", "0x58927b2bc9f07fd8e2339613a61950af45a3059f3519fab9c3b2f6617bc5eebc", "0x0b065efff51965ca268ca47cde6d4fdb4a62e76c8851aad5586f1ac66fedfe24", "0x36837e224a0bf1eb2e108a56df3b691e2734dc341c5f49104dab62ff88ba887b"],
transactionsRoot: "0xcf8b30f13a064fd255c3a165a50c1b59b2c8f576f3190094521cca77a170b55f",
uncles: [],
withdrawals: [{
address: "0xe276bc378a527a8792b353cdca5b5e53263dfb9e",
amount: "0x31c18",
index: "0x3d2a6e9",
validatorIndex: "0x38a"
}, {
address: "0xe276bc378a527a8792b353cdca5b5e53263dfb9e",
amount: "0x31c18",
index: "0x3d2a6ea",
validatorIndex: "0x38b"
}, {
address: "0xe276bc378a527a8792b353cdca5b5e53263dfb9e",
amount: "0x31c18",
index: "0x3d2a6f7",
validatorIndex: "0x398"
}, {
address: "0xe276bc378a527a8792b353cdca5b5e53263dfb9e",
amount: "0x31c18",
index: "0x3d2a6f8",
validatorIndex: "0x399"
}],
withdrawalsRoot: "0x86e381c6550fb06fae784caf00bb758e85e135a64f1d4825988518d6e5526238"
}
まとめ
Ethereumのテストネット「Sepolia」上でフルノードをPrysm(コンセンサスレイヤークライアント)+ Geth(実行レイヤークライアント)で以下の流れで構築しました。
- 事前準備
- Prysmのインストールとセットアップ(JWT認証トークン生成)
- Gethによる実行ノードの設定と起動
- Prysmによるビーコンノードの構成(チェックポイント同期を使用)
同期確認方法は以下が主になります。
- データディレクトリ容量の増加確認
- Gethコマンドによるピア数・同期状態の確認
- eth.syncingがfalseになれば完全同期完了
最終的に同期が完了すると、ブロック情報の取得やトランザクション情報の確認が可能になります。
Ethereumのログを取得したい、ノードを運用したい方はぜひ構築してみてはいかがでしょうか。