Symbolノード構築完全ガイド:Symbol Shoestringを活用したハーベストの始め方
Post Image

Symbolは、次世代のブロックチェーン技術を活用し、効率的かつ柔軟なトランザクション管理を提供するプラットフォームです。その中でも「ハーベスト」という独自の報酬システムは、ノード運営者にとっても、XYMを保有するユーザーにとっても大きな魅力です。

Symbolのネイティブ通貨であるXYMの最大供給量は約90億枚に設定され、そのうち17億枚はインフレ報酬として100年かけて段階的に発行される設計となっています。XYMを10,000枚以上保有するユーザーであれば、誰でも「ハーベスト」を行うことが可能で、インフレ報酬やトランザクション手数料の一部を獲得するチャンスがあります。

さらに、ノード運営者は、自分のノード上で「ハーベスト」を行うユーザーが得た報酬の25%をノード運営費用として徴収する仕組みになっています。つまり、ノード運営者にとっては、より多くの「ハーベスト」参加者が自身のノードを利用することで、得られる収益も増加する仕組みです。

本記事では、Symbolノードを構築し、「ハーベスト」を活用するための具体的な手順を記録しています。

Symbol Shoestringによるノード構築

コア開発者Jaguar氏により、新規のノード構築には、"Symbol Shoestring"*を用いることが推奨されています。(参考)

Symbol Shoestringのインストール

pip install symbol-shoestring

ノードデータが保存されるディレクトリの作成

mkdir symbol-shoestring
cd symbol-shoestring

CA(Certificate Authority)プライベートキーの発行

ノード間での通信やAPIエンドポイントへのアクセスを暗号化するために必要なCA(Certificate Authority)プライベートキーを発行します。

openssl genpkey -algorithm ed25519 -outform PEM -out ca.key.pem

ネットワーク設定ファイルの作成

ネットワークの設定テンプレートをダウンロード

python -m shoestring init --package mainnet ./shoestring.ini
  • --package mainnet:
    メインネットでのノード構築になります。(テストネットは、--package sai)
    ネットワークの設定に必要なテンプレートをダウンロードします。
    各自shoestring.iniを修正し、独自のノードを築きます。
    恐らく、以下を修正することになろうかと。

[node]

features = <features>
userId = 1000
groupId = 1000
caPassword =
apiHttps = false

caCommonName = <caCommonName>
nodeCommonName =  <nodeCommonName>
  • features: API|HARVESTER
  • caCommonName: CA(Certificate Authority)プライベートの名前 適当に'CA'等で良いかもしれません。
  • apiHttps = false
    3001ポートで、https接続可能にするためには、true
    trueにすると、別途、https-portalコンテナも立ち上がります。
    nginxを自身で起動して、設定する場合はfalse にします。
  • nodeCommonName: FDQN(www.example.com) ドメイン名を指定します。

設定上書きファイルの作成

各自の設定の多くは、こちらで書き換えます。

touch overrides.ini 

ファイル作成後

[user.account]
enableDelegatedHarvestersAutoDetection = true

[harvesting.harvesting]
maxUnlockedAccounts = 5
beneficiaryAddress = 

[node.node]
minFeeMultiplier = 100

[node.localnode]
host = 
friendlyName = 
  • enableDelegatedHarvestersAutoDetection:
    デフォルトはfalseですが、trueに変更
  • maxUnlockedAccounts:
    ハーベスト委任者の最大アカウント数
  • beneficiaryAddress:
    重要です!アカウント名を記載ください。 記載しない場合は、インフレ報酬の25%が取得できません。 サーバー運営がボランティア活動と化します。
  • minFeeMultiplier:
    デフォルト100
  • host:
    のちに、python -m shoestring healthノードの正常起動を確認する際にノードからアクセス可能(名前解決)できるホスト名にする。docker in dockerなどで名前解決できなければ、localhostや127.0.0.1に設定しておく。
    しかし、https://www.exaple.com:3001/node/infoで取得できるノード情報のホスト名にもなります。
  • friendlyName:
    ウォレットからのノード接続の際などに見えるノード名(適当でかまわない)

ノード起動に必要なdocker composeを含むファイルを作成

symbol-shoestring配下にノード起動に必要なファイルを作成していきます。

python -m shoestring setup --config ./shoestring.ini --ca-key-path ./ca.key.pem --directory . --overrides ./overrides.ini --package mainnet
  • --config ./shoestring.ini:
    パスとファイル名を正しく入力。
  • --ca-key-path ./ca.key.pem:
    パスとファイル名を正しく入力。
  • --directory: docker composeを含むファイルが格納されるディレクトリを指定
  • --overrides ./overrides.ini
    パスとファイル名を正しく入力。
  • --package mainnet: メインネット(テストネットの場合は、--package sai)

ノードの起動

いよいよノードを起動します。

docker compose -f ./docker-compose.yaml up -d
  • ./docker-compose.yaml:
    python -m shoestring setupで作成されたdocker-compose.yamlと異なるディレクトリで実行する場合は、ファイル名を明示します。
    docker-compose.yamlと同一ディレクトリの場合は以下で実行します。
docker compose  up -d

ノード構築に必要なコンテナが起動します。

コンテナ間を接続するネットワークとコンテナが起動します。
ノードが正常に起動しているか確かめます。

python -m shoestring health --config ./shoestring.ini --directory .
  • --config ./shoestring.ini:
    パスとファイル名を正しく入力。

  • --directory: docker composeを含むファイルが格納されるディレクトリを指定
    以下のように出力されれば、OK

  • websocket connected to ws://<FDQN>:3000/ws, subscribing and waiting for block
    shoestring.iniの設定で、apiHttps = trueとしている場合は、
    - websocket connected to ws://<FDQN>:3001/ws, subscribing and waiting for blockで接続する。

構築完了

ブロック高が最新まで完了しなくても、以下にリストされる。

サーバーが異常終了した場合の復旧方法

以下の方法は、完璧ではありません。 ただ、一からデータベースの再構築する前に試す価値はありそうという内容です。

docker compose -f ./docker-compose.yaml down
docker system prune

まず、コンテナを止めます。 次に、broker.lockファイルを削除します。

rm -rf <path>/data/broker.lock

ノードの起動

docker compose -f ./docker-compose.yaml up -d

ノードが正常に起動しているか確かめます。

python -m shoestring health --config ./shoestring.ini --directory .

万一、失敗したら、server.lockファイルを削除します。

 docker compose -f ./docker-compose.yaml down
docker system prune
rm -r <path>/data/server.lock

ノードの起動

docker compose -f ./docker-compose.yaml up -d

ノードが正常に起動しているか確かめます。

python -m shoestring health --config ./shoestring.ini --directory .

これでも失敗したら、奥の手です。私は一から再構築しました。
データベースを削除し、再度読み込み開始です。

docker compose -f ./docker-compose.yaml down
docker system prune
python -m shoestring reset-data --config ./shoestring.ini --directory.

ノードの設定値を変更した場合

upgradeを用いて、ノードを更新します。

 python -m shoestring upgrade -config ./shoestring.ini --directory . --overrides ./overrides.ini --package mainnet

nginxによるリバースプロキシの設定

以下のようにdefault.conf設定しました。

    # キャッシュバスティングのための`immutable`設定
    map $arg_v $asset_immutable {
        "" "";
        default ", immutable";
    }

    # WebSocketサポート用の`Connection`ヘッダー設定
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    # redirect all traffic to https
    server {
        listen 80;
        listen [::]:80;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # HTTPSサーバー設定
    server {

        listen 443 ssl;
        listen [::]:443 ssl;

        http2 on ;

        server_name _;

        # SSL証明書の設定
        ssl_certificate     /var/www/keys/cert.crt;
        ssl_certificate_key /var/www/keys/cert.key;

        # SSL/TLS セキュリティ設定
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        # セキュリティ向上のためのHTTPレスポンスヘッダー
        add_header Referrer-Policy                      "no-referrer"       always;
        add_header X-Content-Type-Options               "nosniff"           always;
        add_header X-Download-Options                   "noopen"            always;
        add_header X-Frame-Options                      "SAMEORIGIN"        always;
        add_header X-Permitted-Cross-Domain-Policies    "none"              always;
        add_header X-Robots-Tag                         "noindex, nofollow" always;
        add_header X-XSS-Protection                     "1; mode=block"     always;

        # X-Powered-Byヘッダーを非表示
        fastcgi_hide_header X-Powered-By;

        # ドキュメントルートの指定
        root /var/www/html;
        index  index.html index.htm;

        # robots.txt へのアクセス許可
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        # 特定のファイル(nodeSetting.json)へのアクセス許可
        location = /nodeSetting.json {
            default_type application/json;
            try_files /nodeSetting.json =404;
        }

        # ルートパスへのアクセスを404エラーとして返す設定(不要であれば削除可能)
        location = / {
            return 404;
        }
    }

    # ポート3001のHTTPS設定 (WebSocket対応)
    server {
        listen 3000;
        listen [::]:3000;

        listen 3001 ssl;
        listen [::]:3001 ssl;
        server_name _;

        http2 on;

        # SSL証明書の設定
        ssl_certificate     /var/www/keys/cert.crt;
        ssl_certificate_key /var/www/keys/cert.key;

        # WebSocketサポート用のプロキシ設定
        location / {
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            
            # リバースプロキシとして動作する設定
            proxy_pass http://symbol-node-svc:3000/;
        }
    }

/var/www/keysの証明書の場所は、一般的な例になるため、ご自身の環境に応じて変更ください。
nodeSetting.jsonは、こちら へリストしていただくために設定しました。

Symbolノード構築完全ガイド:Symbol Shoestringを活用したハーベストの始め方
https://notes.midnightstops.com/posts/21/
作者
Author
公開日
2024-11-15