Ethereumノードのgeth運用チップス




どうも高妻です。Twitterでプログラミングのことや暗号通貨のことをつぶやいているのでよかったらフォローしてください。  

Ethereumノード

Ethereumのノードを建てるにはgethparityを使います。今回はEthereum公式が出しているgethの運用を通して得られた知見について書いていきます。

peerが見つからない

gethを起動してこれが一番最初のつまずきポイントですね。peerが見つからないとブロックデータの同期が始まらないので何もできません。

これはGitHubのissueでいくつも上がっています。Bitcoin、Litecoin、BitcoinCashのブロックチェーンノードは起動したらすぐにpeerが見つかって同期がすぐに始まるのでEthereumと比較すると雲泥の差ですね。

見つからない時はずっと見つからないので自分でpeerを追加するしかありません。追加方法はgethコンソールにログインしてaddPeer()コマンドを実行します。

まずはgethコンソールへのログイン方法はこちらです。gethを起動するとdatadirの中にgeth.ipcというファイルが作成されるのでこのファイルを指定することでコンソールにログインできます。

peerの追加はこちら。ノードのurlのフォーマットは頭にenode://がついて、その後にノードのidとipとport情報と続きます。このメソッドを実行してもすぐ追加されない時があるので何度か試してみるといいです。

接続しているpeerの確認はこれでできます。

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では解消されるプルリクが取り込まれたようなのでリリースされたらチェックしたいと思います。

The following two tabs change content below.

高妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



コメントを残す

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