プール廃止処理¶
プール廃止の流れ
graph LR
A[1-リタイア処理] -->|500ADA返還| B(2-登録料返還確認);
C[3-stake.addrから全額引出処理] -->|全額| D(3-payment.addr着金確認);
E[4-stake.addr解除処理] -->|2ADA返還| F(4-payment.addr確認);
G[5-payment.addr全額引出処理] -->|全額| H(5-任意のアドレス確認);
click A "./#1"
click B "./#_3"
click C "../withdrawal/#2-1-paymentaddr"
click E "./#2"
click G "./#3paymentaddr"
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ディレクトリにコピー
graph LR
A[エアギャップ] -->|pool.dereg| B[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ディレクトリにコピー
graph LR
A[BP] -->|tx.raw| B[エアギャップ];
トランザクションに署名
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 を ブロックプロデューサノードのcnodeディレクトリにコピーします。
graph LR
A[エアギャップ] -->|tx.signed| B[BP];
トランザクションの送信
cardano-cli latest transaction submit \
--tx-file tx.signed \
$NODE_NETWORK
1-1. リタイア確認¶
- 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ディレクトリにコピーします。
graph LR
A[エアギャップ] -->|stake.addr| B[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 を ブロックプロデューサノードのcnodeディレクトリにコピーします。
graph LR
A[エアギャップ] -->|stake-dereg.cert| B[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ディレクトリにコピーします。
graph LR
A[BP] -->|tx.raw| B[エアギャップ];
トランザクションに署名
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ディレクトリにコピーします。
graph LR
A[エアギャップ] -->|tx.signed| B[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ディレクトリにコピーします。
graph LR
A[BP] -->|tx.raw| B[エアギャップ];
トランザクションに署名
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 をブロックプロデューサーノードのcnodeディレクトリにコピーします。
ファイル転送
エアギャップのtx.signed をBPのcnodeディレクトリにコピーします。
graph LR
A[エアギャップ] -->|tx.signed| B[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
----------------------------------------------------------------------------------------