はじめに

年々多くの人々に知られつつある暗号通貨(仮想通貨、暗号資産)界隈ですが、特に有名なビットコインやイーサリアムの他にも多くのプロジェクトが存在します。

それらはビットコイン等と比べて非常に高性能であったり、複雑な処理を行うことができたり、プロジェクトごとに様々な特徴を持っています。

この記事では、新興のLayer1プロジェクトであるAleph Zeroのバリデータのセットアップ方法について紹介していきたいと思います。

Aleph Zeroは1秒程度でトランザクションが完了できる(Wallet to Wallet)という、転送速度が非常に高速なブロックチェーンであり、極めてユーザ体験が良いプロジェクトの一つです。

実際に別のウォレットへトランザクションを発行した場合、即座にその結果が反映されることがわかることでしょう。

今回はAleph Zeroバリデータノードのセットアップについての紹介なので、プロジェクトの詳細については省きます。

詳しい情報を知りたい方は公式サイトをご覧ください。

各種設定は基本的にテストネットとほとんど同じです。

セットアップ

バリデータノードに関する詳細なドキュメントは、以下のページを参照してください。トラブルシューティングも用意されています。

他にもAleph ZeroのDiscordではバリデータ関連情報を含む様々な会話が行われていますので、何らかの問題が発生した場合は質問することができます。更に過去の会話を検索すると、問題解決に対して非常に有用な情報を入手できる場合が多いです。

今回のバリデータノードに利用するサービスはVultrです。

使い方については当サイトでも既に紹介しているため、利用する際は参考にして下さい。

AlephZeroのネットワークをより強固にするためにも、専用サーバであるベアメタルサーバを利用します。

使用する構成は以下のとおりです。

  • Bare Metal Servers
    • Tokyo
    • Ubuntu 22.04 LTS x64
    • Intel E-2288G
    • RAID 1
    • Enable IPv6

ベアメタルではなくクラウドサーバでも問題はありませんが、一定のスペックを大幅に満たさない場合では健全なネットワークを阻害するため、保護のためにシステムによって弾かれてしまう可能性があります。

推奨とされるバリデータノードのスペックは以下のとおりです。

  • CPU: modern desktop x86_64 (Intel, AMD) processor with at least 8 cores
  • RAM: 32GB
  • Storage: 2TB NVMe SSD
  • Network: 100+Mbps

そしてバリデータノードの設置で必要となるAZEROは25000です。

AZEROはKucoinやMEXC、Gateなど複数の取引所に上場しているため、各自好きな場所で用意してください。

初期設定

ベアメタルサーバではカスタムISOが使えないため、Vultr側が用意しているUbuntuを使用して自動インストールを行います。

インストールには少々時間がかかる場合があり、ベアメタルの場合、インストール後もログインを行えるようにまでにある程度時間がかかります。仮に全くログインできない場合はサーバの再起動やOSの再インストールを試してみて下さい。

ログインにはSSHクライアントソフトウェアであるTeratermを用います。

インストール後、サーバに設定されたrootユーザとパスワードでログインします。

ただし、rootユーザの利用はセキュリティ上好ましくないため、新しくユーザを作成してそのユーザでsudoを使用可能にして最終的にrootログインは廃止します。

では最初に新規ユーザを追加します。この時点ではrootユーザしか使えないため、rootのままログインします。

USERNAMEには好きな名前を入れて下さい。

# adduser USERNAME

実行後、パスワードを聞かれます(確認含め2回)。

プロフィールを聞かれる場合は自由に入力できますが、すべて空欄でも問題はありません。

最後にIs the information correct?と聞いてくるため、Yesと入力することで作成完了します。

次にsudoグループを作成し、先程作ったユーザ名をそれに加えます。

# usermod -G sudo USERNAME

グループ内の確認は$ group USERNAMEで確認できます。

これにより、新しく追加したユーザ名でログインすることが可能となったため、正しく追加できたかログインしてみてください。

その後、$ sudo vim /etc/ssh/sshd_configを編集して以下のように変更を加えることで、rootログインおよびパスワードを使ったログインができなくなります。

PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes

これで一定の安全は確保されましたが、鍵認証の追加など、よりセキュアにしたい場合は以下のページを参考にしてください。

後ほど紹介しますが、公式ドキュメントにもバリデータノードのセキュリティについての記事があります。

もしUFWの設定でポートを基本DENYに設定した場合は、一部のポートを許可する必要があります。

$ sudo ufw allow 9933,9944,30333,30343/tcp

上記ポートはノードの実行に必要なので許可しておきます。

設定後はリロードして設定を反映させます。

$ sudo ufw reload

Dockerのインストール

AlephZeroのバリデータノードを動かすには、コンテナ仮想化を行うプラットフォームであるDockerが必要です。

