NEM のローカルハーベスト環境を Raspberry Pi にセットアップしてみた

ひょんなことからNEM(XEM)という暗号通貨を保有してみることにしました。

自分にも普及させるために何かできないかと思い、APIの和訳にチャレンジしていたのですが(報酬に釣られてw)、あっさり和訳を出されて意気消沈。

しかし読み解くなか、実際に手を動かしていて色々と得るものがあったのでそれを記事にしました。

NEMについては他の暗号通貨を取り上げているサイトへ譲るとして、ここではNEMのローカルハーベストするまでについて書いてみました。

NEMについての個々のキーワードについては説明しませんので、他のサイトを巡ってください。

前提

今回は Raspberry Pi2 B+ に Raspbian を使いました。

私が持っているなかで一番新しいのが2 B+だったので、最新の3を持っている方はそれでもいいと思います。

メモリは1GBはないと厳しいと思いますので、他のモデルは推奨できません(動作が不安定になるかも…)

RASPBIAN JESSIE LITE 2017-03-02 を使用しましたが新しいバージョンになっても大きな問題は無いと思います。

RaspberryPiへターミナルでログインできるところまで整っている前提で勧めます。

また、Linuxコマンドでファイル操作ができる程度の知識を要求します。

RaspberryPi上の環境構築

ハーベストするには NIS(Nem Infrastructure Server) を立てますが、動作環境として Java 8 以上が必要ですのでまずはこれからインストールします。

$ sudo apt-get update && sudo apt-get install oracle-java8-jdk
$ java -version
java version "1.8.0"

apt でサクッとインストールできます。念のためバージョンの確認をしてください。

NISサーバのダウンロード

必要なファイルは全てここからダウンロードできます。

ここからNISサーバのアーカイブをダウンロードします。

  • nis-ncc-0.6.84.tgz
$ curl -o nis-ncc-0.6.84.tgz http://www.nem.ninja/nis-ncc-0.6.84.tgz
$ tar zxvf nis-ncc-0.6.84.tgz
# package というディレクトリが作成されるので中に入る
$ cd package
$ ./nix.runNis.sh # このスクリプトを実行するとサーバが立ち上がります。

ダウンロードして展開、package の中の .nix.runNis.sh というスクリプトを実行するだけでサーバは立ち上がります。

しかしこれではフォアグラウンドで立ち上がるので、サービス化しましょう。

ctrl+c で一旦終了してください。

データベースをダウンロードする

とその前に、NIS サーバを立ち上げると、データベースの同期が始まりますが、結構時間がかかります。

これは予めデータベースをダウンロードしてくることで同期時間を短縮できます。

この作業はインストール時の初回のデータベースがまだない状態でやりますが、先程 NIS を起動したのでもうファイルがあると思いますので、一旦削除してしまってください。

  • nis5_mainnet-1002k.h2.db.zip

nis5_mainnet-1002k.h2.db.zip というファイルは 1002k の部分が時期によって変化するので、上記リンクからファイル名を確認してください。

curl -o nis5_mainnet-1002k.h2.db.zip http://www.nem.ninja/nis5_mainnet-1002k.h2.db.zip
rm $HOME/nem/nis/data/nis5_testnet.h2.db # データベースを削除します!
mkdir -p $HOME/nem/nis/data
unzip nis5_mainnet-1002k.h2.db.zip -d $HOME/nem/nis/data/

nem ディレクトリがホームにある前提ですが、もし変更しているならば修正してください。

(特にNISの設定をいじってなければ実行ユーザーのホームディレクトリに作成されるはずです)

$HOME/nem/nis/data/nis5_testnet.h2.db としてdbファイルが配置されたのを確認したら、NISサーバを立ち上げます。

差分をダウンロードし始めるので、やはり待つ必要はありますが、最初からダウンロードするよりは早く終わるはずです。

systemdでサービス化する

それでは話を戻して、systemd というシステム管理デーモンがありますので、設定ファイルを用意して、NIS をサービス化します。

以下の内容を /etc/systemd/system/nis.service として保存してみました。

NIS の配置しているパスが異なる場合は修正してください。

Restart = always にすることで、このサービス、つまり NIS がダウンしても自動的に起動しなおされます。

[Unit]
Description = NEM Infrastructure Server

[Service]
Type = simple
WorkingDirectory = /home/pi/package/
ExecStart = /home/pi/package/nix.runNis.sh
User = pi
Group = pi
Restart = always

