NEMのノード(スーパーノード可)を建ててみよう Ubuntu 18.04


はじめに

NEMでハーベストするためにはNEMのフルノードに接続することが必要ですが、
ノードによって定員が定められており、なかなか空いてないことがあります。
そこで今回は自分でNEMのノードを建ててみることにします。
また、この手順で定期的に報酬が受けられるNEMのスーパーノードを建てることもできます。

手順

ドメインの準備

ドメインの取得

今回はipv4アドレスでも構いません。必要な場合のみドメインを取得してください。

サーバーの準備

サーバーの用意

Linuxサーバーを立ち上げます。
今回はドイツにあるCONTABOの「VPS L SSD」、OSは「Ubuntu 18.04」を選びました。
メールでroot/passwordが送られてくるのでそれでログインしてください。
8コア、RAM 30GB、SSD 800GB、帯域600Mbit/s、帯域利用無制限、DDoS保護で月15ユーロはVPSでは格安の部類だと思います。

サーバの初期設定

root/passwordで入り、初期設定を行います。

タイムゾーン、NTPの設定

サーバーを日本時間にします。
timedatectl set-timezone Asia/Tokyo

NTPサーバーを設定します。今回はサーバーがドイツにあるので、ドイツのNTPサーバーを使う方が良いでしょう。
sed -i 's/#NTP=/NTP=2.de.pool.ntp.org/g' /etc/systemd/timesyncd.conf

スワップファイルの設定

CONTABOの場合、既に2GBのスワップが最初から設定されていますが、増やしたい場合は一度既存のスワップファイルを消して作り直しましょう。
現在の割り当てを消去して10GB割り当てます。
swapoff /swapfile && sudo rm /swapfile
fallocate -l 10G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile

ファイアウォールの設定

SSH制限

SSHポートは攻撃を受けやすいので、ファイアーウォールで接続制限しましょう。
接続元は自宅の固定IPや、踏み台サーバーの固定IPが良いでしょう。

ufw allow from xxx.xxx.xxx.xxx to any port 22

ポート番号を変えてさらに接続制限するのも有効です。

vi /etc/ssh/sshd_config
Port yyyyy
を追記。 (yyyyyは任意のポート番号)
その場合はファイアーウォールも忘れずに設定しましょう。
ufw allow from xxx.xxx.xxx.xxx to any port yyyyy

ポート解放

今回はTCP 7778、7880、7890を外部に公開する必要があります。
ufw allow 7778/tcp
ufw allow 7880/tcp
ufw allow 7890/tcp

ファイアウォールの起動

ファイアウォールを起動します。
sudo ufw enable

Ubuntuのアップデート

Ubuntuをアップデートして最新版にします。
sudo apt update
sudo apt -y dist-upgrade

ノード用ユーザーの作成

nemというユーザーを作成します。
adduser nem
2回パスワードを聞かれるので、入力したら後はエンターキーで省略しましょう。

ユーザーnemにsudoを与えます
gpasswd -a nem sudo

Java8のインストール

Java8をインストールします。
apt install -y openjdk-8-jre
バージョン確認
java -version

unzipのインストール

apt install unzip

DNSの設定

ドメインを指定しない場合は必要ありません。

サーバーの設定

ユーザーをnemに変更します。

su - nem

NISとservantのダウンロードと展開

NEMのサーバーからnisとservantをダウンロードします。
※2019/12/08現在ではnis-0.6.97とservant_0_0_4が最新版となります。
wget http://bob.nem.ninja/nis-0.6.97.tgz
wget http://bob.nem.ninja/servant_0_0_4.zip

それぞれ展開します
tar xzf nis-0.6.97.tgz
unzip -q servant_0_0_4.zip

それらをnemServerという1つのフォルダにまとめます
mv servant package
mv package nemServer
chmod -R g-w nemServer

設定ファイルの設定

ここでは、NEMのnano walletの情報を使用します。
事前にデリゲートアカウントを有効化してください。

NISサーバの設定

cd nemServer/nis
念のため設定ファイルのパックアップをとっておきます
cp -p config.properties config.properties.org

vi config.propaties 46~47行目あたりと77行目あたり

config.propaties
#nis.bootKey = #0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
#nis.bootName = foobar
↓
nis.bootKey = <委任秘密鍵>
nis.bootName = <任意の名前>

nis.unlockedLimit = 4
↓
nis.unlockedLimit = 30

NISサーバーにメモリを3GB割り当てる予定なので、ハーベスト接続人数を30人に増やしています。

NISサーバの起動設定

cd ~/nemServer
vi nix.runNis.sh

最近はサーバーの最小標準構成が4GB以上が推奨されているようですので、とりあえず3GBのメモリをNISサーバーに割り当てます。
また、Java8の最適化のため「G1GC」オプションを追加しています。

nix.runNis.sh
#!/bin/bash

cd nis
java -Xms3G -Xmx3G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -cp ".:./*:../libs/*" org.nem.deploy.CommonStarter
cd -

