SPO JAPAN GUILD
ステークプール運用

プール廃止処理

プール廃止の流れ

500ADA返還 全額 2ADA返還 全額 1-リタイア処理 2-登録料返還確認 3-stake.addrから全額引出処理 3-payment.addr着金確認 4-stake.addr解除処理 4-payment.addr確認 5-payment.addr全額引出処理 5-任意のアドレス確認

1. リタイア処理

現在のエポックの計算

startTimeGenesis=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r .systemStart)
startTimeSec=$(date --date=${startTimeGenesis} +%s)
currentTimeSec=$(date -u +%s)
epochLength=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r .epochLength)
epoch=$(( (${currentTimeSec}-${startTimeSec}) / ${epochLength} ))
echo current epoch: ${epoch}

引退エポックの算出

プールが最も早く引退できるエポックと最も遅い引退エポックを見つけます。

poolRetireMaxEpoch=$(cat $NODE_HOME/params.json | jq -r '.poolRetireMaxEpoch')
echo poolRetireMaxEpoch: ${poolRetireMaxEpoch}

minRetirementEpoch=$(( ${epoch} + 1 ))
maxRetirementEpoch=$(( ${epoch} + ${poolRetireMaxEpoch} ))

echo リタイア可能最短エポック: ${minRetirementEpoch}
echo リタイア可能最長エポック: ${maxRetirementEpoch}

リタイアのタイミングについて

: エポック320でeMax18の場合,

  • 最も早いポックは 321 ( 現在のエポック + 1)

  • 最も遅いエポックは 338 ( eMax + 現在のエポック)

  • プールはリタイア指定エポック開始時にリタイア処理されます。

  • もし心変わりがある場合は、エポック指定エポック開始前に運用証明書(pool.cert)の更新を送信することでリタイア手続きを無効にできます。

  • プール登録料500ADAはリタイア処理エポック開始時にstake.addrに入金されます。

登録解除証明書 pool.deregの作成

以下のコマンド内の --epoch *** にリタイアしたいエポックを記入します。

cd $NODE_HOME
chmod u+rwx $HOME/cold-keys
cardano-cli latest stake-pool deregistration-certificate \
  --cold-verification-key-file $HOME/cold-keys/node.vkey \
  --epoch *** \
  --out-file pool.dereg

ファイル転送

エアギャップのpool.deregをBPのcnodeディレクトリにコピー

pool.dereg エアギャップ BP

payment.addrの残高参照

cd $NODE_HOME
cardano-cli latest query utxo \
  --address $(cat payment.addr) \
  $NODE_NETWORK \
  --output-text \
  --out-file fullUtxo.out

tail -n +3 fullUtxo.out | sort -k3 -nr | sed -e '/lovelace + [0-9]/d' > balance.out

cat balance.out

UTXOを算出

tx_in=""
total_balance=0
while read -r utxo; do
  in_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.out
txcnt=$(cat balance.out | wc -l)
echo Total ADA balance: ${total_balance}
echo Number of UTXOs: ${txcnt}

現在のスロットを算出

currentSlot=$(cardano-cli latest query tip $NODE_NETWORK | jq -r '.slot')
echo Current Slot: $currentSlot

トランザクションのビルド

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+${total_balance} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee 200000 \
  --certificate-file pool.dereg \
  --out-file tx.tmp

最低料金の計算

