はぐれメタルはにげだした

身近な趣味からテクニカルな話題まで幅広く取り扱っていきます

技術 暗号通貨

dockerでNEMのフルノード(NIS)を立てる

投稿日:2019年2月8日 更新日:

この記事の所要時間: 631

dockerの勉強がてら、nginxコンテナ+nisコンテナを立ててみました。

構成

ディレクトリ構成

dockerの構成としてはこんな感じです。nisコンテナの前段に、リバースプロキシとしてnginxコンテナを立てます。

root/
 ├ docker-compose.yml
 ├ nginx/
 │  ├ Dockerfile
 │  └ nis.conf
 └ nis/
    └ Dockerfile

リバースプロキシを置くメリットとしては

  • nisよりアクセスログが見やすい
  • リクエストを制御しやすい
    →アクセス許可/拒否、リダイレクト、キャッシュ、SSL化

みたいなことが挙げられ、nis単体で運用するよりも何かとリクエストを管理しやすくなります。

例えばこないだPoSの脆弱性が見つかったとかで、加工したリクエストを他のノードに投げてダウンさせる攻撃が話題になってましたが、IPとポートを野晒しにしてるNIS相手ならそんな手の込んだことをしなくてもF5アタックで普通に狙い撃ちできてしまいますよね。

自分のノードが狙われると困っちゃうので、あらかじめリバースプロキシなりWAFなりを置いてアプリケーションを守れるようにしとくのが懸命です。

nginxコンテナ

Dockerfile

nginxのalpineイメージをベースに、nis用の設定ファイルとしてnis.confを追加して起動しています。

nis.conf

80ポートでリッスンしてnisコンテナの7890ポートにプロキシします。必要に応じてここに色々追記してアクセス制御していきますが、今回はとりあえずまっさらです。

nisコンテナ

Dockerfile

ベースはopenjdkのalpineイメージです。javaのバージョン何が良いのか分からなかったんですが、適当に8にしたら動きました。

やってることはNISをダウンロードしてきて起動してるだけです。メモリは初期値の1GBだと厳しいので4GBに変えてます。あとはnisのログやDBが置かれるパスを/opt/nemに変更しているのと、ローカルハーベストも行うので自分のアドレスの秘密鍵とノードの名前を環境変数で渡してあげます。環境変数はdocker-compose.ymlで定義します。

docker-compose

docker-compose.yml

ホストの80ポートをnginxコンテナの80ポートにbindしています。nisコンテナのほうでは、秘密鍵とノード名の環境変数を定義すると共に、コンテナ上の/opt/nemをホスト(ここではmacです)の/Users/MyName/docker/data/nisにマウントしています。これにより、コンテナを再起動した場合でもデータが保持されるため、次回起動時の同期処理を高速化することができます。

NISの稼働に必要なリソース

nginxのほうはただプロキシしてるだけなので、よほどアクセスが来ない限りはほとんどリソースを使いません。問題はnisコンテナの方です。CPUコア数こそ1で充分ですが、同期が進めば進むほどメモリを食うので4GBだとなかなか苦しく、8GBあれば安定する感じです。(2018年2月現在の使用状況です)

同期の時短チャレンジ

フルノードはチェーン上の全てのデータを保持しています。そのため、データの整合性を保つために他のノードと逐次同期しているわけですが、初回起動時は1ブロック目から最新ブロックまで全データの同期処理が走るのでかなり時間がかかります。2019年2月現在でチェーンのブロック高は200万ちょい、最新ブロックまでの同期待ちで1日半くらいかかりました。流石にこれは時間かかりすぎだろってことで、一度最新化したDBのダンプを使ってリストアするようにしましたが、それでも同期が終わるまでに1時間半くらいかかりました。

おそらくnisの同期は「チェーンのダウンロード」と「データのベリファイ」の2つの処理をやってるのかと思います。リストアすればダウンロードの大半を省略できるので時短はできるものの、ベリファイを1ブロック目から順に流していく必要があるので、どうしても時間はかかってしまうのではないかと推測します。trust but verifyってやつですね。

せっかくコンテナにしたので、コマンド一発でサクッとnisを使えるようにできたら何かと捗るかと思ったんですが、生憎そういう今風の使い方はできないようですね。データを持たせないことを正義とするコンテナと、データを可視化することを正義とするブロックチェーンがアンマッチなのは分かってるんですが、チェーンが進めば進むほど時間が延びるのもなぁって感じでモヤモヤします。

