カルダノステークプール構築手順
このマニュアルでは、1つのブロックプロデューサーノードと1つのリレーノードで構成し、ソースコードからカルダノステークプールをセットアップする手順となっております。

🎉 ∞ お知らせ

このマニュアルは、X Stake PoolオペレータのBTBFCoinCashewより許可を得て、日本語翻訳しております。
このマニュアルは、カルダノノードv1.30.1に対応しています。 ドキュメント更新情報はこちら 最終更新日:2021年10月19日の時点guide version 5.2.2
サポートが必要な場合は、SPO JAPAN GUILDコミュニティで現役のSPOに質問できます

🏁 0. 前提条件

🧙♂ ステークプールオペレータの必須スキル

カルダノステークプールを運営するには、以下のスキルを必要とします。
    カルダノノードを継続的にセットアップ、実行、維持する運用スキル
    ノードを24時間年中無休で維持するというコミット
    システム運用スキル
    サーバ管理スキル (運用および保守).
    開発と運用経験 (DevOps)
    サーバ強化とセキュリティに関する知識
    カルダノ財団公式ステークプールセットアップコース受講
🛑 このマニュアルを進めるには、上記のスキル要件を必要とします 🚧

🎗 ステークプールハードウェア(VPSスペック)要件(最小構成)

IOHK発表の最小構成はメモリ8GBですが、最近では間に合わなくなってきています。 ご予算の都合もあるかと思いますが、メモリ16GB以上での構成を推奨します。
    2つのサーバー: ブロックプロデューサーノード用1台、 リレーノード用1台
    エアギャップオフラインマシン1台 (コールド環境) (2Core-CPU/物理メモリ8GB以上/仮想メモリ4GB以上)
    オペレーティング・システム: 64-bit Linux (Ubuntu 20.04 LTS)
    プロセッサー: 1.6GHz以上(ステークプールまたはリレーの場合は2Ghz以上)の2つ以上のコアを備えたIntelまたはAMD x86プロセッサー
    メモリー: 10GB RAM(8GB導入する場合4GBのスワップ領域を設定する)
    ストレージ: SSD 50GB以上の空き容量
    インターネット: 10 Mbps以上のブロードバンド回線.
    データプラン: 1時間あたり1GBの帯域. 1ヶ月あたり720GB.
    電力: 安定供給された電力
    ADA残高: 505 ADA以上

🏋♂ ステークプールハードウェア(VPSスペック)要件(推奨構成)

    3つのサーバー: ブロックプロデューサーノード用1台、 リレーノード用2台
    エアギャップオフラインマシン1台 (コールド環境)(2Core-CPU/物理メモリ16GB以上/仮想メモリ8GB以上)
    オペレーティング・システム: 64-bit Linux (i.e. Ubuntu 20.04 LTS)
    プロセッサー: 4 core以上の CPU
    メモリー: 16GB RAM
    ストレージ: 256GB+ SSD
    インターネット: 100 Mbps以上のブロードバンド回線
    データプラン: 無制限
    電力: 無停電電源装置(UPS)による電源管理
    ADA残高: ステークプールに対する保証金をご自身で定める分

🔓 Ubuntuセットアップガイド

ステークプールのサーバ初期設定とセキュリティ強化するには、以下の内容を実施して下さい。

🧱 ノードを再構築したい場合

もしノードインストールを初めからやり直したい場合は項目18.2で、リセットの方法を確認して下さい。

🧱 試しにノードを起動してみたい方へ

Linuxサーバのコマンドや、ノード起動などお試しテストでやってみたい方は、項目の1,2,3,4, 5をやってみましょう! この項目はブロックチェーンには直接的に影響がないので、たとえ間違ったコマンドを送信してもネットワークには問題ございません。

🏭 1. CabalとGHCをインストールします

