Update 2023/3/30

Symbol ノードの構築方法

目次

  • Symbol ノードについて
  • ノードの特徴とサーバの基本スペック
  • Symbol Node 構築手順
  • Tips

Symbol ノードについて

ブロックチェーンのノードは、取引データを時系列順に記録し、過去の内容を確認できます。分散型台帳として複数のノードが同じデータを共有しており、誰でも取引データなどを閲覧できます。Symbol のブロックチェーンは、世界中のノードネットワークによって構築・維持されています。ノードはトランザクションを実行し、検索を行い、そのデータをブロック単位で台帳に記録します。

ノードの特徴とサーバの基本スペック

Symbol の ノード は以下の3つの種別があります。順に説明します。
  • Peer Node
  • API Node
  • Voting Node

Peer Node

Harvester ノードとも呼ばれ、ネットワークを支えています。主にトランザクションを検証して、ブロックチェーンに新しいブロックを追加し、その過程で手数料を徴収します。
strapi-blog-api-image

API Node

API ノードの主な役割は、データを MongoDB に読み取り可能な形式で保存することです。 API ノードは アグリゲートボンドトランザクション の連署名を集める役割も果たし、それが完成したときにだけ処理されます。
strapi-blog-api-image
※ 1つのノードで Peer Node と API Node の両方を同時に稼働させることが出来ます。その場合はDual Node と表現されます。

Voting Node

Symbol では ファイナライズを実現する手段として Voting Node が用意されています。 Voting Node は 300万xym を保有したユーザーのみが構築できます。ブロックがファイナライズされるとブロックが確定されたとみなされます。Symbol におけるファイナライズは pBFT を元に実装され、 67% 以上の Voting Node による承認を経てそれが行われます。例えば金融機関がブロックチェーン上で決済処理を実装する場合、生成されたブロックが変更されない事を保証する必要があります。ファイナライズを活用する事で金融機関はブロックが確定された事を知る事ができ、決済処理を円滑に実装する事ができます。
なお、Symbol Blockchain において Voting Node はオプションです。新規にネットワークを構築する際にネットワークの設定にて OFF にする事ができ、1つのプラグインの位置付けとなっています。ファイナライズが停止されていても、PoS+ のロジックに基づきブロックは生成され続けます。ファイナライズのユースケースとして、Blockchain 上で事業を行いたい組織や業界は Voting Node を運用し、管理する事で、 堅牢なPoS+ チェーン上に更にファイナライズ機能を起動させ、業界内等でブロック確定タイミングの共通認識を用いる事ができ、運用し易いパブリック・コンソーシアムチェーンを実行する事ができます。

Symbol Node 構築手順

以下環境のサーバーを手配下さい。なお、サーバーの運用に不安がある場合は、 Allnode というサービスの利用を検討下さい。Linux OS は Debian 以外のディストリビューションも利用可能ですが、以下に記載するサンプルスクリプトは Debian の前提でサンプルコードを記述しております。
  • 必須ハードウェアスペック以上のサーバー(別表)
  • Debian OS 10 以上
  • PORT 80, 443, 3000, 3001, 7900

(別表)必須ハードウェアスペック

以下に必須要件を示します。
Minimum SpecsPeer NodeAPI NodeDual / Voting
CPU2 Core4 Core4 Core
RAM8 GB16 GB16 GB
Disk Size500 GB750 GB750 GB
Disk IOPS1500 IOPS SSD1500 IOPS SSD1500 IOPS SSD
  次の表に推奨要件を示します。これらを使用すると、よりスムーズなエクスペリエンスが提供され、ある程度の将来的な保証が提供されます。
Recommended SpecsPeer NodeAPI NodeDual / Voting
CPU4 Core8 Core8 Core
RAM16 GB32 GB32 GB
Disk Size500 GB750 GB750 GB
Disk IOPS1500 IOPS SSD1500 IOPS SSD1500 IOPS SSD

普段サーバーを構築されない方への注意点

