[web3] Ethereum の テストネット: Sepolia上での フルノード構築

概要

こんにちは、サイオステクノロジーの安藤 浩です。 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)上で構築しました。その際には以下を利用しました。

リソース名備考
VMOS: Ubuntu コストを安くしたかったため、Spot VMとした
Standard SSD2025.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(実行レイヤークライアント)で以下の流れで構築しました。

  1. 事前準備
  2. Prysmのインストールとセットアップ(JWT認証トークン生成)
  3. Gethによる実行ノードの設定と起動
  4. Prysmによるビーコンノードの構成(チェックポイント同期を使用)

同期確認方法は以下が主になります。

  • データディレクトリ容量の増加確認
  • Gethコマンドによるピア数・同期状態の確認
  • eth.syncingがfalseになれば完全同期完了

最終的に同期が完了すると、ブロック情報の取得やトランザクション情報の確認が可能になります。

Ethereumのログを取得したい、ノードを運用したい方はぜひ構築してみてはいかがでしょうか。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です