ターミナルを起動し、以下のコマンドを入力しましょう!
まずはじめに、パッケージを更新しUbuntuを最新の状態に保ちます。
1
sudo apt-get update -y
Copied!
1
sudo apt-get upgrade -y
Copied!
1
sudo apt-get install git jq bc automake tmux rsync htop curl build-essential pkg-config libffi-dev libgmp-dev libssl-dev libtinfo-dev libsystemd-dev zlib1g-dev make g++ wget libncursesw5 libtool autoconf -y
Copied!
次に、Libsodiumをインストールします。
1
mkdir $HOME/git
2
cd $HOME/git
3
git clone https://github.com/input-output-hk/libsodium
4
cd libsodium
5
git checkout 66f017f1
6
./autogen.sh
7
./configure
8
make
9
sudo make install
Copied!
GHCUPをインストールします。
1
cd $HOME
2
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
Copied!
Press ENTER to proceed or ctrl-c to abort. Note that this script can be re-run at any given time.
⇒Enter
Detected bash shell on your system... Do you want ghcup to automatically add the required PATH variable to "/home/btalonzo/.bashrc"?
[P] Yes, prepend [A] Yes, append [N] No [?] Help (default is "P").
⇒Pと入力しEnter
Do you want to install haskell-language-server (HLS)? HLS is a language-server that provides IDE-like functionality and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ... Also see https://github.com/haskell/haskell-language-server/blob/master/README.md
[Y] Yes [N] No [?] Help (default is "N").
⇒Nと入力しEnter
Do you want to install stack? Stack is a haskell build tool similar to cabal that is used by some projects. Also see https://docs.haskellstack.org/
[Y] Yes [N] No [?] Help (default is "N").
⇒Nと入力しEnter
Press ENTER to proceed or ctrl-c to abort. Installation may take a while.
⇒Enter
1
source ~/.bashrc
2
ghcup upgrade
3
ghcup install cabal 3.4.0.0
4
ghcup set cabal 3.4.0.0
Copied!
GHCをインストールします。
1
ghcup install ghc 8.10.4
2
ghcup set ghc 8.10.4
Copied!
環境変数を設定しパスを通します。 ノードの場所は $NODE_HOME に設定されます。 最新のノード構成ファイルは**$NODE_CONFIG** と $NODE_BUILD_NUMによって取得されます。
1
echo PATH="$HOME/.local/bin:$PATH" >> $HOME/.bashrc
2
echo export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" >> $HOME/.bashrc
3
echo export NODE_HOME=$HOME/cardano-my-node >> $HOME/.bashrc
4
echo export NODE_CONFIG=mainnet>> $HOME/.bashrc
5
echo export NODE_BUILD_NUM=$(curl https://hydra.iohk.io/job/Cardano/iohk-nix/cardano-deployment/latest-finished/download/1/index.html | grep -e "build" | sed 's/.*build\/\([0-9]*\)\/download.*/\1/g') >> $HOME/.bashrc
6
source $HOME/.bashrc
Copied!
Cabalを更新し、正しいバージョンが正常にインストールされていることを確認して下さい。
1
cabal update
2
cabal --version
3
ghc --version
Copied!
Cabalのライブラリーバージョンは「3.4.0.0」で GHCのバージョンは「8.10.4」であることを確認してください。

🏗 2. ソースコードからノードを構築する

バイナリーファイルは必ずソースコードからビルドするようにし、整合性をチェックしてください。 また、IOGは現在ARMアーキテクチャ用のバイナリファイルを提供していません。Raspberry Piを使用してプールを構築する場合は、ARM用コンパイラでコンパイルする必要があります。
Gitからソースコードをダウンロードし、最新のタグに切り替えます。
1
cd $HOME/git
2
git clone https://github.com/input-output-hk/cardano-node.git
3
cd cardano-node
4
git fetch --all --recurse-submodules --tags
5
git checkout tags/1.30.1
Copied!
Cabalのビルドオプションを構成します。
1
cabal configure -O0 -w ghc-8.10.4
Copied!
Cabal構成、プロジェクト設定を更新し、ビルドフォルダーをリセットします。
1
echo -e "package cardano-crypto-praos\n flags: -external-libsodium-vrf" > cabal.project.local
2
sed -i $HOME/.cabal/config -e "s/overwrite-policy:/overwrite-policy: always/g"
3
rm -rf $HOME/git/cardano-node/dist-newstyle/build/x86_64-linux/ghc-8.10.4
Copied!
カルダノノードをビルドします。
1
cabal build cardano-cli cardano-node
Copied!
サーバスペックによって、ビルド完了までに数分から数時間かかる場合があります。
cardano-cliファイルと cardano-nodeファイルをbinディレクトリにコピーします。
1
sudo cp $(find $HOME/git/cardano-node/dist-newstyle/build -type f -name "cardano-cli") /usr/local/bin/cardano-cli
Copied!
1
sudo cp $(find $HOME/git/cardano-node/dist-newstyle/build -type f -name "cardano-node") /usr/local/bin/cardano-node
Copied!
cardano-clicardano-nodeのバージョンが上記で指定したGitタグバージョンであることを確認してください。
1
cardano-node version
2
cardano-cli version
Copied!

📐 3. ノードを構成する

ノード構成に必要な config.json、genesis.json、及び topology.json ファイルを取得します。
1
mkdir $NODE_HOME
2
cd $NODE_HOME
3
wget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-byron-genesis.json
4
wget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-topology.json
5
wget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-shelley-genesis.json
6
wget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-alonzo-genesis.json
7
wget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-config.json
Copied!
以下のコードを実行し config.jsonファイルを更新します。
    TraceBlockFetchDecisionsを「true」に変更します。
1
sed -i ${NODE_CONFIG}-config.json \
2
-e "s/TraceBlockFetchDecisions\": false/TraceBlockFetchDecisions\": true/g"
Copied!
環境変数を追加し、.bashrcファイルを更新します。
1
echo export CARDANO_NODE_SOCKET_PATH="$NODE_HOME/db/socket" >> $HOME/.bashrc
2
source $HOME/.bashrc
Copied!

🤖 4. ノード起動スクリプトを作成する。

起動スクリプトには、ディレクトリ、ポート番号、DBパス、構成ファイルパス、トポロジーファイルパスなど、カルダノノードを実行するために必要な変数が含まれています。
全行をコピーしコマンドラインに送信します。
リレーノード1
ブロックプロデューサーノード
1
cat > $NODE_HOME/startRelayNode1.sh << EOF
2
#!/bin/bash
3
DIRECTORY=$NODE_HOME
4
PORT=6000
5
HOSTADDR=0.0.0.0
6
TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.json
7
DB_PATH=\${DIRECTORY}/db
8
SOCKET_PATH=\${DIRECTORY}/db/socket
9
CONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.json
10
/usr/local/bin/cardano-node run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG}
11
EOF
Copied!
1
cat > $NODE_HOME/startBlockProducingNode.sh << EOF
2
#!/bin/bash
3
DIRECTORY=$NODE_HOME
4
PORT=6000
5
HOSTADDR=0.0.0.0
6
TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.json
7
DB_PATH=\${DIRECTORY}/db
8
SOCKET_PATH=\${DIRECTORY}/db/socket
9
CONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.json
10
/usr/local/bin/cardano-node run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG}
11
EOF
Copied!

✅ 5. ノードを起動します。

起動スクリプトに実行権限を付与し、ブロックチェーンの同期を開始します。
リレーノードから実施します。
リレーノード
ブロックプロデューサーノード
1
cd $NODE_HOME
2
chmod +x startRelayNode1.sh
3
./startRelayNode1.sh
Copied!
1
cd $NODE_HOME
2
chmod +x startBlockProducingNode.sh
3
./startBlockProducingNode.sh
Copied!
slot番号などが表示され、勢いよくログが流れていたら起動成功です ただ、このままでは画面を閉じるとノードが終了するので次の工程に移ってください。
🛑 ノードを停止するには「Ctrl」+「c」を押します。
ヒント: 複数のノードをセットアップする場合、同期が完了したDBディレクトリを他のサーバにコピーすることにより、同期時間を節約することができます。
一旦ノードを停止します。
1
Ctrl+C
Copied!

🛠 5-1.自動起動を設定する(systemd)

先程のスクリプトだけでは、ターミナル画面を閉じるとノードが終了してしまうので、スクリプトをサービスとして登録し、自動起動するように設定しましょう

🍰 ステークプールにsystemdを使用するメリット

    1.
    メンテナンスや停電など、自動的にコンピュータが再起動したときステークプールを自動起動します。
    2.
    クラッシュしたステークプールプロセスを自動的に再起動します。
    3.
    ステークプールの稼働時間とパフォーマンスをレベルアップさせます。

🛠 セットアップ手順

始める前にステークプールが停止しているか確認してください。
1
killall -s 2 cardano-node
Copied!
以下のコードを実行して、ユニットファイルを作成します。
リレーノード1
ブロックプロデューサーノード
1
cat > $NODE_HOME/cardano-node.service << EOF
2
# The Cardano node service (part of systemd)
3
# file: /etc/systemd/system/cardano-node.service
4
5
[Unit]
6
Description = Cardano node service
7
Wants = network-online.target
8
After = network-online.target
9
10
[Service]
11
User = ${USER}
12
Type = simple
13
WorkingDirectory= ${NODE_HOME}
14
ExecStart = /bin/bash -c '${NODE_HOME}/startRelayNode1.sh'
15
KillSignal=SIGINT
16
RestartKillSignal=SIGINT
17
TimeoutStopSec=2
18
LimitNOFILE=32768
19
Restart=always
20
RestartSec=5
21
SyslogIdentifier=cardano-node
22
23
[Install]
24
WantedBy = multi-user.target
25
EOF
Copied!
1
cat > $NODE_HOME/cardano-node.service << EOF
2
# The Cardano node service (part of systemd)
3
# file: /etc/systemd/system/cardano-node.service
4
5
[Unit]
6
Description = Cardano node service
7
Wants = network-online.target
8
After = network-online.target
9
10
[Service]
11
User = ${USER}
12
Type = simple
13
WorkingDirectory= ${NODE_HOME}
14
ExecStart = /bin/bash -c '${NODE_HOME}/startBlockProducingNode.sh'
15
KillSignal=SIGINT
16
RestartKillSignal=SIGINT
17
TimeoutStopSec=2
18
LimitNOFILE=32768
19
Restart=always
20
RestartSec=5
21
SyslogIdentifier=cardano-node
22
23
[Install]
24
WantedBy = multi-user.target
25
EOF
Copied!
/etc/systemd/systemにユニットファイルをコピーして、権限を付与します。
1
sudo cp $NODE_HOME/cardano-node.service /etc/systemd/system/cardano-node.service
Copied!
1
sudo chmod 644 /etc/systemd/system/cardano-node.service
Copied!
次のコマンドを実行して、OS起動時にサービスの自動起動を有効にします。
1
sudo systemctl daemon-reload
2
sudo systemctl enable cardano-node
3
sudo systemctl start cardano-node
Copied!
以下は、systemdを有効活用するためのコマンドです。 必要に応じで実行するようにし、一連の流れで実行しないでください
****⛓ システム起動後に、ログモニターを表示します
1
journalctl --unit=cardano-node --follow
Copied!
コマンド入力に戻る場合は「Ctrl+C」(この場合ノードは終了しません)
スクリプトへのパスを通し、任意の単語で起動出来るようにする。
1
echo alias cnode='"journalctl -u cardano-node -f"' >> $HOME/.bashrc
2
source $HOME/.bashrc
Copied!
単語を入力するだけで、起動状態(ログ)を確認できます。 cnode

🔄 ノードサービスを再起動します。

1
sudo systemctl reload-or-restart cardano-node
Copied!

🛑 ノードサービスを停止します。

1
sudo systemctl stop cardano-node
Copied!

🗄 ログのフィルタリング

昨日のログ
1
journalctl --unit=cardano-node --since=yesterday
Copied!
コマンド入力に戻る場合は「Ctrl+C」(この場合ノードは終了しません) 今日のログ
1
journalctl --unit=cardano-node --since=today
Copied!
コマンド入力に戻る場合は「Ctrl+C」(この場合ノードは終了しません) 期間指定
1
journalctl --unit=cardano-node --since='2020-07-29 00:00:00' --until='2020-07-29 12:00:00'
Copied!
コマンド入力に戻る場合は「Ctrl+C」(この場合ノードは終了しません)

🛠 5-2.gLiveView ノードステータスモニターをインストールします