幸いにも、手軽にDockerのインストールを行うことができるシェルスクリプトが用意されているため、すぐに導入することができます。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ DRY_RUN=1 sudo sh ./get-docker.sh
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

これらを実行することでDockerのインストールが完了します。

$ docker -vを実行すると現在のDockerバージョンをチェックできます。

なお、一般ユーザでdocker関連のコマンドを実行するにはsudoが毎回必須となるため、一般ユーザをdockerグループに追加することで実行可能となります。

USERNAMEは追加したユーザ名に変更してください。

$ sudo groupadd docker
$ sudo usermod -g docker USERNAME
$ sudo /bin/systemctl restart docker.service

以上のコマンドを実行後、$ exitで一旦コンソールから抜けてもう一度ログインします。

これにより、sudo無しでも一般ユーザはdockerを実行できます。

Aleph Node Runnerのインストール

AlephZeroノードの実行ソフトウェアのインストールも非常に手軽です。

これもシェルスクリプトが用意されているため、コマンドを実行するだけで導入できます。

NODENAMEは自由にノード名を付与し、YOURPUBLICIPには使用しているサーバのパブリックIPアドレスを入力します。

$ git clone https://github.com/Cardinal-Cryptography/aleph-node-runner
$ cd aleph-node-runner
$ ./run_node.sh -n NODENAME  --ip YOURPUBLICIP --mainnet

最後の--mainnetが無い場合は、テストネットのデータベースがダウンロードされるのでご注意ください。

最初にノード実行を行うためのツールを複製し、最後にシェルスクリプトを実行することで、様々なダウンロードが行われます。

この時、ブロックチェーンデータベースのスナップショットも取得されるため、ストレージには数百GB以上が必要です。サイズが大きいため、ダウンロードには1時間以上かかる場合があります。更に展開作業もあります。

データベースのダウンロードおよび展開完了後、以下のようなメッセージが表示される場合があります。

Performing session key checks...
Stash account not provided. This is ok if you're running the script for the first time but recommended for subsequent runs.
Are you sure you want to skip the session keys check? [y/N]

これはスタッシュアカウント(メインの残高アカウント)が提供されていないために表示していますが、スクリプトの初回実行時では問題はありませんのでyを入力してスキップします。

すると通常のコンソール画面に戻ることになりますが$ docker logs NODENAMEによりノードの実行ログを参照することができます。

ログ内にエラーが発生していなければ、ノードは正常に実行されています。

以下のページで説明しているように、SyncingIdleImported等の項目が表示されていれば問題ありません。

もしノードを停止する場合には$ docker stop NODENAMEでストップします。

その後、再度動作させるならば$ docker start NODENAMEでOKです。

ノードのアップデート

ノードをアップデートする場合は、まず$ docker stop NODENAMEを実行します。

停止したら$ ./run_node.sh -n NODENAME --ip YOURPUBLICIP --mainnetを実行します。

これにより自動的にアップデートが適用され、その後はそのままノードが稼働します。

セッションキーの生成

バリデータノードは作成できましたが、スタッシュアカウントおよびコントローラーアカウントを紐づけしなければなりません。

それを行うにはセッションキーの生成が必要です。

バリデータノード側でGUI操作が可能があればポータルで設定を行うことができます。

しかし、今回のやり方はGUIが利用できないため、コマンドによって生成を行います。

以下のコマンドを実行すると、0xから始まる長い文字が表示されますが、これがセッションキーとなっているのでコピーします。

curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "author_rotateKeys"}' http://127.0.0.1:9933

もしNominatorsが既にセットされている場合は、NetworkからStakingにあるAccounts内に表示されているStashesから停止するものを選んでStopを実行します。

この実行を行う際はトランザクションを完了する必要があり、実行する側には少額の手数料(AZERO)が必要です。

トランザクションが完了すればSet Session Keysが表示されますので、それを選択してバリデータノードのセッションキーをKeys from rotateKeys内にペーストしてSet Session Keysを選びます。

こちらもトランザクションが完了すると、Nominateの隣にValidateが表示されるようになります。

Validateを選ぶとバリデータ設定画面が出てきますのでreward commission percentageには設定したい手数料を数値(最大100)で入力します(執筆時点で最低手数料は2)。

数値は自由ですが、低い方が選ばれやすくなります。

設定完了後、Validateを選びトランザクションが完了すれば、バリデータの紐づけとして作動したままステーキングが行われます。

この時、Staking内に表示されているエラ(era)が更新されるまで(およそ24時間ごと)はネットワークには反映されないことに注意して下さい。

そしてeraをまたぐことで、バリデータは完全にネットワークへの参加を行うことができます。

