Ethereumノード
Ethereumのノードを建てるにはgethかparityを使います。今回はEthereum公式が出しているgethの運用を通して得られた知見について書いていきます。
peerが見つからない
gethを起動してこれが一番最初のつまずきポイントですね。peerが見つからないとブロックデータの同期が始まらないので何もできません。
これはGitHubのissueでいくつも上がっています。Bitcoin、Litecoin、BitcoinCashのブロックチェーンノードは起動したらすぐにpeerが見つかって同期がすぐに始まるのでEthereumと比較すると雲泥の差ですね。
見つからない時はずっと見つからないので自分でpeerを追加するしかありません。追加方法はgethコンソールにログインしてaddPeer()コマンドを実行します。
まずはgethコンソールへのログイン方法はこちらです。gethを起動するとdatadirの中にgeth.ipcというファイルが作成されるのでこのファイルを指定することでコンソールにログインできます。
$ geth attach ipc:geth.ipc
peerの追加はこちら。ノードのurlのフォーマットは頭にenode://がついて、その後にノードのidとipとport情報と続きます。このメソッドを実行してもすぐ追加されない時があるので何度か試してみるといいです。
# admin.addPeer("enode://bebb87d3786327d14601a12bee7abe85732f5d9dbc3645e1d1a9a434cfd9b8e799e6c673e4bed67f0114f4d15d2a181401f8c7f72b1ca7e93a075d306fa6cd34@18.207.255.166:30303") true # admin.addPeer("enode://c13ee7b82fd3898d1b9c5af1c38356a06cee0a9c7312a431f17dbfadc900ff972a3693e5a0155d4709b0595485f16f37984ab355cdc168ac45bfccee85155534@47.93.159.173:30303") true # admin.addPeer("enode://c5bc95b15e0240ba291877e898d3df1cecf59dc55ea928ae13582b2543c190b242e7d5b13d90e9fb15e9d1c0a7b575b68eec21fa447b9c9c903732eb983e58c6@78.46.108.73:30303") true
接続しているpeerの確認はこれでできます。
# net.peerCount 2 # admin.peerInfo // 内容省略 # admin.peers // 内容省力
fastモードは同期するまでstateを取得しない
gethでのブロックの同期には2種類あります。ブロックのstateを取得しないfastとstateを取得するfullです。
ブロックのstateとはトランザクションを再現できるバイトコードなどが含まれます。
fastモードで同期を開始した場合、最新のブロックに追いつくまではstateを取得しませんが、追いついたあとはstateも取得し始めるのでfullと同じになります。
fastとfullの違いは
取得済ブロックが巻き戻る
これはバグですね。gethを再起動させるとブロックが巻き戻ることがあります。それも2000~3000ブロック巻き戻るので同期するまでにかなりの時間がかかります。
これはissueでも上がっていて1.8.13くらいから修正されているはずです。こんなでかいバグが残ってるところがまだまだ黎明期感がありますね。
Websocketのコネクションだけが切れる
これもgethのバグです。httpの接続は繋がってるのにwebsocketだけ接続が切れて復帰しないことがあります。ノードの同期には問題ないですがgethからwebsocketでデータを取得するときに問題になりますね。
メモリはある分だけ食い潰し、CPUは全然使わない
これもまた厄介な問題です。メモリは32Gだろうが64Gだろうがある分だけメモリを食いつぶします。何でこんなに消費しているかまでは把握していませんが、大量にデータをキャッシュしているんでしょうね。これがブロックのロールバックにも関係していそうです。
trace系メソッドの場合はCPUも食い潰す
gethにはtトランザクションの処理をトレースしたデータを取得できるメソッドがあります。これはコントラクト間のデータのやり取りまで取得できるのでKyberなどのDEXの内部的なtxのやり取りまで追うことができます。
traveメソッドにはブロックないの全てのtxを取得するメソッドもあります。
これらのtraceメソッドは1.8.13まではCPUを過剰に消費してしまうので現状は頻繁に使うことはできません。1.8.14では解消されるプルリクが取り込まれたようなのでリリースされたらチェックしたいと思います。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す