割り当てメモリを増やせば前述のハーベスト接続人数も更に増やすことができますし、動作も安定します。

NISサーバーの仮起動

cd ~/nemServer
NISサーバーの仮起動を行います
nohup ./nix.runNis.sh < /dev/null &
tail -f nohup.outで確認できます
Ctrl+Cで終了

Servantサーバの設定

cd ~/nemServer/servant
念のため設定ファイルのパックアップをとっておきます
cp -p config.properties config.properties.org
vi config.properties

config.properties.org
nem.host = <put vps ip address here>
↓
nem.host = <サーバーのIPもしくはドメイン名を入れます>

servant.key = <put your NIS boot key here>
↓
servant.key = <委任秘密鍵>

Servantサーバーの仮起動

cd ~/nemServer/servant

実行権限を付けておきます
chmod u+x startservant.sh

Servantサーバーの仮起動を行います
nohup ./startservant.sh < /dev/null &
tail -f nohup.outで確認できます
Ctrl+Cで終了

NISサーバーおよびServantサーバーの停止

sudo pkill -SIGTERM -f org.nem

NISサーバーのデータベースダウンロード

データベースのダウンロード

初回起動時間短縮のために、予め用意されたデータベースをダウンロードして解凍しておきます。
cd ~/nemServer
wget http://bob.nem.ninja/nis5_mainnet.h2-2293k.db.zip
unzip -q nis5_mainnet.h2-2293k.db.zip

一度NISサーバーの仮起動をしたときにできたファイルを消去します
rm ~/nem/nis/data/*

解凍したデータを移動します
mv nis5_mainnet.h2.db ~/nem/nis/data/

自動起動の設定

NISサーバーとServantサーバーが自動起動するように設定します。

NISサーバーの自動起動

sudo vi /etc/systemd/system/nem-nis.service

/etc/systemd/system/nem-nis.service
[Unit]
Description = NEM NIS Server
After = network.target

[Service]
WorkingDirectory = /home/nem/nemServer
ExecStart = /home/nem/nemServer/nix.runNis.sh
Restart = always
Type = simple
User = nem
Group = nem
LimitNOFILE=100000

[Install]
WantedBy = multi-user.target

Servantサーバーの自動起動

sudo vi /etc/systemd/system/nem-servant.service

/etc/systemd/system/nem-servant.service
[Unit]
Description = NEM Servant program
After = network.target nem-nis.target

[Service]
WorkingDirectory = /home/nem/nemServer/servant
ExecStart = /home/nem/nemServer/servant/startservant.sh
Restart = always
Type = simple
User = nem
Group = nem
LimitNOFILE=100000

[Install]
WantedBy = multi-user.target
systendへの登録と起動

NISサーバーとServantサーバーをsystemdに登録します
sudo systemctl daemon-reload
sudo systemctl enable nem-nis.service
sudo systemctl enable nem-servant.service

NISサーバーとServantサーバー起動します
sudo systemctl start nem-nis.service
sudo systemctl start nem-servant.service

動作確認

NISサーバ動作確認

http://xxx.xxx.xxx.xxx:7890/node/extended-info (しばらく"Service Unavailable"エラー発生)で委任公開鍵やNISバージョン表示され
http://xxx.xxx.xxx.xxx:7890/chain/height にてブロック高が表示されれば、NISサーバーは稼働しています。

Servantサーバ動作確認

http://xxx.xxx.xxx.xxx:7880/nr/metaData にて 委任公開鍵やServantのバージョンが表示されれば、稼働しています。

スーパーノードとして登録

スーパーノード登録方法

アカウントに残高が300万XEM以上あればスーパーノードして登録でき、スーパーノード報酬が貰えますが、
事前に登録が必要です。
NEMのNano Walletから専用アカウントにメッセージを送りましょう。

宛先に NAFUND-BUKIOS-TMD4BN-XL7ZFE-735QHN-7A3FBS-6CMY
と入力し、メッセージに
enroll (nemServer/servant/config.propertieのIPアドレスもしくはドメイン名) (nemServer/nis/config.propertieの任意の名前) (委任公開鍵)
と入力し、送信しましょう。

ほどなくNem Node Rewardsに登録され、状況が確認できます。
間違えてしまった場合、NEM FORUMに報告して訂正してもらう必要があります。

おわりに

以上がNEMノードおよびスーパーノードの建て方となります。
NEMも一時期に比べて入手しやすくなったので、定期的に報酬が貰えるスーパーノードを建てるチャンスかもしれません。
しかしながら、自身や利用者のためにもハッキングから防ぐためにセキュリティには細心の注意を払うことも必要です。
また、NEMのアカウントはTREZORなどのハードウェアウォレットを使用することもお勧めします。

参考サイト

みなりん*のブログ - NEM スーパーノード
TecAdmin.net - How to Install JAVA 8 on Ubuntu 18.04/16.04, Linux Mint 19/18