現在のcardano-nodeはログが流れる画面で、何が表示されているのかよくわかりません。 それを視覚的に確認できるツールがgLiveViewです。
gLiveViewは重要なノードステータス情報を表示し、systemdサービスとうまく連携します。1.23.0から正式にLiveViewが削除されgLiveViewは代替ツールとして利用できます。このツールを作成した Guild Operators の功績によるものです。
Guild LiveViewをインストールします。
1
mkdir $NODE_HOME/scripts
2
cd $NODE_HOME/scripts
3
sudo apt install bc tcptraceroute -y
4
curl -s -o gLiveView.sh https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/gLiveView.sh
5
curl -s -o env https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/env
6
chmod 755 gLiveView.sh
Copied!
env ファイルによってファイル構成を指定できます。 ノードのポート番号を6000以外に設定している場合は、envファイルを開いてポート番号を修正してください。
1
sed -i env \
2
-e "s/\#CONFIG=\"\${CNODE_HOME}\/files\/config.json\"/CONFIG=\"\${NODE_HOME}\/mainnet-config.json\"/g" \
3
-e "s/\#SOCKET=\"\${CNODE_HOME}\/sockets\/node0.socket\"/SOCKET=\"\${NODE_HOME}\/db\/socket\"/g"
Copied!
Guild Liveviewを起動します。
1
./gLiveView.sh
Copied!
このツールを立ち上げてもノードは起動しません。ノードは別途起動しておく必要があります リレー/BPは自動判別されます。 リレーノードでは基本情報に加え、トポロジー接続状況を確認できます。 BPノードでは基本情報に加え、KES有効期限、ブロック生成状況を確認できます。
[p]リレーノード用リモートピア分析について ピアにpingを送信する際ICMPpingを使用します。リモートピアのファイアウォールがICMPトラフィックを受け付ける場合のみ機能します。
Guild Live View
詳しくは開発元のドキュメントを参照してください official Guild Live View docs.
この画面が表示され、ノードが同期したら準備完了です。

🔮 6. ブロックプロデューサーノードを構築する

手順1~5までをブロックプロデューサー用サーバーで実施してから、以下を実施します。
ブロックプロデューサーノードは、ブロック生成に必要なペアキー (cold keys, KES hot keys and VRF hot keys)を用いて起動します。リレーノードのみに接続します。
一方で、リレーノードはキーを所有していないため、ブロック生成はできません。その代わり、他のリレーノードとの繋がりを持ち最新スロットを取得します。
このマニュアルでは、2つのサーバー上に1ノードづつ構築します。1つのノードはブロックプロデューサーノード、もう1つのノードはリレーノード1という名前のリレーノードになります。
topology.json ファイルの構成について
    リレーノードでは、パプリックノード (IOHKや他のリレーノード) 及び、自身の
    ブロックプロデューサーノード情報を記述します。
    ブロックプロデューサーノードでは、自身のリレーノード情報のみ記述します。
「*」はBPノードのパプリックIPアドレスに置き換えて下さい
リレーノード
1
cat > $NODE_HOME/${NODE_CONFIG}-topology.json << EOF
2
{
3
"Producers": [
4
{
5
"addr": "relays-new.cardano-mainnet.iohk.io",
6
"port": 3001,
7
"valency": 2
8
},
9
{
10
"addr": "***.**.**.**",
11
"port": 6000,
12
"valency": 1
13
}
14
]
15
}
16
EOF
Copied!
リレーノードを再起動する
1
sudo systemctl reload-or-restart cardano-node
Copied!
自身のブロックプロデューサーノード上で以下のコマンドを実行します。 「*」はリレーノードのパプリックIPアドレスに置き換えてください。
ブロックプロデューサーノード
1
cat > $NODE_HOME/${NODE_CONFIG}-topology.json << EOF
2
{
3
"Producers": [
4
{
5
"addr": "***.**.**.**",
6
"port": 6000,
7
"valency": 1
8
}
9
]
10
}
11
EOF
Copied!
BPノードを再起動する
1
sudo systemctl reload-or-restart cardano-node
Copied!

🔏 7. エアギャップオフラインマシンを構成する