待機中のバリデータに関してはWaitingタブ内に表示されます。

アイデンティティの設定

バリデータはそのままでネットワークに参加できますが、バリデータアドレスにアイデンティティを設定することでより他者へのアピールを行えます。

これはAccount内のアドレスで縦3本のアイコンを選び、オンチェーンアイデンティティをセットするを選択することで設定可能です。

2022/12/07現在では基本アイデンティティとして、表示名名前emailwebtwitterriot名を設定することができます。

更にカスタムアイデンティティを追加したい場合はDeveloperからExtrinsicsセクションに移動し、identityからsetIndentity(info)で追加のアイデンティティをセットできます。

編集が完了したらアイデンティティをセットするを選び、トランザクションが完了することで反映されます。

アイデンティティのセット内容は完全に自由ですが、最低でも表示名は変えておくことをおすすめします。

セキュリティ設定

バリデータノードは外部に公開されているため、セキュリティは非常に重要です。

脆弱な状態では、攻撃対象となったときに何らかの問題を引き起こす場合があります。

公式ドキュメントではバリデータノードの基本的なセキュリティに関する情報も公開されているため、一度閲覧して対策することをおすすめします。

ドキュメントでは、高可用性、安全、モニタリングの3つを掲げています。

高可用性

まず高可用性とはノードのダウンタイム(停止時間)がなるべく発生しないことを指します。

健全なネットワークを動かすにはノードが停止することは避けるべきであり、バリデータノードにオフライン状態は望まれていません。

AlephZeroではオフラインになっていてもスラッシュ(排除対象)となることはありませんが、可能な限りオンラインであることが必要です。

公式ドキュメントでは以下の推奨事項が記述されています。

  • 高品質のハードウェアで実行し、仮想環境(Virtual Machine)よりもベアメタルを利用する
  • 安定した高速インターネットを確保
  • 十分なディスク容量を確保する

バリデータノードは長期間にわたって実行される必要があることから、品質の高い状態が推奨されています。

なお、冗長性を持たせることは一見良いように見えますが、バリデータノードでは推奨されていません。

理由として、冗長性を設定してしまった場合はノード間でセッションキーを共有する必要があることから、セキュリティリスクが大きくなってしまいます。

更に、同じセッションキーを持った両方のノードがコンセンサスに参加してしまった場合、ネットワークの健全さを損なうことから、スラッシュの対象となるおそれもあります。

そのため、バリデータノードに冗長性は持たせることは良くありません。

安全

セッションキーはバリデータノードにとって非常に大切な情報です。

セッションキーが外部に流出した場合、悪意ある行動が発生するおそれがあります。

公式ドキュメントでは、標準的なセキュリティプラクティスに従うことをおすすめしています。

  • ファイアウォールをセットアップし、必要なポートのみを外部に公開する
    • 基本的には30333とSSHアクセス用のポート
  • SSHポートをデフォルトの22から変更する
  • SSHのログインはパスワード認証を廃止し、鍵認証のみを使う
  • マシンへ物理的にアクセスできる場合はSSH自体を使わない
  • rootアカウントの使用を行わない

これらが完全に安全なセキュリティ対策となるわけではありませんが、被害の発生を防ぐためにも最低限の安全を確保することが望ましいでしょう。

モニタリング

長期間ノードを稼働させることから、モニタリングも重要です。

  • Grafana
  • テレメトリ
  • ログ

公式ドキュメントでは、以上の3つを組み合わせてノードを監視することを勧めています。

まずGrafanaとは視覚化された分析を行えるプラットフォームであり、これを使うことで手軽に監視を行うことができます。

これはAlephZero公式から推奨ツールとして挙げており、テンプレートも用意されています。

次にテレメトリですが、これはノードが定期的に発するシグナルであり、シェルスクリプトからノードを導入した場合は自動的に有効化されています。

テレメトリはノードの状態を確認するために重要な要素であるため、無効化することは推奨されていません。

テレメトリは以下のページで確認できます。

そしてログですが、これはノードからのテキストログは何らかの問題が発生した際、問題解決に大きな役割となります。

  • エラーメッセージ
  • メッセージの欠如
  • ノードの遅れ

ログを閲覧することで、問題が発生したことを詳細に確認できるため非常に大切な情報です。

おわりに

少々荒削りな記事内容となりましたが、公式ツールによって手軽に導入できるスタイルであることから、大変楽にバリデータノードをセットアップすることができます。

注意点として、バリデータノードを立てた直後はステーキング報酬を請求する者が少ないため、payoutタブでera更新ごとに請求しないと報酬を獲得していない場合があります。

ぜひともバリデータノードを立てて手数料収入を得つつ、健全なネットワークの構築に貢献してみてください。

参考資料