[Install]
WantedBy = multi-user.target

配置したら systemctl list-units –type service で登録されているサービス一覧を表示できるので、nis.service が一覧の中にあるか確認します。

確認できたら、OSの起動時にサービスを開始する有効化と、サービスを開始して、ステータスを確認します。

sudo systemctl enable nis # サービスを起動時に開始
sudo systemctl start nis # サービスの開始
sudo systemctl status nis # ステータスを表示
...
Active: active (running) since Sat 2017-03-18 02:25:25 JST; 12s ago

active (running) の文字や動作ログが見えればOKです。

ではここで本当に再起動するか確認してみました。

PID を調べて kill してみます。

$ ps -x | grep -e [n]em
1352 ? Sl 144:06 java -Xms512M -Xmx1G -cp .:./*:../libs/* org.nem.deploy.CommonStarter
$ kill -9 1352
$ ps -x | grep -e [n]em
2274 ? Sl 144:06 java -Xms512M -Xmx1G -cp .:./*:../libs/* org.nem.deploy.CommonStarter

kill して ps し直すと、別の PID で立ち上がりました。

sudo systemctl status nis でステータスを見ても active になっています。

これでマシンの起動時に開始し、NIS が落ちても再起動してくれる環境になりました。

ローカルハーベストを開始する

NIS を起動しただけではローカルハーベストは始まっていません。

ローカルハーベストを開始するには NIS API でコマンドを送るか、packageの中にある harvest.sh でも同じことができます。

curl -XPOST -H "Accept: application/json" -H "Content-Type: application/json" \
  -d "{'value':'ここに秘密鍵'}" http://localhost:7890/account/unlock
cd package
./harvest.sh ここに秘密鍵

harvest.sh の中身を確認すると、上記の API を実行していることがわかります。API の仕様についてはこちら。

(日本語訳もありますが、この記事時点時点では検証期間だったので内容が変更される可能性があります。)

しかし NIS がリクエストを受け付けていない状態(ブロックのロードが終わっていない)だと、エラーが返却されます。

{"timeStamp":62213067,"error":"Service Unavailable","message":"NIS_ILLEGAL_STATE_LOADING_CHAIN","status":503}

そこで、せっかくなので API を利用して NIS の状態を確認し、API操作を受け付けられるようになったら、ハーベストを有効にするスクリプトを書いてみました。

harvest.sh に API を使って NIS が応答可能になるまで確認待ちをさせて、応答可能になったらハーベストを有効化しています。

このファイルを使うか、# additional script { —- —-} で囲まれた部分が追記部分なので、コピペしてもよいです。

データベースのロードには RaspberryPi が非力なのか結構時間がかかるので、これを叩いておけば後はスクリプトにまかせておけば良いです。

セットアップスクリプト

というわけで、ダウンロードして配置するだけとは言え、コレだけ単純な作業だったら自動化したくなるというのがITエンジニアの性。

  • NIS最新版のダウンロード・検証
  • systemdサービス用のスクリプトの生成
  • 改良した起動スクリプトの生成

これらを行うスクリプトです。

ご自身の環境構築の参考にしていただければ幸いです。

(一部ハードコーディングされているので将来的に修正が必要になるかもしれません)

README.txt が AA だったので表示してみました。

最新バージョンの値が書いてあるファイルも置いてあるので自動アップデートの仕組みみたいなのも作れそうですね。

記事は Raspberry Pi でのセットアップですが、Linux サーバならだいたい動作するはずです。(Ubuntu ならほぼ大丈夫かと)

NIS APIのリクエスト・レスポンスはjson形式なので、jqコマンドがあると扱いやすいですが、なるべく追加でパッケージのインストールが不要なようなコマンドでやってみました。

スクリプトについて、何かバックドアを仕込むようなことはもちろんしていませんが、スクリプトの実行については、実行される内容を理解した上でご利用ください。

分からないことがありましたら解答しますし、何か問題点があればご指摘いただければありがたいです。

ちなみにハーベストするだけなら、NISでローカルハーベストするよりも、リモートハーベストしたほうがサーバも必要ないので圧倒的に楽ですので、サーバのAPIを叩くでもなければNISは立ち上げる必要ありません。

(1ヶ月くらいローカルハーベストしていましたがもはや推奨はされていないようです)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする