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を含むファイルが格納されるディレクトリを指定
以下のように出力されれば、OKwebsocket 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
は、こちら へリストしていただくために設定しました。