エアギャップオフラインマシンは「コールド環境」と呼ばれコンピュータネットワークにおいてセキュリティを高める方法の一つ。 安全にしたいコンピュータやネットワークを、インターネットや安全でないLANといったネットワークから物理的に隔離することを指す。
    キーロギング攻撃、マルウエア/ウイルスベースの攻撃、その他ファイアウォールやセキュリティーの悪用から保護します。
    有線・無線のインターネットには接続しないでください。
    ネットワーク上にあるVMマシンではありません。
    エアギャップについて更に詳しく知りたい場合は、こちらを参照下さい。
エアギャップオフラインマシン上で手順1~2をセットアップした後、以下のパスを環境変数にセットします。
エアギャップオフラインマシン
1
echo export NODE_HOME=$HOME/cardano-my-node >> $HOME/.bashrc
2
source $HOME/.bashrc
3
mkdir -p $NODE_HOME
Copied!
最も安全な構成を維持するには、USBなどを利用してホット環境とコールド環境間でファイルを物理的に移動することが望ましいです。

⚙ 8. ブロックプロデューサーキーを生成する。

以下の項目を実施する前にBPノードが起動しているか確認してください。
1
journalctl --unit=cardano-node --follow
Copied!
ログが流れていればノードが起動しています。 コマンド入力に戻る場合は「Ctrl+C」(この場合ノードは終了しません)
ブロックプロデューサーノードでは Shelley台帳仕様書で定義されている、3つのキーを生成する必要があります。
    ステークプールのコールドキー (node.cert)
    ステークプールのホットキー (kes.skey)
    ステークプールのVRFキー (vrf.skey)
まずは、KESペアキーを作成します。 (KES=Key Evolving Signature)
ブロックプロデューサーノード
1
cd $NODE_HOME
2
cardano-cli node key-gen-KES \
3
--verification-key-file kes.vkey \
4
--signing-key-file kes.skey
Copied!
KESキーは、キーを悪用するハッカーからステークプールを保護するために作成され、90日ごとに再生成する必要があります。
🔥 コールドキーは常にエアギャップオフラインマシンで生成および保管する必要があります コールドキーは次のパスに格納されるようにします。 $HOME/cold-keys.
コールドキーを格納するディレクトリを作成します。
エアギャップオフラインマシン
1
mkdir $HOME/cold-keys
2
pushd $HOME/cold-keys
Copied!
コールドキーのペアキーとカウンターファイルを作成します。
エアギャップオフラインマシン
1
cardano-cli node key-gen \
2
--cold-verification-key-file node.vkey \
3
--cold-signing-key-file node.skey \
4
--operational-certificate-issue-counter node.counter
5
6
chmod 400 node.vkey
7
chmod 400 node.skey
Copied!
すべてのキーを別の安全なストレージデバイスにバックアップしましょう!複数のバックアップを作成することをおすすめします。
ジェネシスファイルからslotsPerKESPeriodを出力します。
続行する前に、ノードをブロックチェーンと完全に同期する必要があります。 同期が途中の場合、正しいslotsPerKESPeriodを取得できません。 あなたのノードが完全に同期されたことを確認するには、こちらのサイトhttps://pooltool.io/で自身の同期済みエポックとスロットが一致しているかをご確認ください。
ブロックプロデューサーノード
1
cd $NODE_HOME
2
slotsPerKESPeriod=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r '.slotsPerKESPeriod')
3
echo slotsPerKESPeriod: ${slotsPerKESPeriod}
Copied!
ブロックプロデューサーノード
1
slotNo=$(cardano-cli query tip --mainnet | jq -r '.slot')
2
echo slotNo: ${slotNo}
Copied!
スロット番号をslotsPerKESPeriodで割り、kesPeriodを算出します。
ブロックプロデューサーノード
1
kesPeriod=$((${slotNo} / ${slotsPerKESPeriod}))
2
echo kesPeriod: ${kesPeriod}
3
startKesPeriod=${kesPeriod}
4
echo startKesPeriod: ${startKesPeriod}
Copied!
これにより、プール運用証明書を生成することができます。
kes.vkey をエアギャップオフラインマシンのcardano-my-nodeディレクトリにコピーします。
ステークプールオペレータは、プールを実行する権限があることを確認するための運用証明書を発行する必要があります。証明書には、オペレータの署名が含まれプールに関する情報(アドレス、キーなど)が含まれます。
XXXの部分を上記で算出した数値(startKesPeriodの値)に置き換えます。
エアギャップオフラインマシン
1
cd $NODE_HOME
2
cardano-cli node issue-op-cert \
3
--kes-verification-key-file kes.vkey \
4
--cold-signing-key-file $HOME/cold-keys/node.skey \
5
--operational-certificate-issue-counter $HOME/cold-keys/node.counter \
6
--kes-period XXX \
7
--out-file node.cert
Copied!
node.cert をブロックプロデューサノードのcardano-my-nodeディレクトリにコピーします。
VRFペアキーを作成します。
ブロックプロデューサーノード
1
cd $NODE_HOME
2
cardano-cli node key-gen-VRF \
3
--verification-key-file vrf.vkey \
4
--signing-key-file vrf.skey
Copied!
vrfキーのアクセス権を読み取り専用に更新します。
1
chmod 400 vrf.skey
2
chmod 400 vrf.vkey
Copied!
次のコマンドを実行して一旦ノードを停止します。 (以下のコマンドは、8-1を実施している前提のコマンドです)
ブロックプロデューサーノード
1
sudo systemctl stop cardano-node
Copied!
起動スクリプトにKES、VRF、運用証明書のパスを追記し更新します。
ブロックプロデューサーノード
1
cat > $NODE_HOME/startBlockProducingNode.sh << EOF
2
#!/bin/bash
3
DIRECTORY=$NODE_HOME
4
PORT=6000
5
HOSTADDR=0.0.0.0
6
TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.json
7
DB_PATH=\${DIRECTORY}/db
8
SOCKET_PATH=\${DIRECTORY}/db/socket
9
CONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.json
10
KES=\${DIRECTORY}/kes.skey
11
VRF=\${DIRECTORY}/vrf.skey
12
CERT=\${DIRECTORY}/node.cert
13
/usr/local/bin/cardano-node run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG} --shelley-kes-key \${KES} --shelley-vrf-key \${VRF} --shelley-operational-certificate \${CERT}
14
EOF
Copied!
ステークプールを運用するには、KES、VRFキー、および運用証明書が必要です。
ブロックプロデューサーノードを起動します。
ブロックプロデューサーノード
1
sudo systemctl start cardano-node
Copied!