ともあれベリファイに時間がかかるのは仕方がないので、ひとまずはダウンロードの時間を時短できれば良しとします。Dockerfile的には、最初は都度ダンプを落としてきてリストアする形式で書いてたんですが、結局それらにも時間がかかるので、最終的にはボリュームをホストにマウントする形で落ち着きました。この場合でも、コンテナを再起動した場合にベリファイは走りますが、過去に取得したブロックまでのダウンロードは省略できます。

まとめ

少し課題が残るところではありますが、とりあえず当初の目標であったnisのコンテナ化はできました。ちょっとテコ入れすればAWS Fargateとかでも動くと思うので、今度はそっち方面使って冗長化とかしてみようかと思います。

このページにたどり着く方はNISの建て方を調べている方だと思われますが、わざわざサーバを用意しなくともお手元のmacやlinuxのリソースが余っているならdocker入れて docker-compose up -d してもらうだけですぐにフルノードが立てられるはずです。どうやらNEMはまだまだノードが足りないと噂されているようなので、気が向いたら試してみてください。

なお余談ではありますが、僕が探した限りでは、何を根拠にNEMのノードが足りないと言われているのか、その数字的な背景は見当たりませんでした。そもそもチェーン運用に必要とされるノード数は何台で、その台数はどういう計算から導かれたのか、みたいなやつです。

何となく「有名な人がそう言ってるからそうなんだろう」が独り歩きしてる感が否めませんが、技術者としてはアンチパターンなこの風潮も、エンジニアの少ないコミュニティではよく見られる光景だったりします。ブロックチェーンだけでなく人間の方もtrust but verifyを心がけるようにしたいですね。

こんな記事も読まれてます

20代30代の客先常駐ITエンジニアが最速で年収を上げる方法

この記事の所要時間: 1456

この記事の所要時間: 約 14分56秒 もしあなたが以下の3つ全てに該当するエンジニアであれば、今すぐにでも転職をオススメします。 客先常駐型のエンジニアとして働いている 案件の途中で契約を切られるこ …

-技術, 暗号通貨
-, , , ,

関連記事

AWSでIAMユーザのパスワードポリシー設定方法

この記事の所要時間: 425

この記事の所要時間: 約 4分25秒 IAMのデフォルトのパスワードポリシーは非常に低セキュリティです。 どれくらい低セキュリティかというと aaaaaa とか 123456 とか6文字以上の文字列な …

AWS WAFでWordPressを保護するための設定例

この記事の所要時間: 161

この記事の所要時間: 約 16分1秒 AWS WAFはセットアップするだけならクリックぽちぽちでいけるので非常に簡単なんですが、いざ運用を検討しだすとハマりポイントがいくつも出てきて頭を悩ませてしまい …

ブログで指定した期日を過ぎたら自動で文章を更新させる方法

この記事の所要時間: 1117

この記事の所要時間: 約 11分17秒 さきほどtwitterを見てたらこんなツイートが話題になってました。 前回公開した記事の中で、実は残日数をカウントダウンさせるプラグインが入ってます。 残日数の …

AWS WAFマネージドルールの致命的な1つのデメリット

この記事の所要時間: 1250

この記事の所要時間: 約 12分50秒 企業がWAFを導入するにあたって頭を悩ませるポイントはいくつかありますよね。 いま世の中ではどんな攻撃が蔓延ってるのか、それらの攻撃からサービスを守るにはどんな …

AWS無料枠の使用状況や残りの期間を確認する方法

この記事の所要時間: 343

この記事の所要時間: 約 3分43秒 AWSを使う上で最も気になることの1つが利用コストですよね。特に無料枠のみでやりくりしたいと考えている場合、「今月分の無料枠の使用状況を確認する方法」と「無料期間 …

プロフィール

プロフィール



はぐれん@フリーランサー

10代〜20代前半くらいまではガンガンいこうぜ。20代半ばで鼻っ柱を砕かれて一度はめいれいさせろの支配下に置かれかけたものの、いや逃げりゃいいんじゃんって気付いてからはまた違う世界が見えて来た。30代半ばに差し掛かった今、いろいろやろうぜ。

まだデータがありません。