fee=$(cardano-cli latest transaction calculate-min-fee \
  --tx-body-file tx.tmp \
  --witness-count 2 \
  --output-text \
  --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

変更出力の計算

txOut=$((${total_balance}-${fee}))
echo txOut: ${txOut}

トランザクションのビルド

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+${txOut} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee ${fee} \
  --certificate-file pool.dereg \
  --out-file tx.raw

ファイル転送

BPのtx.rawをエアギャップのcnodeディレクトリにコピー

tx.raw BP エアギャップ

トランザクションに署名

cardano-cli latest transaction sign \
  --tx-body-file tx.raw \
  --signing-key-file payment.skey \
  --signing-key-file $HOME/cold-keys/node.skey \
  $NODE_NETWORK \
  --out-file tx.signed

コールドキーのロック

chmod a-rwx $HOME/cold-keys

ファイル転送

エアギャップのtx.signed を BPのcnodeディレクトリにコピーします。

tx.signed エアギャップ BP

トランザクションの送信

cardano-cli latest transaction submit \
  --tx-file tx.signed \
  $NODE_NETWORK

リタイア確認

  • KOIOS APIを使用してリタイア処理ステータスを確認できます。
cd $NODE_HOME
curl -s -X POST -H "content-type: application/json" -d @- "https://api.koios.rest/api/v1/pool_info" << EOS | jq '.[0].pool_status,.[0].retiring_epoch'
{"_pool_bech32_ids":["$(cat 'pool.id-bech32')"]}
EOS
期待される表示例:
#戻り値サンプル
"retired" # "retiring"でリタイア処理待ち "retired"でリタイア済み 
309 #リタイアエポック

2. 登録料返還確認

注意

以降の処理は、プールのリタイア処理が完了してから実施してください

ファイル転送

エアギャップのstake.addr を BPのcnodeディレクトリにコピーします。

stake.addr エアギャップ BP
cd $NODE_HOME
cardano-cli latest query stake-address-info \
  --address $(cat stake.addr) \
  $NODE_NETWORK

戻り値確認

rewardAccountBalance: の値を確認

3. stake.addrから引き出し

stake.addrからpayment.addrへ送金する方法

4. ステークキーの解除

注意

  • この手順ではstake.addrの登録を解除し、2ADAの返還手続きを行います。
  • プール登録料(500ADA)が返還される前に以下の処理を行ってしまうと、500ADAを受け取ることが出来ません。
  • 以下の手続きは、プール登録料の500ADAを受け取ってから実施してください。

ステークキー登録解除証明書作成

cd $NODE_HOME
cardano-cli latest stake-address deregistration-certificate \
  --stake-verification-key-file stake.vkey \
  --key-reg-deposit-amt 2000000 \
  --out-file stake-dereg.cert

ファイル転送

エアギャップのstake-dereg.cert を BPのcnodeディレクトリにコピーします。

stake-dereg.cert エアギャップ BP

ステークキー登録料算出

keyDeposit=$(cat $NODE_HOME/params.json | jq -r '.stakeAddressDeposit')
echo keyDeposit: $keyDeposit

最新スロット算出

cd $NODE_HOME
currentSlot=$(cardano-cli latest query tip $NODE_NETWORK | jq -r '.slot')
echo Current Slot: $currentSlot

payment.addr残高を参照

cardano-cli latest query utxo \
  --address $(cat payment.addr) \
  $NODE_NETWORK \
  --output-text \
  --out-file fullUtxo.out

tail -n +3 fullUtxo.out | sort -k3 -nr | sed -e '/lovelace + [0-9]/d' > balance.out

cat balance.out

UTXOを算出

tx_in=""
total_balance=0
while read -r utxo; do
  in_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.out
txcnt=$(cat balance.out | wc -l)
echo Total ADA balance: ${total_balance}
echo Number of UTXOs: ${txcnt}

仮トランザクションファイルを作成

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+$(( ${total_balance} + ${keyDeposit} )) \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee 200000 \
  --certificate stake-dereg.cert \
  --out-file tx.tmp

最低料金の計算

fee=$(cardano-cli latest transaction calculate-min-fee \
  --tx-body-file tx.tmp \
  --witness-count 2 \
  --output-text \
  --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

変更出力の計算

txOut=$((total_balance+keyDeposit-fee))
echo Change Output: ${txOut}

トランザクションのビルド

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out $(cat payment.addr)+${txOut} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee ${fee} \
  --certificate-file stake-dereg.cert \
  --out-file tx.raw

ファイル転送

BPのtx.raw をエアギャップのcnodeディレクトリにコピーします。

tx.raw BP エアギャップ

トランザクションに署名

cd $NODE_HOME
cardano-cli latest transaction sign \
  --tx-body-file tx.raw \
  --signing-key-file payment.skey \
  --signing-key-file stake.skey \
  $NODE_NETWORK \
  --out-file tx.signed

ファイル転送

エアギャップのtx.signed をBPのcnodeディレクトリにコピーします。

tx.signed エアギャップ BP
cardano-cli latest transaction submit \
  --tx-file tx.signed \
  $NODE_NETWORK

5. 全額引き出し(payment.addr)

まずは、最新のスロット番号を取得し invalid-hereafter パラメータを正しく設定します。

cd $NODE_HOME
currentSlot=$(cardano-cli latest query tip $NODE_NETWORK | jq -r '.slot')
echo Current Slot: $currentSlot

送金先のアドレスの設定

destinationAddress=送金先アドレス
echo destinationAddress: $destinationAddress

payment.addrの残高の参照

cardano-cli latest query utxo \
  --address $(cat payment.addr) \
  $NODE_NETWORK \
  --output-text \
  --out-file fullUtxo.out

tail -n +3 fullUtxo.out | sort -k3 -nr > balance.out

cat balance.out

UTXOを算出

tx_in=""
total_balance=0
while read -r utxo; do
  in_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.out
txcnt=$(cat balance.out | wc -l)
echo Total ADA balance: ${total_balance}
echo Number of UTXOs: ${txcnt}

トランザクションのビルド

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out ${destinationAddress}+${total_balance} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee 200000 \
  --out-file tx.tmp

最低手数料の出力

fee=$(cardano-cli latest transaction calculate-min-fee \
  --tx-body-file tx.tmp \
  --witness-count 1 \
  --output-text \
  --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

計算結果の出力

txOut=$((${total_balance}-${fee}))
echo Change Output: ${txOut}

送金金額を確認

amountToSend=$((${txOut}))
echo amountToSend: $amountToSend

トランザクションのビルド

cardano-cli latest transaction build-raw \
  ${tx_in} \
  --tx-out ${destinationAddress}+${amountToSend} \
  --invalid-hereafter $(( ${currentSlot} + 10000)) \
  --fee ${fee} \
  --out-file tx.raw

ファイル転送

BPのtx.raw をエアギャップのcnodeディレクトリにコピーします。

tx.raw BP エアギャップ

トランザクションに署名

cd $NODE_HOME
cardano-cli latest transaction sign \
  --tx-body-file tx.raw \
  --signing-key-file payment.skey \
  $NODE_NETWORK \
  --out-file tx.signed

tx.signed をBPのcnodeディレクトリにコピーします。

ファイル転送

エアギャップのtx.signed をBPのcnodeディレクトリにコピーします。

tx.signed エアギャップ BP

署名済みトランザクションの送信

cardano-cli latest transaction submit \
  --tx-file tx.signed \
  $NODE_NETWORK

全額出金されているかを確認します。

cd $NODE_HOME
cardano-cli latest query utxo \
  --address $(cat payment.addr) \
  $NODE_NETWORK \
  --output-text

トランザクションが消えていれば問題ありません。

期待される表示例:
                           TxHash                                 TxIx        Lovelace
----------------------------------------------------------------------------------------

Last updated on

Cookieの使用について

当サイトでは、ドキュメントの効果測定と利用状況の把握のため、Google Analytics を使用しています。

同意すると、分析用 Cookie が有効になります。