🔐 9. 各種アドレス用のキーを作成します。(payment/stake用アドレス)

ステークプール登録後、やり直しは出来ません。
まずは、プロトコルパラメータを取得します。
このエラーが出た場合は、ノードが同期を開始するまで待つか、手順3に戻り「db/socket」へのパスが追加されているか確認してください。
cardano-cli: Network.Socket.connect: : does not exist (No such file or directory)
ブロックプロデューサーノード
1
cd $NODE_HOME
2
cardano-cli query protocol-parameters \
3
--mainnet \
4
--out-file params.json
Copied!
paymentキーは支払い用アドレスに使用され、stakeキーはプール委任アドレス用の管理に使用されます。
🔥 運用上のセキュリティに関する重要なアドバス: キーの生成はエアギャップオフラインマシンで生成する必要があり、インターネット接続が無くても生成可能です。
ホット環境(オンライン)で必要とする手順は以下の内容のみです。
    現在のスロット番号を取得する
    アドレスの残高を照会する
    トランザクションの送信
エアギャップオフラインマシン
以下は、エアギャップオフラインマシンで行ってください。 支払い用アドレスのペアキーを作成します。: payment.skey & payment.vkey
1
cd $NODE_HOME
2
cardano-cli address key-gen \
3
--verification-key-file payment.vkey \
4
--signing-key-file payment.skey
Copied!
ステークアドレス用のペアキーを作成します。 stake.skey & stake.vkey
1
cardano-cli stake-address key-gen \
2
--verification-key-file stake.vkey \
3
--signing-key-file stake.skey
Copied!
ステークアドレス検証キーから、ステークアドレスファイルを作成します。 stake.addr
1
cardano-cli stake-address build \
2
--stake-verification-key-file stake.vkey \
3
--out-file stake.addr \
4
--mainnet
Copied!
ステークアドレスに委任する支払い用アドレスを作成します。
1
cardano-cli address build \
2
--payment-verification-key-file payment.vkey \
3
--stake-verification-key-file stake.vkey \
4
--out-file payment.addr \
5
--mainnet
Copied!
上書きされないようパーミッションを変更する。
1
chmod 400 payment.vkey
2
chmod 400 payment.skey
3
chmod 400 stake.vkey
4
chmod 400 stake.skey
5
chmod 400 stake.addr
6
chmod 400 payment.addr
Copied!
※プール運営開始後に、上記の処理を実行するとアドレスが上書きされるので注意してください。
次のステップは、あなたの支払いアドレスに送金する手順です。
payment.addr をブロックプロデューサノードのcardano-my-nodeディレクトリにコピーします。
メインネット
メインネット候補版
Shelley テストネット
以下のウォレットアドレスから送金が可能です。
    ダイダロス / ヨロイウォレット
    もしITNに参加している場合は、キーを変換できます。
