はじめに
年々多くの人々に知られつつある暗号通貨(仮想通貨、暗号資産)界隈ですが、特に有名なビットコインやイーサリアムの他にも多くのプロジェクトが存在します。
それらはビットコイン等と比べて非常に高性能であったり、複雑な処理を行うことができたり、プロジェクトごとに様々な特徴を持っています。
この記事では、新興のLayer1プロジェクトであるAleph Zeroのバリデータのセットアップ方法について紹介していきたいと思います。
Aleph Zeroは1秒程度でトランザクションが完了できる(Wallet to Wallet)という、転送速度が非常に高速なブロックチェーンであり、極めてユーザ体験が良いプロジェクトの一つです。
実際に別のウォレットへトランザクションを発行した場合、即座にその結果が反映されることがわかることでしょう。
今回はAleph Zeroバリデータノードのセットアップについての紹介なので、プロジェクトの詳細については省きます。
詳しい情報を知りたい方は公式サイトをご覧ください。
Aleph Zero: New Generation Blockchain for the Enterprise
About Aleph Zero
Aleph Zero Testnet Launch and Validator Requirements
各種設定は基本的にテストネットとほとんど同じです。
- Running an Aleph Node on Testnet
セットアップ
バリデータノードに関する詳細なドキュメントは、以下のページを参照してください。トラブルシューティングも用意されています。
Downloading and running the node
Troubleshooting
他にもAleph ZeroのDiscordではバリデータ関連情報を含む様々な会話が行われていますので、何らかの問題が発生した場合は質問することができます。更に過去の会話を検索すると、問題解決に対して非常に有用な情報を入手できる場合が多いです。
- Aleph Zero Discord
今回のバリデータノードに利用するサービスはVultrです。
使い方については当サイトでも既に紹介しているため、利用する際は参考にして下さい。
- とっても優秀な海外VPS『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など複数の取引所に上場しているため、各自好きな場所で用意してください。
- Aleph Zero (AZERO)
初期設定
ベアメタルサーバではカスタム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
これで一定の安全は確保されましたが、鍵認証の追加など、よりセキュアにしたい場合は以下のページを参考にしてください。
- Ubuntu20.04のInstallおよびSSH、FTP設定【第一回】セキュアなSSH設定
後ほど紹介しますが、公式ドキュメントにもバリデータノードのセキュリティについての記事があります。
- Securing your validator
もしUFWの設定でポートを基本DENYに設定した場合は、一部のポートを許可する必要があります。
$ sudo ufw allow 9933,9944,30333,30343/tcp
上記ポートはノードの実行に必要なので許可しておきます。
設定後はリロードして設定を反映させます。
$ sudo ufw reload
Dockerのインストール
AlephZeroのバリデータノードを動かすには、コンテナ仮想化を行うプラットフォームであるDockerが必要です。
- Install Docker Engine on Ubuntu
幸いにも、手軽に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
によりノードの実行ログを参照することができます。
ログ内にエラーが発生していなければ、ノードは正常に実行されています。
以下のページで説明しているように、Syncing
やIdle
、Imported
等の項目が表示されていれば問題ありません。
- Verifying your setup
もしノードを停止する場合には$ docker stop NODENAME
でストップします。
その後、再度動作させるならば ノードをアップデートする場合は、まず 停止したら これにより自動的にアップデートが適用され、その後はそのままノードが稼働します。$ docker start NODENAME
でOKです。ノードのアップデート
$ docker stop NODENAME
を実行します。$ ./run_node.sh -n NODENAME --ip YOURPUBLICIP --mainnet
を実行します。
セッションキーの生成
バリデータノードは作成できましたが、スタッシュアカウントおよびコントローラーアカウントを紐づけしなければなりません。
それを行うにはセッションキーの生成が必要です。
- Making the node validate
バリデータノード側でGUI操作が可能があればポータルで設定を行うことができます。
- Aleph Zero/Substrate Portal
しかし、今回のやり方は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現在では基本アイデンティティとして、表示名
、名前
、email
、web
、twitter
、riot名
を設定することができます。
更にカスタムアイデンティティを追加したい場合はDeveloper
からExtrinsics
セクションに移動し、identity
からsetIndentity(info)
で追加のアイデンティティをセットできます。
編集が完了したらアイデンティティをセットする
を選び、トランザクションが完了することで反映されます。
アイデンティティのセット内容は完全に自由ですが、最低でも表示名は変えておくことをおすすめします。
セキュリティ設定
バリデータノードは外部に公開されているため、セキュリティは非常に重要です。
脆弱な状態では、攻撃対象となったときに何らかの問題を引き起こす場合があります。
公式ドキュメントではバリデータノードの基本的なセキュリティに関する情報も公開されているため、一度閲覧して対策することをおすすめします。
- Securing your validator
ドキュメントでは、高可用性、安全、モニタリングの3つを掲げています。 まず高可用性とはノードのダウンタイム(停止時間)がなるべく発生しないことを指します。 健全なネットワークを動かすにはノードが停止することは避けるべきであり、バリデータノードにオフライン状態は望まれていません。 AlephZeroではオフラインになっていてもスラッシュ(排除対象)となることはありませんが、可能な限りオンラインであることが必要です。 公式ドキュメントでは以下の推奨事項が記述されています。 バリデータノードは長期間にわたって実行される必要があることから、品質の高い状態が推奨されています。 なお、冗長性を持たせることは一見良いように見えますが、バリデータノードでは推奨されていません。 理由として、冗長性を設定してしまった場合はノード間でセッションキーを共有する必要があることから、セキュリティリスクが大きくなってしまいます。 更に、同じセッションキーを持った両方のノードがコンセンサスに参加してしまった場合、ネットワークの健全さを損なうことから、スラッシュの対象となるおそれもあります。 そのため、バリデータノードに冗長性は持たせることは良くありません。 セッションキーはバリデータノードにとって非常に大切な情報です。 セッションキーが外部に流出した場合、悪意ある行動が発生するおそれがあります。 公式ドキュメントでは、標準的なセキュリティプラクティスに従うことをおすすめしています。 これらが完全に安全なセキュリティ対策となるわけではありませんが、被害の発生を防ぐためにも最低限の安全を確保することが望ましいでしょう。 長期間ノードを稼働させることから、モニタリングも重要です。 公式ドキュメントでは、以上の3つを組み合わせてノードを監視することを勧めています。 まずGrafanaとは視覚化された分析を行えるプラットフォームであり、これを使うことで手軽に監視を行うことができます。 これはAlephZero公式から推奨ツールとして挙げており、テンプレートも用意されています。 次にテレメトリですが、これはノードが定期的に発するシグナルであり、シェルスクリプトからノードを導入した場合は自動的に有効化されています。 テレメトリはノードの状態を確認するために重要な要素であるため、無効化することは推奨されていません。 テレメトリは以下のページで確認できます。 そしてログですが、これはノードからのテキストログは何らかの問題が発生した際、問題解決に大きな役割となります。 ログを閲覧することで、問題が発生したことを詳細に確認できるため非常に大切な情報です。高可用性
安全
モニタリング
おわりに
少々荒削りな記事内容となりましたが、公式ツールによって手軽に導入できるスタイルであることから、大変楽にバリデータノードをセットアップすることができます。
注意点として、バリデータノードを立てた直後はステーキング報酬を請求する者が少ないため、payout
タブでera更新ごとに請求しないと報酬を獲得していない場合があります。
ぜひともバリデータノードを立てて手数料収入を得つつ、健全なネットワークの構築に貢献してみてください。
参考資料
Dockerを一般ユーザで実行する
【Linux】rootでのログイン禁止と一般ユーザ作成の手順