このマニュアルは、X Stake PoolオペレータのBTBFがCoinCashewより許可を得て、日本語翻訳しております。
このマニュアルは、カルダノノードv1.25.1に対応しています。(CLIコマンド修正済み) ドキュメント更新情報はこちら 最終更新日:2021年2月21日の時点guide version 3.2.1
カルダノステークプールを運営するには、以下のスキルを必要とします。
カルダノノードを継続的にセットアップ、実行、維持する運用スキル
ノードを24時間年中無休で維持するというコミット
システム運用スキル
サーバ管理スキル (運用および保守).
開発と運用経験 (DevOps)
サーバ強化とセキュリティに関する知識
カルダノ財団公式ステークプールセットアップコース受講
🛑 このマニュアルを進めるには、上記のスキル要件を必要とします 🚧
2つのサーバー: ブロックプロデューサーノード用1台、 リレーノード用1台
エアギャップオフラインマシン1台 (コールド環境)
オペレーティング・システム: 64-bit Linux (Ubuntu 20.04 LTS)
プロセッサー: 1.6GHz以上(ステークプールまたはリレーの場合は2Ghz以上)の2つ以上のコアを備えたIntelまたはAMD x86プロセッサー
メモリー: 4GB RAM(リレーまたはステークプールでは8GB)
ストレージ: 24GB SSD
インターネット: 10 Mbps以上のブロードバンド回線.
データプラン: 1時間あたり1GBの帯域. 1ヶ月あたり720GB.
電力: 安定供給された電力
ADA残高: 505 ADA以上
3つのサーバー: ブロックプロデューサーノード用1台、 リレーノード用2台
エアギャップオフラインマシン1台 (コールド環境)
オペレーティング・システム: 64-bit Linux (i.e. Ubuntu 20.04 LTS)
プロセッサー: 4 core以上の CPU
メモリー: 8GB+ RAM
ストレージ: 256GB+ SSD
インターネット: 100 Mbps以上のブロードバンド回線
データプラン: 無制限
電力: 無停電電源装置(UPS)による電源管理
ADA残高: ステークプールに対する保証金をご自身で定める分
ステークプールのサーバを強化するには、以下の内容を実施して下さい。
絶賛翻訳中
もしノードインストールを初めからやり直したい場合は項目18.2で、リセットの方法を確認して下さい。
Linuxサーバのコマンドや、ノード起動などお試しテストでやってみたい方は、項目の1,2,3,4, 5をやってみましょう! この項目はブロックチェーンには直接的に影響がないので、たとえ間違ったコマンドを送信してもネットワークには問題ございません。
ターミナルを起動し、以下のコマンドを入力しましょう!
まずはじめに、パッケージを更新しUbuntuを最新の状態に保ちます。
sudo apt-get update -y
sudo apt-get upgrade -y
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
次に、Libsodiumをインストールします。
mkdir $HOME/gitcd $HOME/gitgit clone https://github.com/input-output-hk/libsodiumcd libsodiumgit checkout 66f017f1./autogen.sh./configuremakesudo make install
Cabalをインストールします。
cdwget https://downloads.haskell.org/~cabal/cabal-install-3.2.0.0/cabal-install-3.2.0.0-x86_64-unknown-linux.tar.xztar -xf cabal-install-3.2.0.0-x86_64-unknown-linux.tar.xzrm cabal-install-3.2.0.0-x86_64-unknown-linux.tar.xz cabal.sigmkdir -p $HOME/.local/binmv cabal $HOME/.local/bin/
GHCをインストールします。
wget https://downloads.haskell.org/ghc/8.10.2/ghc-8.10.2-x86_64-deb9-linux.tar.xztar -xf ghc-8.10.2-x86_64-deb9-linux.tar.xzrm ghc-8.10.2-x86_64-deb9-linux.tar.xzcd ghc-8.10.2./configuresudo make install
環境変数を設定しパスを通します。 ノードの場所は $NODE_HOME に設定されます。 最新のノード構成ファイルは$NODE_CONFIG と $NODE_BUILD_NUMによって取得されます。
echo PATH="$HOME/.local/bin:$PATH" >> $HOME/.bashrcecho export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" >> $HOME/.bashrcecho export NODE_HOME=$HOME/cardano-my-node >> $HOME/.bashrcecho export NODE_CONFIG=mainnet>> $HOME/.bashrcecho 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/.bashrcsource $HOME/.bashrc
Cabalを更新し、正しいバージョンが正常にインストールされていることを確認して下さい。
cabal updatecabal -Vghc -V
Cabalのライブラリーバージョンは「3.2.0.0」で GHCのバージョンは「8.10.2」であることを確認してください。
Gitからソースコードをダウンロードし、最新のタグに切り替えます。
cd $HOME/gitgit clone https://github.com/input-output-hk/cardano-node.gitcd cardano-nodegit fetch --all --recurse-submodules --tagsgit checkout tags/1.25.1
Cabalのビルドオプションを構成します。
cabal configure -O0 -w ghc-8.10.2
Cabal構成、プロジェクト設定を更新し、ビルドフォルダーをリセットします。
echo -e "package cardano-crypto-praos\n flags: -external-libsodium-vrf" > cabal.project.localsed -i $HOME/.cabal/config -e "s/overwrite-policy:/overwrite-policy: always/g"rm -rf $HOME/git/cardano-node/dist-newstyle/build/x86_64-linux/ghc-8.10.2
カルダノノードをビルドします。
cabal build cardano-cli cardano-node
サーバスペックによって、ビルド完了までに数分から数時間かかる場合があります。
cardano-cliファイルと cardano-nodeファイルをbinディレクトリにコピーします。
sudo cp $(find $HOME/git/cardano-node/dist-newstyle/build -type f -name "cardano-cli") /usr/local/bin/cardano-cli
sudo cp $(find $HOME/git/cardano-node/dist-newstyle/build -type f -name "cardano-node") /usr/local/bin/cardano-node
cardano-cli と cardano-nodeのバージョンが上記で指定したGitタグバージョンであることを確認してください。
cardano-node versioncardano-cli version
ノード構成に必要な config.json、genesis.json、及び topology.json ファイルを取得します。
mkdir $NODE_HOMEcd $NODE_HOMEwget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-byron-genesis.jsonwget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-topology.jsonwget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-shelley-genesis.jsonwget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-config.json
以下のコードを実行し config.jsonファイルを更新します。
TraceBlockFetchDecisionsを「true」に変更します。
sed -i ${NODE_CONFIG}-config.json \-e "s/TraceBlockFetchDecisions\": false/TraceBlockFetchDecisions\": true/g"
環境変数を追加し、.bashrcファイルを更新します。
echo export CARDANO_NODE_SOCKET_PATH="$NODE_HOME/db/socket" >> $HOME/.bashrcsource $HOME/.bashrc
起動スクリプトには、ディレクトリ、ポート番号、DBパス、構成ファイルパス、トポロジーファイルパスなど、カルダノノードを実行するために必要な変数が含まれています。
全行をコピーしコマンドラインに送信します。
cat > $NODE_HOME/startRelayNode1.sh << EOF#!/bin/bashDIRECTORY=\$NODE_HOMEPORT=6000HOSTADDR=0.0.0.0TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.jsonDB_PATH=\${DIRECTORY}/dbSOCKET_PATH=\${DIRECTORY}/db/socketCONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.jsoncardano-node run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG}EOF
cat > $NODE_HOME/startBlockProducingNode.sh << EOF#!/bin/bashDIRECTORY=\$NODE_HOMEPORT=6000HOSTADDR=0.0.0.0TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.jsonDB_PATH=\${DIRECTORY}/dbSOCKET_PATH=\${DIRECTORY}/db/socketCONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.jsoncardano-node run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG}EOF
起動スクリプトに実行権限を付与し、ブロックチェーンの同期を開始します。
リレーノードから実施します。
cd $NODE_HOMEchmod +x startRelayNode1.sh./startRelayNode1.sh
cd $NODE_HOMEchmod +x startBlockProducingNode.sh./startBlockProducingNode.sh
slot番号などが表示され、勢いよくログが流れていたら起動成功です ただ、このままでは画面を閉じるとノードが終了するので次の工程に移ってください。
🛑 ノードを停止するには「Ctrl」+「c」を押します。
✨ ヒント: 複数のノードをセットアップする場合、同期が完了したDBディレクトリを他のサーバにコピーすることにより、同期時間を節約することができます。
一旦ノードを停止します。
Ctrl+C
先程のスクリプトだけでは、ターミナル画面を閉じるとノードが終了してしまうので、スクリプトをサービスとして登録し、自動起動設定と別セッションで起動するように設定しましょう
メンテナンスや停電など、自動的にコンピュータが再起動したときステークプールを自動起動します。
クラッシュしたステークプールプロセスを自動的に再起動します。
ステークプールの稼働時間とパフォーマンスをレベルアップさせます。
始める前にステークプールが停止しているか確認してください。
killall -s 2 cardano-node
以下のコードを実行して、ユニットファイルを作成します。
cat > $NODE_HOME/cardano-node.service << EOF# The Cardano node service (part of systemd)# file: /etc/systemd/system/cardano-node.service[Unit]Description = Cardano node serviceWants = network-online.targetAfter = network-online.target[Service]User = $(whoami)Type = forkingWorkingDirectory= $NODE_HOMEExecStart = /usr/bin/tmux new -d -s cnodeExecStartPost = /usr/bin/tmux send-keys -t cnode $NODE_HOME/startRelayNode1.sh EnterKillSignal=SIGINTRestartKillSignal=SIGINTTimeoutStopSec=2LimitNOFILE=32768Restart=alwaysRestartSec=5[Install]WantedBy = multi-user.targetEOF
cat > $NODE_HOME/cardano-node.service << EOF# The Cardano node service (part of systemd)# file: /etc/systemd/system/cardano-node.service[Unit]Description = Cardano node serviceWants = network-online.targetAfter = network-online.target[Service]User = $(whoami)Type = forkingWorkingDirectory= $NODE_HOMEExecStart = /usr/bin/tmux new -d -s cnodeExecStartPost = /usr/bin/tmux send-keys -t cnode $NODE_HOME/startBlockProducingNode.sh EnterKillSignal=SIGINTRestartKillSignal=SIGINTTimeoutStopSec=2LimitNOFILE=32768Restart=alwaysRestartSec=5[Install]WantedBy = multi-user.targetEOF
/etc/systemd/system
にユニットファイルをコピーして、権限を付与します。
sudo cp $NODE_HOME/cardano-node.service /etc/systemd/system/cardano-node.service
sudo chmod 644 /etc/systemd/system/cardano-node.service
次のコマンドを実行して、OS起動時にサービスの自動起動を有効にします。
sudo systemctl daemon-reloadsudo systemctl enable cardano-nodesudo systemctl start cardano-node
5-2.gLiveView ノードステータスモニターをインストールしますに進んでください。
以下は、systemdを有効活用するためのコマンドです。
****⛓ システム起動後に、ログモニターを表示します
tmux a -t cnode
バックグラウンド起動中のセッション(別画面)を確認する
tmux ls
press Ctrl + b を押した後、すぐに d (デタッチ)
sudo systemctl is-active cardano-node
sudo systemctl status cardano-node
sudo systemctl reload-or-restart cardano-node
sudo systemctl stop cardano-node
journalctl --unit=cardano-node --since=yesterdayjournalctl --unit=cardano-node --since=todayjournalctl --unit=cardano-node --since='2020-07-29 00:00:00' --until='2020-07-29 12:00:00'
現在のcardano-nodeはログが流れる画面で、何が表示されているのかよくわかりません。 それを視覚的に確認できるツールがgLiveViewです。
gLiveViewは重要なノードステータス情報を表示し、systemdサービスとうまく連携します。1.23.0から正式にLiveViewが削除されgLiveViewは代替ツールとして利用できます。このツールを作成した Guild Operators の功績によるものです。
Guild LiveViewをインストールします。
mkdir $NODE_HOME/scriptscd $NODE_HOME/scriptssudo apt install bc tcptraceroute -ycurl -s -o gLiveView.sh https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/gLiveView.shcurl -s -o env https://raw.githubusercontent.com/cardano-community/guild-operators/master/scripts/cnode-helper-scripts/envchmod 755 gLiveView.sh
env ファイルによってファイル構成を指定できます。 ノードのポート番号を6000以外に設定している場合は、envファイルを開いて修正してください。
sed -i env \-e "s/\#CONFIG=\"\${CNODE_HOME}\/files\/config.json\"/CONFIG=\"\${NODE_HOME}\/mainnet-config.json\"/g" \-e "s/\#SOCKET=\"\${CNODE_HOME}\/sockets\/node0.socket\"/SOCKET=\"\${NODE_HOME}\/db\/socket\"/g"
Guild Liveviewを起動します。
./gLiveView.sh
このツールを立ち上げてもノードは起動しません。ノードは別途起動しておく必要があります リレー/BPは自動判別されます。 リレーノードでは基本情報に加え、トポロジー接続状況を確認できます。 BPノードでは基本情報に加え、KES有効期限、ブロック生成状況を確認できます。
[p]リレーノード用リモートピア分析について ピアにpingを送信する際ICMPpingを使用します。リモートピアのファイアウォールがICMPトラフィックを受け付ける場合のみ機能します。
詳しくは開発元のドキュメントを参照してください official Guild Live View docs.
この画面が表示され、ノードが同期したら準備完了です。
手順1~5までをブロックプロデューサー用サーバーで実施してから、以下を実施します。
ブロックプロデューサーノードは、ブロック生成に必要なペアキー (cold keys, KES hot keys and VRF hot keys)を用いて起動します。リレーノードのみに接続します。
一方で、リレーノードはキーを所有していないため、ブロック生成はできません。その代わり、他のリレーノードとの繋がりを持ち最新スロットを取得します。
このマニュアルでは、2つのサーバー上に1ノードづつ構築します。1つのノードはブロックプロデューサーノード、もう1つのノードはリレーノード1という名前のリレーノードになります。
topology.json ファイルの構成について
リレーノードでは、パプリックノード (IOHKや他のリレーノード) 及び、自身の
ブロックプロデューサーノード情報を記述します。
ブロックプロデューサーノードでは、自身のリレーノード情報のみ記述します。
自身のブロックプロデューサーノード上で以下のコマンドを実行します。 「addr」にはリレーノードのパプリックIPアドレスを記述します。
cat > $NODE_HOME/${NODE_CONFIG}-topology.json << EOF{"Producers": [{"addr": "<リレーノード1のパブリックIPアドレス>","port": 6000,"valency": 1}]}EOF
エアギャップオフラインマシンは「コールド環境」と呼ばれ、インターネットに接続しない独立したオフライン環境のことです。
キーロギング攻撃、マルウエア/ウイルスベースの攻撃、その他ファイアウォールやセキュリティーの悪用から保護します。
有線・無線のインターネットには接続しないでください。
ネットワーク上にあるVMマシンではありません。
エアギャップについて更に詳しく知りたい場合は、こちらを参照下さい。
エアギャップオフラインマシン上で手順1~2をセットアップした後、以下のパスを環境変数にセットします。
echo export NODE_HOME=$HOME/cardano-my-node >> $HOME/.bashrcsource $HOME/.bashrcmkdir -p $NODE_HOME
最も安全な構成を維持するには、USBなどを利用してホット環境とコールド環境間でファイルを物理的に移動することが望ましいです。
以下の項目を実施する前にノードが起動しているか確認してください。
tmux a -t cnode
ログが流れていればノードが起動しています。 Ctrl+B を押したあとにdを押すと前の画面に戻ります。
ブロックプロデューサーノードでは Shelley台帳仕様書で定義されている、3つのキーを生成する必要があります。
ステークプールのコールドキー (node.cert)
ステークプールのホットキー (kes.skey)
ステークプールのVRFキー (vrf.skey)
まずは、KESペアキーを作成します。 (KES=Key Evolving Signature)
cd $NODE_HOMEcardano-cli node key-gen-KES \--verification-key-file kes.vkey \--signing-key-file kes.skey
KESキーは、キーを悪用するハッカーからステークプールを保護するために作成され、90日ごとに再生成する必要があります。
🔥 コールドキーは常にエアギャップオフラインマシンで生成および保管する必要があります コールドキーは次のパスに格納されるようにします。 $HOME/cold-keys.
コールドキーを格納するディレクトリを作成します。
mkdir $HOME/cold-keyspushd $HOME/cold-keys
コールドキーのペアキーとカウンターファイルを作成します。
cardano-cli node key-gen \--cold-verification-key-file node.vkey \--cold-signing-key-file node.skey \--operational-certificate-issue-counter node.counterchmod 400 node.vkeychmod 400 node.skey
すべてのキーを別の安全なストレージデバイスにバックアップしましょう!複数のバックアップを作成することをおすすめします。
ジェネシスファイルからslotsPerKESPeriodを出力します。
続行する前に、ノードをブロックチェーンと完全に同期する必要があります。 同期が途中の場合、正しいslotsPerKESPeriodを取得できません。 あなたのノードが完全に同期されたことを確認するには、こちらのサイトhttps://pooltool.io/で自身の同期済みエポックとスロットが一致しているかをご確認ください。
pushd +1slotsPerKESPeriod=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r '.slotsPerKESPeriod')echo slotsPerKESPeriod: ${slotsPerKESPeriod}
slotNo=$(cardano-cli query tip --mainnet | jq -r '.slotNo')echo slotNo: ${slotNo}
スロット番号をslotsPerKESPeriodで割り、kesPeriodを算出します。
kesPeriod=$((${slotNo} / ${slotsPerKESPeriod}))echo kesPeriod: ${kesPeriod}startKesPeriod=${kesPeriod}echo startKesPeriod: ${startKesPeriod}
これにより、プール運用証明書を生成することができます。
kes.vkey をエアギャップオフラインマシンのcardano-my-nodeディレクトリにコピーします。
バージョン 1.19.0ではstartKesPeriodの値を(kesPeriod-1)に設定する必要があります。
ステークプールオペレータは、プールを実行する権限があることを確認するための運用証明書を発行する必要があります。証明書には、オペレータの署名が含まれプールに関する情報(アドレス、キーなど)が含まれます。
<startKesPeriod>の部分を上記で算出した数値(startKesPeriodの値)に置き換えます。
cardano-cli node issue-op-cert \--kes-verification-key-file kes.vkey \--cold-signing-key-file $HOME/cold-keys/node.skey \--operational-certificate-issue-counter $HOME/cold-keys/node.counter \--kes-period <startKesPeriod> \--out-file node.cert
node.cert をブロックプロデューサノードのcardano-my-nodeディレクトリにコピーします。
VRFペアキーを作成します。
cardano-cli node key-gen-VRF \--verification-key-file vrf.vkey \--signing-key-file vrf.skey
vrfキーのアクセス権を読み取り専用に更新します。
chmod 400 vrf.skey
次のコマンドを実行して一旦ノードを停止します。 (以下のコマンドは、8-1を実施している前提のコマンドです)
sudo systemctl stop cardano-node
起動スクリプトにKES、VRF、運用証明書のパスを追記し更新します。
cat > $NODE_HOME/startBlockProducingNode.sh << EOFDIRECTORY=\$NODE_HOMEPORT=6000HOSTADDR=0.0.0.0TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.jsonDB_PATH=\${DIRECTORY}/dbSOCKET_PATH=\${DIRECTORY}/db/socketCONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.jsonKES=\${DIRECTORY}/kes.skeyVRF=\${DIRECTORY}/vrf.skeyCERT=\${DIRECTORY}/node.certcardano-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}EOF
ステークプールを運用するには、KES、VRFキー、および運用証明書が必要です。
ブロックプロデューサーノードを起動します。
sudo systemctl start cardano-node
ステークプール登録後、やり直しは出来ません。
まずは、プロトコルパラメータを取得します。
このエラーが出た場合は、ノードが同期を開始するまで待つか、手順3に戻り「db/socket」へのパスが追加されているか確認してください。
cardano-cli: Network.Socket.connect: : does not exist (No such file or directory)
cardano-cli query protocol-parameters \--mainnet \--allegra-era \--out-file params.json
paymentキーは支払い用アドレスに使用され、stakeキーはプール委任アドレス用の管理に使用されます。
🔥 運用上のセキュリティに関する重要なアドバス: キーの生成はエアギャップオフラインマシンで生成する必要があり、インターネット接続が無くても生成可能です。
ホット環境(オンライン)で必要とする手順は以下の内容のみです。
現在のスロット番号を取得する
アドレスの残高を照会する
トランザクションの送信
支払い用アドレスのペアキーを作成します。: payment.skey
& payment.vkey
###### On エアギャップオフラインマシン,###cd $NODE_HOMEcardano-cli address key-gen \--verification-key-file payment.vkey \--signing-key-file payment.skey
ステークアドレス用のペアキーを作成します。 stake.skey
& stake.vkey
###### On エアギャップオフラインマシン,###cardano-cli stake-address key-gen \--verification-key-file stake.vkey \--signing-key-file stake.skey
ステークアドレス検証キーから、ステークアドレスファイルを作成します。 stake.addr
###### On エアギャップオフラインマシン,###cardano-cli stake-address build \--stake-verification-key-file stake.vkey \--out-file stake.addr \--mainnet
ステークアドレスに委任する支払い用アドレスを作成します。
###### On エアギャップオフラインマシン,###cardano-cli address build \--payment-verification-key-file payment.vkey \--stake-verification-key-file stake.vkey \--out-file payment.addr \--mainnet
上書きされないようパーミッションを変更する。
###### On エアギャップオフラインマシン,###chmod 400 payment.vkeychmod 400 payment.skeychmod 400 stake.vkeychmod 400 stake.skeychmod 400 stake.addrchmod 400 payment.addr
※プール運営開始後に、上記の処理を実行するとアドレスが上書きされるので注意してください。
次のステップは、あなたの支払いアドレスに送金する手順です。
payment.addr をブロックプロデューサノードのcardano-my-nodeディレクトリにコピーします。
以下のウォレットアドレスから送金が可能です。
ダイダロス / ヨロイウォレット
もしITNに参加している場合は、キーを変換できます。
次のコードを実行し。支払いアドレスを表示させ、このアドレスに送金します。
echo "$(cat payment.addr)"
以下のウォレットアドレスから送金が可能です。
バイロンメインネット資金
INTに参加している場合は、キーを変換できます。
次のコードを実行し。支払いアドレスを表示させます。
echo "$(cat payment.addr)"
テストネット用口座にあなたの支払い用アドレスをリクエストします。
次のコードを実行し。支払いアドレスを表示させます。
echo "$(cat payment.addr)"
このアドレスを上記ページのリクエスト欄に貼り付けます。
シェリーテストネット用口座は24時間ごとに100,000fADAを提供します。
支払い用アドレスに送金後、残高を確認してください。
続行する前に、ノードをブロックチェーンと完全に同期させる必要があります。完全に同期されていない場合は、残高が表示されません。
cardano-cli query utxo \--address $(cat payment.addr) \--mainnet \--allegra-era
次のように表示されます。
TxHash TxIx Lovelace----------------------------------------------------------------------------------------100322a39d02c2ead.... 0 1000000000
ステークプール登録後、やり直しは出来ません。
stake.vkey
を使用して、stake.cert
証明証を作成します。
cardano-cli stake-address registration-certificate \--stake-verification-key-file stake.vkey \--out-file stake.cert
stake.cert をブロックプロデューサーノードのcardano-my-nodeディレクトリにコピーします。 ttlパラメータを設定するには、最新のスロット番号を取得する必要があります。
currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slotNo')echo Current Slot: $currentSlot
残高とUTXOを出力します。
cardano-cli query utxo \--address $(cat payment.addr) \--mainnet \--allegra-era > fullUtxo.outtail -n +3 fullUtxo.out | sort -k3 -nr > balance.outcat balance.outtx_in=""total_balance=0while read -r utxo; doin_addr=$(awk '{ print $1 }' <<< "${utxo}")idx=$(awk '{ print $2 }' <<< "${utxo}")utxo_balance=$(awk '{ print $3 }' <<< "${utxo}")total_balance=$((${total_balance}+${utxo_balance}))echo TxHash: ${in_addr}#${idx}echo ADA: ${utxo_balance}tx_in="${tx_in} --tx-in ${in_addr}#${idx}"done < balance.outtxcnt=$(cat balance.out | wc -l)echo Total ADA balance: ${total_balance}echo Number of UTXOs: ${txcnt}
keyDepositの値を出力します。
keyDeposit=$(cat $NODE_HOME/params.json | jq -r '.keyDeposit')echo keyDeposit: $keyDeposit
ステークアドレス証明書の登録には2,000,000 lovelace (2ADA)が必要です。
build-rawトランザクションコマンドを実行します。
invalid-hereafterの値は、現在のスロット番号よりも大きくなければなりません。この例では現在のスロット番号+10000を使用します。
cardano-cli transaction build-raw \${tx_in} \--tx-out $(cat payment.addr)+0 \--invalid-hereafter $(( ${currentSlot} + 10000)) \--fee 0 \--out-file tx.tmp \--allegra-era \--certificate stake.cert
現在の最低手数料を計算します。
fee=$(cardano-cli transaction calculate-min-fee \--tx-body-file tx.tmp \--tx-in-count ${txcnt} \--tx-out-count 1 \--mainnet \--witness-count 2 \--byron-witness-count 0 \--protocol-params-file params.json | awk '{ print $1 }')echo fee: $fee
残高が、手数料+keyDepositの値よりも大きいことを確認してください。そうしないと機能しません。
計算結果を出力します。
txOut=$((${total_balance}-${keyDeposit}-${fee}))echo Change Output: ${txOut}
ステークアドレスを登録するトランザクションファイルを作成します。
cardano-cli transaction build-raw \${tx_in} \--tx-out $(cat payment.addr)+${txOut} \--invalid-hereafter $(( ${currentSlot} + 10000)) \--fee ${fee} \--certificate-file stake.cert \--allegra-era \--out-file tx.raw
tx.rawをエアギャップオフラインマシンのcardano-my-nodeディレクトリにコピーします。
paymentとstakeの秘密鍵でトランザクションファイルに署名します。
cardano-cli transaction sign \--tx-body-file tx.raw \--signing-key-file payment.skey \--signing-key-file stake.skey \--mainnet \--out-file tx.signed
tx.signedをブロックプロデューサーノードcardano-my-nodeディレクトリにコピーします。
署名されたトランザクションを送信します。
cardano-cli transaction submit \--tx-file tx.signed \--mainnet
ステークプール登録には500ADAの登録料が必要です。 payment.addrに入金されている必要があります。
JSONファイルを作成してプールのメタデータを作成します。
ticker名の長さは3~5文字にする必要があります。文字はA-Zと0-9のみで構成する必要があります。
descriptionの長さは255文字以内となります。
cd $NODE_HOMEcat > poolMetaData.json << EOF{"name": "MyPoolName","description": "My pool description","ticker": "MPN","homepage": "https://myadapoolnamerocks.com"}EOF
メタデータファイルのハッシュ値を計算します。
cardano-cli stake-pool metadata-hash --pool-metadata-file poolMetaData.json > poolMetaDataHash.txt
poolMetaDataHash.txtをエアギャップオフラインマシンへコピーしてください poolMetaData.jsonをあなたの公開用WEBサーバへアップロードしてください。
最小プールコストを出力します。
minPoolCost=$(cat $NODE_HOME/params.json | jq -r .minPoolCost)echo minPoolCost: ${minPoolCost}
minPoolCostは 340000000 lovelace (340 ADA)です。
ステークプールの登録証明書を作成します。 メタデータのURLとリレーノード情報を追記し構成します。リレーノード構成にはDNSベースまたはIPベースのどちらかを選択できます。
metadata-urlは64文字以内とし、あなたの環境に合わせて修正してください。
ブロックプロデューサーノードにあるvrf.vkeyをエアギャップオフラインマシンcardano-my-nodeディレクトリにコピーします。
pool.certを作成する
cardano-cli stake-pool registration-certificate \--cold-verification-key-file $HOME/cold-keys/node.vkey \--vrf-verification-key-file vrf.vkey \--pool-pledge 100000000 \--pool-cost 345000000 \--pool-margin 0.15 \--pool-reward-account-verification-key-file stake.vkey \--pool-owner-stake-verification-key-file stake.vkey \--mainnet \--single-host-pool-relay <dns based relay, example ~ relaynode1.myadapoolnamerocks.com> \--pool-relay-port 6000 \--metadata-url <poolMetaData.jsonをアップロードしたURLを記述> \--metadata-hash $(cat poolMetaDataHash.txt) \--out-file pool.cert
ここでは345ADAの固定費と15%のプールマージン、100ADAの誓約を設定しています。 ご自身の設定値に変更してください。
上記のpool.cert作成時、自身のリレー情報を以下の3パターンの記述方法があります。 ノード管理を簡単にするために、DNSベースのリレー設定をお勧めします。 もしリレーサーバを変更する場合、IPアドレスが変わるため、その都度登録証明書を再送する必要がありますがDNSベースで登録しておけば、IPアドレスが変更になってもお使いのドメイン管理画面にてIPアドレスを変更するだけで完了します。
DNSレコードに1つのエントリーの場合
--single-host-pool-relay <your first relay node address> \--pool-relay-port 6000 \--single-host-pool-relay <your Second relay node address> \--pool-relay-port 6000 \
ラウンドロビンDNSベース SRV DNS recordの場合
--multi-host-pool-relay <your first relay node address> \--pool-relay-port 6000 \
IPアドレス, 1ノード1IPアドレスの場合
--pool-relay-port 6000 \--pool-relay-ipv4 <your first relay node public IP address> \--pool-relay-port 6000 \--pool-relay-ipv4 <your second relay node public IP address> \
ステークプールにステークを誓約するファイルを作成します。
cardano-cli stake-address delegation-certificate \--stake-verification-key-file stake.vkey \--cold-verification-key-file $HOME/cold-keys/node.vkey \--out-file deleg.cert
pool.certとdeleg.certをブロックプロデューサーノードcardano-my-nodeディレクトリにコピーします。
自分のプールに資金を預けることをPledge(誓約)と呼ばれます
あなたの支払い用アドレスの残高はPledge額よりも大きい必要があります。
誓約金を宣言しても、実際にはどこにも移動されていません。payment.addrに残ったままです。
誓約を行わないと、ブロック生成の機会を逃し委任者は報酬を得ることができません。
あなたの誓約金はブロックされません。いつでも自由に取り出せます。
ttlパラメータを設定するには、最新のスロット番号を取得する必要があります。
currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slotNo')echo Current Slot: $currentSlot
残高とUTXOsを出力します。
cardano-cli query utxo \--address $(cat payment.addr) \--mainnet \--allegra-era > fullUtxo.outtail -n +3 fullUtxo.out | sort -k3 -nr > balance.outcat balance.outtx_in=""total_balance=0while read -r utxo; doin_addr=$(awk '{ print $1 }' <<< "${utxo}")idx=$(awk '{ print $2 }' <<< "${utxo}")utxo_balance=$(awk '{ print $3 }' <<< "${utxo}")total_balance=$((${total_balance}+${utxo_balance}))echo TxHash: ${in_addr}#${idx}echo ADA: ${utxo_balance}tx_in="${tx_in} --tx-in ${in_addr}#${idx}"done < balance.outtxcnt=$(cat balance.out | wc -l)echo Total ADA balance: ${total_balance}echo Number of UTXOs: ${txcnt}
poolDepositを出力します。
poolDeposit=$(cat $NODE_HOME/params.json | jq -r '.poolDeposit')echo poolDeposit: $poolDeposit
build-rawトランザクションコマンドを実行します。
invalid-hereafterの値は、現在のスロット番号よりも大きくなければなりません。この例では、現在のスロット+10000を使用します。
cardano-cli transaction build-raw \${tx_in} \--tx-out $(cat payment.addr)+$(( ${total_balance} - ${poolDeposit})) \--invalid-hereafter $(( ${currentSlot} + 10000)) \--fee 0 \--certificate-file pool.cert \--certificate-file deleg.cert \--allegra-era \--out-file tx.tmp
最低手数料を計算します。
fee=$(cardano-cli transaction calculate-min-fee \--tx-body-file tx.tmp \--tx-in-count ${txcnt} \--tx-out-count 1 \--mainnet \--witness-count 3 \--byron-witness-count 0 \--protocol-params-file params.json | awk '{ print $1 }')echo fee: $fee
payment.addrの残高が、手数料コスト+poolDeposit(500ADA)よりも大きいことを確認してください。小さい場合は機能しません。
計算結果を出力します。
txOut=$((${total_balance}-${poolDeposit}-${fee}))echo txOut: ${txOut}
トランザクションファイルを作成します。
cardano-cli transaction build-raw \${tx_in} \--tx-out $(cat payment.addr)+${txOut} \--invalid-hereafter $(( ${currentSlot} + 10000)) \--fee ${fee} \--certificate-file pool.cert \--certificate-file deleg.cert \--allegra-era \--out-file tx.raw
tx.rawをエアギャップオフラインマシンのcardano-my-nodeディレクトリにコピーします。
トランザクションに署名します。
cardano-cli transaction sign \--tx-body-file tx.raw \--signing-key-file payment.skey \--signing-key-file $HOME/cold-keys/node.skey \--signing-key-file stake.skey \--mainnet \--out-file tx.signed
tx.signedブロックプロデューサーノードcardano-my-nodeディレクトリにコピーします。
トランザクションを送信します。
cardano-cli transaction submit \--tx-file tx.signed \--mainnet
ステークプールIDは以下のように出力できます。
cardano-cli stake-pool id --cold-verification-key-file $HOME/cold-keys/node.vkey --output-format hex > stakepoolid.txtcat stakepoolid.txt
stakepoolid.txtをブロックプロデューサーノードcardano-my-nodeディレクトリにコピーします。
このファイルを用いて、自分のステークプールがブロックチェーンに登録されているか確認します。
cardano-cli query ledger-state --mainnet --allegra-era | grep publicKey | grep $(cat stakepoolid.txt)
文字列による戻り値が返ってきた場合は、正常に登録されています 👏
あなたのステークプールを次のサイトで確認することが出来ます。 https://pooltool.io/
この項目はリレーノードで実施します
バージョン1.25.1ではP2P(ピア・ツー・ピア)ノードを自動検出しないため、手動でトポロジーを構成する必要があります。この手順をスキップすると生成したブロックがブロックチェーン外で孤立するため、必須の設定項目となります。
この方法を提案して頂いた GROWPOOL および CNTOOLS Guild OPS へのクレジット表記。
ノード情報をトポロジーフェッチリストに公開するスクリプト「topologyUpdater.sh
」を作成します。 10行目の"CHANGE ME"をリレーノードのIPアドレスに変えます。
※26行目の"CHANGE ME"はそのままでお願いします。
以下コードをリレー用サーバで実施してください。
cat > $NODE_HOME/topologyUpdater.sh << EOF#!/bin/bash# shellcheck disable=SC2086,SC2034USERNAME=$(whoami)CNODE_PORT=6000 # 自身のリレーノードポート番号を記入CNODE_HOSTNAME="CHANGE ME" # リレーノードのIPアドレスまたはDNSアドレスを記入CNODE_BIN="/usr/local/bin"CNODE_HOME=$NODE_HOMECNODE_LOG_DIR="\${CNODE_HOME}/logs"GENESIS_JSON="\${CNODE_HOME}/${NODE_CONFIG}-shelley-genesis.json"NETWORKID=\$(jq -r .networkId \$GENESIS_JSON)CNODE_VALENCY=1 # optional for multi-IP hostnamesNWMAGIC=\$(jq -r .networkMagic < \$GENESIS_JSON)[[ "\${NETWORKID}" = "Mainnet" ]] && HASH_IDENTIFIER="--mainnet" || HASH_IDENTIFIER="--testnet-magic \${NWMAGIC}"[[ "\${NWMAGIC}" = "764824073" ]] && NETWORK_IDENTIFIER="--mainnet" || NETWORK_IDENTIFIER="--testnet-magic \${NWMAGIC}"export PATH="\${CNODE_BIN}:\${PATH}"export CARDANO_NODE_SOCKET_PATH="\${CNODE_HOME}/db/socket"blockNo=\$(/usr/local/bin/cardano-cli query tip \${NETWORK_IDENTIFIER} | jq -r .blockNo )# Note:# ノードをIPv4/IPv6デュアルスタックネットワーク構成で実行している場合# IPv4で実行するには、以下の curl コマンドに -4 パラメータを追加してください (curl -4 -s ...)if [ "\${CNODE_HOSTNAME}" != "CHANGE ME" ]; thenT_HOSTNAME="&hostname=\${CNODE_HOSTNAME}"elseT_HOSTNAME=''fiif [ ! -d \${CNODE_LOG_DIR} ]; thenmkdir -p \${CNODE_LOG_DIR};ficurl -4 -s "https://api.clio.one/htopology/v1/?port=\${CNODE_PORT}&blockNo=\${blockNo}&valency=\${CNODE_VALENCY}&magic=\${NWMAGIC}\${T_HOSTNAME}" | tee -a \$CNODE_LOG_DIR/topologyUpdater_lastresult.jsonEOF
権限を追加し、「topologyUpdater.sh」を実行します。
###### On relaynode1###cd $NODE_HOMEchmod +x topologyUpdater.sh./topologyUpdater.sh
topologyUpdater.sh
が正常に実行された場合、以下の形式が表示されます。
{ "resultcode": "201", "datetime":"2020-07-28 01:23:45", "clientIp": "1.2.3.4", "iptype": 4, "msg": "nice to meet you" }
スクリプトが実行されるたびに、$NODE_HOME/logs
にログが作成されます。 ※topologyUpdater.sh
は1時間以内に2回以上実行しないで下さい。最悪の場合ブラックリストに追加されることがあります。
crontabジョブを追加し、「topologyUpdater.sh」が自動的に実行されるように設定します。
以下のコードは毎時22分に実行されるように指定しています。(上記スクリプトを実行した時間(分)より以前の分を指定して下さい。)
以下のコードは複数回実行しないで下さい。 複数回実行した場合、同じ時間に複数自動実行されるスケジュールが登録されてしまうので、ブラックリストに入ります。
###### On relaynode1###cat > $NODE_HOME/crontab-fragment.txt << EOF22 * * * * ${NODE_HOME}/topologyUpdater.shEOFcrontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txtrm crontab-fragment.txt
no crontab for ~~ というメッセージが表示されることがありますが、Cron初回設定時に表示されるメッセージとなりますので、問題ありません。
crontab -l
以下が返り値として表示されればOK。
"22 /home/*/cardano-my-node/topologyUpdater.sh"
4時間の間で4回スクリプトが実行された後に、ノードがオンライン状態で有ることが認められた場合にノードIPがトポロジーフェッチリストに登録されます。
cd $NODE_HOME/logscat topologyUpdater_lastresult.json
以下の内容が表示されていれば登録成功 resultcodeが400番台・500番台の場合は、サーバ設定に問題があります。
{ "resultcode": "201", "datetime":"2021-01-10 18:30:06", "clientIp": "000.000.000.000", "iptype": 4, "msg": "nice to meet you" }{ "resultcode": "203", "datetime":"2021-01-10 19:30:03", "clientIp": "000.000.000.000", "iptype": 4, "msg": "welcome to the topology" }{ "resultcode": "204", "datetime":"2021-01-10 20:30:04", "clientIp": "000.000.000.000", "iptype": 4, "msg": "glad you're staying with us" }
リレーノードIPがトポロジーフェッチリストに登録されたことを確認後、以下のセクションを実行して下さい。
トポロジーファイルを更新するrelay-topology_pull.sh
スクリプトを作成します。 コマンドラインに送信する際に、自身のブロックプロデューサーのIPアドレスとポート番号に書き換えて下さい
※お知り合いのノードや自ノードが複数ある場合は、IOHKノード情報の後に "|" で区切ってIPアドレス:ポート番号:Valency の形式で追加できます。
###### On relaynode1###cat > $NODE_HOME/relay-topology_pull.sh << EOF#!/bin/bashBLOCKPRODUCING_IP=<BLOCK PRODUCERS PUBLIC IP ADDRESS>BLOCKPRODUCING_PORT=6000curl -s -o $NODE_HOME/${NODE_CONFIG}-topology.json "https://api.clio.one/htopology/v1/fetch/?max=20&customPeers=\${BLOCKPRODUCING_IP}:\${BLOCKPRODUCING_PORT}:1|relays-new.cardano-mainnet.iohk.io:3001:2"EOF
shファイルに権限を追加し実行します。
###### On relaynode1###chmod +x relay-topology_pull.sh./relay-topology_pull.sh
新しいトポロジーファイル(mainnet-topology.json)は、ステークプールを再起動した後に有効となります。
###### On relaynode1###sudo systemctl reload-or-restart cardano-node
トポロジーファイルを更新した場合は、リレーノードを再起動することを忘れないで下さい。
****🔥 重要な確認事項: ブロックを生成するには、「TXs processed」が増加していることを確認する必要があります。万一、増加していない場合にはトポロジーファイルの内容を再確認して下さい。「peers」数はリレーノードが他ノードと接続している数を表しています。
🛠 gLiveView で確認
cd $NODE_HOME/scripts./gLiveView.sh
「Txs processed」が増加しているか確認する
****🛑 注意事項r: ブロックプロデューサーノードを実行するためには、以下の3つのファイルが必要です。このファイルが揃っていない場合や起動時に指定されていない場合はブロックが生成できません。
###### On ブロックプロデューサーノード###KES=\${DIRECTORY}/kes.skeyVRF=\${DIRECTORY}/vrf.skeyCERT=\${DIRECTORY}/node.cert
上記以外のキーファイルは、エアギャップオフライン環境で保管する必要があります
おめでとうございます!ステークプールが登録され、ブロックを作成する準備が出来ました。
ブロックが正常に生成できた後、エポック終了後に報酬を確認しましょう!
cardano-cli query stake-address-info \--address $(cat stake.addr) \--mainnet \--allegra-era
プロメテウスはターゲットに指定したメトリックHTTPエンドポイントをスクレイピングし、情報を収集する監視ツールです。オフィシャルドキュメントはこちら グラファナは収集されたデータを視覚的に表示させるダッシュボードツールです。
「prometheus」および「prometheus node exporter」をインストールします。 この手順では、リレーノード1でprometheusとGrafana本体を稼働させ、リレーノード1およびブロックプロデューサーノードの情報を取得する手順です。
sudo apt-get install -y prometheus prometheus-node-exporter
sudo apt-get install -y prometheus-node-exporter
grafanaをインストールします。
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" > grafana.listsudo mv grafana.list /etc/apt/sources.list.d/grafana.list
sudo apt-get update && sudo apt-get install -y grafana
サービスを有効にして、自動的に開始されるように設定します。
sudo systemctl enable grafana-server.servicesudo systemctl enable prometheus.servicesudo systemctl enable prometheus-node-exporter.service
sudo systemctl enable prometheus-node-exporter.service
/etc/prometheus/prometheus.yml
に格納されている、「prometheus.yml」を更新します。
ご自身の<ブロックプロデューサーIPアドレス>に書き換えて、コマンドを送信してください。
cat > prometheus.yml << EOFglobal:scrape_interval: 15s # 15秒ごとに取得します# Attach these labels to any time series or alerts when communicating with# external systems (federation, remote storage, Alertmanager).external_labels:monitor: 'codelab-monitor'# A scrape configuration containing exactly one endpoint to scrape:# Here it's Prometheus itself.scrape_configs:# The job name is added as a label job=<job_name> to any timeseries scraped from this config.- job_name: 'prometheus'static_configs:- targets: ['localhost:9100']- targets: ['<ブロックプロデューサーIPアドレス>:9100']- targets: ['<ブロックプロデューサーIPアドレス>:12798']labels:alias: 'block-producing-node'type: 'cardano-node'- targets: ['localhost:12798']labels:alias: 'relaynode1'type: 'cardano-node'EOFsudo mv prometheus.yml /etc/prometheus/prometheus.yml
サービスを起動します。
sudo systemctl restart grafana-server.servicesudo systemctl restart prometheus.servicesudo systemctl restart prometheus-node-exporter.service
サービスが正しく実行されていることを確認します。
sudo systemctl status grafana-server.service prometheus.service prometheus-node-exporter.service
${NODE_CONFIG}-config.jsonに新しい hasEKG
情報と hasPrometheus
ポート情報を更新します。
cd $NODE_HOMEsed -i ${NODE_CONFIG}-config.json -e "s/127.0.0.1/0.0.0.0/g"
cd $NODE_HOMEsed -i ${NODE_CONFIG}-config.json -e "s/127.0.0.1/0.0.0.0/g"
ファイアウォールを設定している場合は、ブロックプロデューサーノードにて9100番と12798番ポートをリレーノードIP指定で開放して下さい。 リレーノード1では、Grafana用に3000番ポートを開放してください。
ステークプールを停止してスクリプトを再起動します。
sudo systemctl reload-or-restart cardano-node
sudo systemctl reload-or-restart cardano-node
リレーノード1で、ローカルブラウザから http://localhost:3000 または http://<リレーノードIPアドレス>:3000 を開きます。 事前に 3000番ポートを開いておく必要があります。
ログイン名・PWは次のとおりです。 admin / admin
パスワードを変更します。
左メニューの歯車アイコンから データソースを追加します。
「Add data source」をクリックし、「Prometheus」を選択します。
名前は prometheus"としてください。
URL を http://localhost:9090に設定します。
Save & Testをクリックします。
次のJSONファイルをダウンロードします。
左メニューからCreate + iconを選択 > Importをクリックします。
9でダウンロードしたJSONファイルをアップロードします。
Importボタンをクリックします。
おめでとうございます!これで基本的な設定は完了です。 次の項目は、運用中の便利なコマンドや保守のヒントが書かれています。
このマニュアル制作に携わった全ての方に、感謝申し上げます。 快く翻訳を承諾して頂いた、CoinCashewには敬意を表します。 この活動をサポートして頂ける方は、是非寄付をよろしくお願い致します。
addr1qxhazv2dp8yvqwyxxlt7n7ufwhw582uqtcn9llqak736ptfyf8d2zwjceymcq6l5gxht0nx9zwazvtvnn22sl84tgkyq7guw7q
カルダノ分散化、日本コミュニティ発展の為に日本語化させて頂きました。私達をサポート頂ける方は当プールへ委任頂けますと幸いです。
Ticker:XSP
Pool ID↓
788898a81174665316af96880459dcca053f7825abb1b0db9a433630
ADAアドレス
addr1q85kms3xw788pzxcr8g8d4umxjcr57w55k2gawnpwzklu97sc26z2lhct48alhew43ry674692u2eynccsyt9qexxsesjzz8qp
👏 Antonie of CNT for being awesomely helpful with Youtube content and in telegram.
👏 Special thanks to Kaze-Stake for the pull requests and automatic script contributions.
👏 The Legend of ₳da [TLOA] for translating this guide to Spanish.
👏 X-StakePool [BTBF] for translating this guide to Japanese.
👏 Chris of OMEGA | CODEX for security improvements.
👏 Raymond of GROW for topologyUpdater improvements and being awesome.
ホットキーの有効期限が切れると、ホットキーを再作成し新しい運用証明書を発行する必要があります。
kesPeriodの更新: 新しい運用証明書を発行するときは、次を実行して「startKesPeriod」を見つけます
cd $NODE_HOMEslotNo=$(cardano-cli query tip --mainnet | jq -r '.slotNo')slotsPerKESPeriod=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r '.slotsPerKESPeriod')kesPeriod=$((${slotNo} / ${slotsPerKESPeriod}))startKesPeriod=${kesPeriod}echo startKesPeriod: ${startKesPeriod}
cd $NODE_HOMEcardano-cli node key-gen-KES \--verification-key-file kes.vkey \--signing-key-file kes.skey
kes.vkeyをエアギャップオフラインマシンのcardano-my-nodeディレクトリにコピーします。
次のコマンドで、新しい node.cert
ファイルを作成します。このときstartKesPeriodの値を下記の<startKesPeriod>の箇所に置き換えてからコマンドを送信してください。
<startKesPeriod>の部分を上記で算出した数値(startKesPeriodの値)に置き換えます。
cd $NODE_HOMEchmod u+rwx $HOME/cold-keyscardano-cli node issue-op-cert \--kes-verification-key-file kes.vkey \--cold-signing-key-file $HOME/cold-keys/node.skey \--operational-certificate-issue-counter $HOME/cold-keys/node.counter \--kes-period <startKesPeriod> \--out-file node.certchmod a-rwx $HOME/cold-keys
node.cert をブロックプロデューサーノードのcardano-my-nodeディレクトリにコピーします。
この手順を完了するには、ブロックプロデューサーノードを停止して再起動します。
sudo systemctl reload-or-restart cardano-node
●ブロックログを導入している場合は、各種サービスを再起動してください
sudo systemctl reload-or-restart cnode-cncli-sync.servicesudo systemctl reload-or-restart cnode-cncli-validate.servicesudo systemctl reload-or-restart cnode-cncli-leaderlog.servicesudo systemctl reload-or-restart cnode-logmonitor.service
****✨ ヒント: ホットキーを作成したら、コールドキーへのアクセス件を変更しセキュリティを向上させることができます。これによって誤削除、誤った編集などから保護できます。
ロックするには
chmod a-rwx $HOME/cold-keys
ロックを解除するには
chmod u+rwx $HOME/cold-keys
もう一度はじめからやり直したいですか?次の方法でやり直すことができます。
git repoを削除してから $NODE_HOME
と cold-keys
ディレクトリの名前を変更します (またはオプションで削除します)
rm -rf $HOME/git/cardano-node/ $HOME/git/libsodium/mv $NODE_HOME $(basename $NODE_HOME)_backup_$(date -I)mv $HOME/cold-keys $HOME/cold-keys_backup_$(date -I)
ブロックチェーンファイルの破損やノードがスタックして動かない場合、dbファイルを削除することで初めから同期をやり直すことができます。
cd $NODE_HOMErm -rf db
誓約、固定費、Margin、リレー情報、メタ情報を変更する場合は、登録証明書の再送を行います。
minPoolCostを出力します。
minPoolCost=$(cat $NODE_HOME/params.json | jq -r .minPoolCost)echo minPoolCost: ${minPoolCost}
minPoolCost は340000000 lovelace (340 ADA)です。 --pool-cost
は最低でもこの値以上に指定します。
poolMetaData.jsonを変更する場合は、メタデータファイルのハッシュを再計算し、更新されたpoolMetaData.jsonをWEBサーバへアップロードしてください。 詳細については 項目9を参照して下さい。
cd $NODE_HOMEcardano-cli stake-pool metadata-hash --pool-metadata-file poolMetaData.json > poolMetaDataHash.txt
登録証明書トランザクションを作成します。
複数のリレーノードを設定する場合は 項目12 を参考にパラメーターを指定して下さい。
poolMetaDataHash.txt をエアギャップオフラインマシンのcardano-my-nodeディレクトリにコピーします。
metadata-urlは64文字以下にする必要があります。
cd $NODE_HOME
cardano-cli stake-pool registration-certificate \--cold-verification-key-file $HOME/cold-keys/node.vkey \--vrf-verification-key-file vrf.vkey \--pool-pledge 1000000000 \--pool-cost 345000000 \--pool-margin 0.20 \--pool-reward-account-verification-key-file stake.vkey \--pool-owner-stake-verification-key-file stake.vkey \--mainnet \--single-host-pool-relay <dns based relay, example ~ relaynode1.myadapoolnamerocks.com> \--pool-relay-port 6000 \--metadata-url <url where you uploaded poolMetaData.json> \--metadata-hash $(cat poolMetaDataHash.txt) \--out-file pool.cert
この例では345ADAの固定費と20%のMrgin、1000ADAを誓約しています。
ステークプールに誓約します。
cardano-cli stake-address delegation-certificate \--stake-verification-key-file stake.vkey \--cold-verification-key-file $HOME/cold-keys/node.vkey \--out-file deleg.cert
pool.certとdeleg.cert をブロックプロデューサーのcardano-my-nodeディレクトリにコピーします。
ttlパラメータを設定するには、最新のスロット番号を取得する必要があります。
currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slotNo')echo Current Slot: $currentSlot
残高と UTXOsを出力します。
cardano-cli query utxo \--address $(cat payment.addr) \--mainnet \--allegra-era > fullUtxo.outtail -n +3 fullUtxo.out | sort -k3 -nr > balance.outcat balance.outtx_in=""total_balance=0while read -r utxo; doin_addr=$(awk '{ print $1 }' <<< "${utxo}")idx=$(awk '{ print $2 }' <<< "${utxo}")utxo_balance=$(awk '{ print $3 }' <<< "${utxo}")total_balance=$((${total_balance}+${utxo_balance}))echo TxHash: ${in_addr}#${idx}echo ADA: ${utxo_balance}tx_in="${tx_in} --tx-in ${in_addr}#${idx}"done < balance.outtxcnt=$(cat balance.out | wc -l)echo Total ADA balance: ${total_balance}echo Number of UTXOs: ${txcnt}
build-rawトランザクションコマンドを実行します。
ttlの値は、現在のスロット番号よりも大きくなければいけません。この例では現在のスロット番号+10000で設定しています。
cardano-cli transaction build-raw \${tx_in} \--tx-out $(cat payment.addr)+${total_balance} \--invalid-hereafter $(( ${currentSlot} + 10000)) \--fee 0 \--certificate-file pool.cert \--certificate-file deleg.cert \--allegra-era \--out-file tx.tmp
最低手数料を計算します。
fee=$(cardano-cli transaction calculate-min-fee \--tx-body-file tx.tmp \--tx-in-count ${txcnt} \--tx-out-count 1 \--mainnet \--witness-count 3 \--byron-witness-count 0 \--protocol-params-file params.json | awk '{ print $1 }')echo fee: $fee
計算結果を出力します。
txOut=$((${total_balance}-${fee}))echo txOut: ${txOut}
トランザクションファイルを構築します。
cardano-cli transaction build-raw \${tx_in} \--tx-out $(cat payment.addr)+${txOut} \--invalid-hereafter $(( ${currentSlot} + 10000)) \--fee ${fee} \--certificate-file pool.cert \--certificate-file deleg.cert \--allegra-era \--out-file tx.raw
tx.raw をエアギャップオフラインマシンのcardano-my-nodeディレクトリにコピーします。
トランザクションに署名します。
cardano-cli transaction sign \--tx-body-file tx.raw \--signing-key-file payment.skey \--signing-key-file $HOME/cold-keys/node.skey \--signing-key-file stake.skey \--mainnet \--out-file tx.signed
tx.signedををブロックプロデューサーノードのcardano-my-nodeディレクトリにコピーします。
トランザクションを送信します。
cardano-cli transaction submit \--tx-file tx.signed \--mainnet
変更は次のエポックで有効になります。次のエポック移行後にプール設定が正しいことを確認してください。
cardano-cli query ledger-state --mainnet --allegra-era --out-file ledger-state.jsonjq -r '.esLState._delegationState._pstate._pParams."'"$(cat stakepoolid.txt)"'" // empty' ledger-state.json
一般的な使用例
stake/paymentキーのバックアップをダウンロードする
オフラインノードからブロックプロデューサーへ新しいファイルをアップロードする。
ssh <USERNAME>@<IP ADDRESS> -p <SSH-PORT>rsync -avzhe “ssh -p <SSH-PORT>” <USERNAME>@<IP ADDRESS>:<PATH TO NODE DESTINATION> <PATH TO LOCAL PC DESTINATION>
例:
ssh myusername@6.1.2.3 -p 12345
rsync -avzhe "ssh -p 12345" myusername@6.1.2.3:/home/myusername/cardano-my-node/stake.vkey ./stake.vkey
ssh <USERNAME>@<IP ADDRESS> -p <SSH-PORT>rsync -avzhe “ssh -p <SSH-PORT>” <PATH TO LOCAL PC DESTINATION> <USERNAME>@<IP ADDRESS>:<PATH TO NODE DESTINATION>
例:
ssh myusername@6.1.2.3 -p 12345
rsync -avzhe "ssh -p 12345" ./node.cert myusername@6.1.2.3:/home/myusername/cardano-my-node/node.cert
信頼できるステークプールのなりすましや、プール運営を悪用する人から身を守るために、所有者はITNステークプールの所有権を証明することでティッカーを証明できます。
ITNのバイナリファイルが$NODE_HOME
にあることを確認して下さい。 itn_owner.skey
はステークプールIDに署名するために使用されています。
./jcli key sign --secret-key itn_owner.skey stakepoolid.txt --output stakepoolid.sig
次のコマンドでプールIDを確認します。
cat stakepoolid.sig
ITNで作成したファイルで、所有者の公開鍵を見つけます。このデータは末尾が「.pub」で保存されている可能性があります。
最新の.jsonファイルをダウンロードして、構成ファイルを最新の状態に保ちます。
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')cd $NODE_HOMEwget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-byron-genesis.jsonwget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-shelley-genesis.jsonwget -N https://hydra.iohk.io/build/${NODE_BUILD_NUM}/download/1/${NODE_CONFIG}-config.jsonsed -i ${NODE_CONFIG}-config.json \-e "s/TraceBlockFetchDecisions\": false/TraceBlockFetchDecisions\": true/g" \-e "s/127.0.0.1/0.0.0.0/g"
10 ADA を payment.addrから自分のアドレスへ送信する例です 🙃
まずは、最新のスロット番号を取得し invalid-hereafter パラメータを正しく設定します。
currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slotNo')echo Current Slot: $currentSlot
lovelaces形式で送信する金額を設定します。. ✨ 1 ADA = 1,000,000 lovelaces で覚えます。
amountToSend=10000000echo amountToSend: $amountToSend
送金先のアドレスを設定します。
destinationAddress=<送金先アドレス>echo destinationAddress: $destinationAddress
残高と UTXOsを出力します。
cardano-cli query utxo \--address $(cat payment.addr) \--mainnet \--allegra-era > fullUtxo.out