次のコードを実行し。支払いアドレスを表示させ、このアドレスに送金します。
1
echo "$(cat payment.addr)"
Copied!
以下のウォレットアドレスから送金が可能です。
    バイロンメインネット資金
    INTに参加している場合は、キーを変換できます。
次のコードを実行し。支払いアドレスを表示させます。
1
echo "$(cat payment.addr)"
Copied!
テストネット用口座にあなたの支払い用アドレスをリクエストします。
次のコードを実行し。支払いアドレスを表示させます。
1
echo "$(cat payment.addr)"
Copied!
このアドレスを上記ページのリクエスト欄に貼り付けます。
シェリーテストネット用口座は24時間ごとに100,000fADAを提供します。
支払い用アドレスに送金後、残高を確認してください。
続行する前に、ノードをブロックチェーンと完全に同期させる必要があります。完全に同期されていない場合は、残高が表示されません。
ブロックプロデューサーノード
1
cardano-cli query utxo \
2
--address $(cat payment.addr) \
3
--mainnet
Copied!
次のように表示されます。
1
TxHash TxIx Lovelace
2
----------------------------------------------------------------------------------------
3
100322a39d02c2ead.... 0 1000000000
Copied!

👩 10. ステークアドレスを登録します。

ステークプール登録後、やり直しは出来ません。
stake.vkeyを使用して、stake.cert証明証を作成します。
エアギャップオフラインマシン
1
cd $NODE_HOME
2
cardano-cli stake-address registration-certificate \
3
--stake-verification-key-file stake.vkey \
4
--out-file stake.cert
Copied!
stake.cert をブロックプロデューサーノードのcardano-my-nodeディレクトリにコピーします。 ttlパラメータを設定するには、最新のスロット番号を取得する必要があります。
ブロックプロデューサーノード
1
cd $NODE_HOME
2
currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slot')
3
echo Current Slot: $currentSlot
Copied!
残高とUTXOを出力します。
ブロックプロデューサーノード
1
cardano-cli query utxo \
2
--address $(cat payment.addr) \
3
--mainnet > fullUtxo.out
4
5
tail -n +3 fullUtxo.out | sort -k3 -nr > balance.out
6
7
cat balance.out
8
9
tx_in=""
10
total_balance=0
11
while read -r utxo; do
12
in_addr=$(awk '{ print $1 }' <<< "${utxo}")
13
idx=$(awk '{ print $2 }' <<< "${utxo}")
14
utxo_balance=$(awk '{ print $3 }' <<< "${utxo}")
15
total_balance=$((${total_balance}+${utxo_balance}))
16
echo TxHash: ${in_addr}#${idx}
17
echo ADA: ${utxo_balance}
18
tx_in="${tx_in} --tx-in ${in_addr}#${idx}"
19
done < balance.out
20
txcnt=$(cat balance.out | wc -l)
21
echo Total ADA balance: ${total_balance}
22
echo Number of UTXOs: ${txcnt}
Copied!
<