必ず以下のセキュリティ対策を行ってからノード構築を行ってください。セキュリティ対策が不十分だと自分以外の人に勝手にアクセスされる可能性があります。
  • ファイアーウォールの設定
  • SSH通信の場合は root ログインの禁止し、かつ公開鍵での認証を行う
  • PORT は 22, 80, 3000, 3001, 7900 以外は原則閉じて下さい

ポートの用途

22: SSH 接続。作業用 80: Let’s Encrypt + Symbol Node List 3000: HTTP REST Gateway 3001: HTTPS REST Gateway 7900: catapult-client によるノード間の通信

サーバーの初期設定

サーバーに接続し、初めにサーバーに操作用のアカウントを作成します。
adduser symbol
usermod -aG sudo symbol
su - symbol

必要なソフトウェアのインストール

以下スクリプトを実行し、環境を構築します。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/ymuichiro/symbol-node-builder/main/scripts/install.sh)"
通常以下の作業を必要としますが、上記スクリプトにより自動的に設定を実施します。
  • nvm, node.js 16, npm のインストール
  • docker, docker-compose のインストール
  • npm による symbol-bootstrap のインストール
  • ~/symbol-bootstrap/** フォルダの作成

Symbol-Bootstrap の起動とセットアップ

以下のコマンドにより Symbol-bootstrap を起動します。
cd ~/symbol-bootstrap
symbol-bootstrap wizard
 
  1. ネットワーク選択 どのネットワークでノードを建てるか選びます。
Select a network: (Use arrow keys)
❯  Mainnet Node
    Testnet Node
    Bootstrap Local Network
    Custom Network Node ('custom-network-preset.yml' file and 'nemesis-seed' folder are required)
  2. ノードの種類を選択 ノードの種類を選びます
Select an assembly: (Use arrow keys)
❯ Dual Node
  Peer Node
  Api Node
  Demo Node. A dual node that includes a Faucet and Explorer.
  3. 秘密鍵を扱うのでオフラインを推奨しています。VPSなどはインターネットと繋がっていないと使えないので、Yを押して進みます。
? Symbol Bootstrap is about to start working with sensitive information (private keys) so it is highly recommended that
you disconnect from the network before continuing. Say YES if you are offline or if you don't care. (Y/n)
  4. Symbol bootstrap で使用するパスワードを入力します。
Enter the password used to encrypt and decrypt custom presets, addresses.yml, and preset.yml files. When providing a
password, private keys will be encrypted. Keep this password in a secure place!
  5. ハーベスト設定を行うには4つのアカウントが必要です。そのうちの main アカウントを指定します。新しく作成するか、既存アカウントの秘密鍵を入力します。
? How do you want to create the Main account: (Use arrow keys)
❯ Generating a new account
   Entering a private key
   Enter the 64 HEX private key of the Main account (or press enter to select the option again).
  6. 5 で秘密鍵を入力した場合、 アカウントのアドレスが表示されます。相違が無ければ y を選択します。
? Is this the expected address TCDNP*******************55KCQ to used as Main account?  (y/N)
  7. main と同じく Transport account も指定します。
? How do you want to create the Transport account: (Use arrow keys)
❯ Generating a new account
  Entering a private key
  8. VRF アカウントも同様です。
? How do you want to create the VRF account: (Use arrow keys)
❯ Generating a new account
   Entering a private key
  9. Remote アカウントも同様です。
? How do you want to create the Remote account: (Use arrow keys)
❯ Generating a new account
  Entering a private key
  10. HTTS の設定を行います。2番目の Automatic ~ を 選択すると自動でHTTPS設定が可能です。
Your REST Gateway should be running on HTTPS (which is a secure protocol) so that it can be recognized by the Symbol Explorer.
? Select your HTTPS setup method: (Use arrow keys)
❯ Native support, I have the SSL certificate and key.
   Automatic, all of your keys and certs will be generated/renewed automatically, using letsencyrpt.
   None
  11. ホスト名を入力します。IP アドレス、もしくはドメインを指定します。
? Enter the public domain name(eg. node-01.mysymbolnodes.com) that's pointing to your outbound host IP This value is
required when you are running on HTTPS!
  12. フレンドリーネームを入力します。
Enter the friendly name of your node.
  13. 4種類あるアカウント(キー)のうち何種類暗号化するか選択します。
? Select the type of security you want to use: (Use arrow keys)
   PROMPT_MAIN: Bootstrap may ask for the Main private key when doing certificates upgrades. Other keys are encrypted.
❯ PROMPT_MAIN_TRANSPORT: Bootstrap may ask for the Main and Transport private keys when regenerating certificates. Other
keys are encrypted. Recommended for most nodes
   ENCRYPT: All keys are encrypted, only password would be asked
  15. 投票ノードを登録するか選択します。 300万 xym を保有していなければ投票ノードになることはできません。
? Are you creating a Voting node? (y/N)
全ての質問に答えると ~/custom-preset.yml が完成します。デフォルトでは beneficiaryAddress が指定されていません。ファイルを開き、正しい値を指定します。以下にサンプルを示します。
assembly: dual
preset: mainnet
privateKeySecurityMode: PROMPT_MAIN_TRANSPORT
nodes:
    -
        host: example.org
        maxUnlockedAccounts: 30
        beneficiaryAddress: ${your-symbol-address}
        voting: false
        friendlyName: ${your-name}
        mainPrivateKey: ${your-node-main-privatekey}
        vrfPrivateKey: ${your-node-vrf-privatekey}
        remotePrivateKey: ${your-node-remote-privatekey}
        transportPrivateKey: ${your-node-transport-privatekey}
httpsProxies:
    -
        excludeDockerService: false
host … ノードに割り当てているIPアドレス、もしくはドメインを入力します。 maxUnlockedAccounts … ノードへ委任可能なアドレス数の上限を指定します。 beneficiaryAddress … ノードが受け取ったハーベティング報酬の支払い先アドレスを指定します friendlyName … 任意のノードの名前を指定します。

Symbol-Node の起動

以下のコマンドを実行し、~/custom-preset.yml を読み込ませ、 symbol-bootstrap を起動します。
cd ~/symbol-bootstrap
symbol-bootstrap config -p mainnet -a dual -c custom-preset.yml
symbol-bootstrap start -d
symbol-bootstrap healthCheck
なお symbol-bootstrap による起動、停止コマンドの一覧を以下に記載します。
symbol-bootstrap start -d 初めて起動する際にのみ指定します。 symbol-bootstrap run -d 2回目以降の起動時に指定します。 symbol-bootstrap stop 一時停止する際に指定します。 run コマンドで再開できます。
-d を指定するとバックエンドで起動させる事が出来るようになります。symbol-bootstrap がエラーとなり、debug をしなければならない時を除いて原則 -d は付与下さい。
本作業により symbol-bootstrap の新規構築は完了となります。2023年3月時点では新規に symbol-bootstrap を起動し、ブロックの全ての同期が完了するまで約 1日半〜2日程必要とします。委任者の募集を行う場合は全てのブロックが同期された段階にて実施しましょう。
以降、各種 tips を記載致します。

Tips

ノード証明書の更新

ノード証明書はノードを建てて約1年後に期限切れになります。ノード証明書を更新しないノードは無効になるので注意してください。
  1. healthCheck でノードSSL証明書の期限を確認する
symbol-bootstrap healthCheck

> he node.crt.pem certificate for node node will expire on Aug  2 14:30:34 2023 GMT. No need to renew it yet.
  1. 証明書を更新する
symbol-bootstrap renewCertificates

Symbol Node list で ノードの情報を表示する

Symbol node list には自身のノードの情報を掲載する事ができます。掲載方法は2種類があります。
  1. 手数料を支払っての登録(推奨)
コメント登録 ページへアクセスし、掲載情報を作成して、10xym(2023/03/09時点の手数料額)を支払う事で反映されます。
  1. ノード上に nodeSetting.json を設置しての登録
手数料不要にて指定することができます。サーバーを自前で保有し、サーバー上で設定が可能な方は本方法を選択出来ます。以下の手順についてやり方に自身のない場合は 1 の手順をお勧め致します
設置方法
  • ノードの以下のパスへコンフィグファイルを設置します
    • http://xxx.xxx.xxx.xxx:80/nodeSetting.json
  • symbol-bootstrap は稼働中 80, 443 ポートも listen されています。よって以下、もしくは同等の操作をする必要があります。
    • ~/symbol-bootstrap/target/docker/docker-compose.yml を編集し、nginx の パス上に nodeSetting.json がマウントされるよう、ボリューム情報を書き換えます
    • symbol-bootstrap compose 等でコンテナを再構築し、ノードを起動します
※ 本手順は symbol-bootstrap のアップデートや preset の更新時に docker-compose.yml ファイルが上書きされてしまう為、都度再登録が必要となります。
※ Allnodes をご利用の方は 2 は利用できません

MongoDBのインデックス見直し

以下に参考記事を掲載します
https://qiita.com/nem_takanobu/items/8e39cc02df1b7adccfee

custom-preset.yml を更新したとき

symbol-bootstrap を運用しているうちに、custom-preset.yml を変更する事があります。その際にはファイルの更新後、以下のように実行し変更を反映する必要があります。
symbol-bootstrap stop
symbol-bootstrap config -p mainnet -a dual -c custom-preset.yml --upgrade
symbol-bootstrap compose --upgrade
symbol-bootstrap run -d

ノードのエラー発生時原因の確認方法

何らかの原因でノードがダウンしたとき、エラー原因を確認するには幾つかの方法があります。
  1. symbol-bootstrap のログ出力を確認する
symbol-bootstrap を起動する際に、-d オプションを除外する事でログを確認しつつ起動する事ができます。以下の通り実行する事でログを閲覧する事ができます。
symbol-bootstrap run
  1. docker のログ機能を利用する
1 の手順は問題として全てのコンテナのログが出力される為、量が膨大です。以下のコマンドを実行する事で障害の発生しているコンテナを確認する事ができます。
symbol-bootstrap stop
symbol-bootstrap run -d
docker ps -a
なお、正常な場合は以下のような出力となります。サンプルとして記載します。
symbol@xxxxxxxxxxxxxxxxxxx:~$ docker ps -a
CONTAINER ID   IMAGE                                      COMMAND                  CREATED        STATUS        PORTS                                                                        NAMES
8d44313c93d6   steveltn/https-portal:1.19                 "/init"                  40 hours ago   Up 40 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:3001->443/tcp, :::3001->443/tcp   https-proxy
71fa6d455cf6   symbolplatform/symbol-server:gcc-1.0.3.5   "/bin/bash /symbol-c…"   40 hours ago   Up 40 hours   0.0.0.0:7900->7900/tcp, :::7900->7900/tcp                                    node
542ca6019607   symbolplatform/symbol-server:gcc-1.0.3.5   "/bin/bash /symbol-c…"   2 days ago     Up 40 hours                                                                                broker
5b6765426fd2   symbolplatform/symbol-rest:2.4.2           "docker-entrypoint.s…"   2 days ago     Up 40 hours   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp                                    rest-gateway
19c9ac8edce9   mongo:4.4.3-bionic                         "docker-entrypoint.s…"   2 days ago     Up 40 hours   27017/tcp                                                                    db
もし STATUS が Exec(0) となっているコンテナがある場合、そこでエラーが発生しています。該当コンテナのみログを確認する場合は以下の通り実行します。${CONTAINER ID} は Exec(0) と出力されたコンテナのIDを指定します。
docker logs ${CONTAINER ID}

リンク


News
Community
Docs
Contact