Pool을 은퇴시키고 출금하는 방법.
기본적인 틀은 같습니다. 원장을 만들고 제출하면 됩니다.
다만 풀을 은퇴시킬때는 은퇴 원장을 작성해서 제출하는 차이가 있을 뿐입니다.
block producer에서
cardano-cli query protocol-parameters \
--mainnet \
--out-file $NODE_HOME/params.json
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 earliest epoch for retirement is: ${minRetirementEpoch}
echo latest epoch for retirement is: ${maxRetirementEpoch}
params.json 파일을 만들고
은퇴할 수 있는 가장 빠른 epoch과 마지막 epoch을 찾아봅니다.(은퇴할껀데 마지막이 왜 필요한지는 잘 모르겠지만, 아마 Binance나 1PCT와 같은 거대 풀들은 주기적으로 풀을 올리고 내리고 할 수 있으니 필요할지도 모르겠네요.)
Cold 머신으로 가서 은퇴 원장을 만들기 시작합니다.
cardano-cli stake-pool deregistration-certificate \
--cold-verification-key-file $HOME/cold-keys/node.vkey \
--epoch <retirementEpoch> \
--out-file pool.dereg
에는 풀을 은퇴시키고 싶은 epoch 값을 적어줍니다.
위에서 뽑은 min/max 사이면 되겠죠
block producer로 돌아와서
cardano-cli query utxo \
--address $(cat payment.addr) \
--mainnet > fullUtxo.out
tail -n +3 fullUtxo.out | sort -k3 -nr > balance.out
cat balance.out
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 query utxo \
--address $(cat payment.addr) \
--mainnet > fullUtxo.out
tail -n +3 fullUtxo.out | sort -k3 -nr > balance.out
cat balance.out
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 transaction build-raw \
${tx_in} \
--tx-out $(cat payment.addr)+${total_balance} \
--invalid-hereafter $(( ${currentSlot} + 10000)) \
--fee 0 \
--certificate-file pool.dereg \
--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 2 \
--byron-witness-count 0 \
--protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee
cardano-cli 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
이전에 했듯이 원장을 작성하고,
cold 머신으로 돌아가서 원장을 signing 한 후에
cardano-cli transaction sign \
--tx-body-file tx.raw \
--signing-key-file payment.skey \
--signing-key-file $HOME/cold-keys/node.skey \
--mainnet \
--out-file tx.signed
block producer로 돌아와 제출합니다.
cardano-cli transaction submit \
--tx-file tx.signed \
--mainnet
adapools.org와 같은 사이트에서 은퇴할 예정으로 바뀐것을 볼 수 있습니다. 이건 이미 은퇴된 거긴 하지만.
자 그럼 이제 위에서 요청한 epoch이 지나면
아래와 같이 stake address info에 reward가 들어온것을 볼 수 있습니다.
cardano-cli query stake-address-info --mainnet --address $(cat stake.addr)
[
{
"address": "stake1uyyujy3wmd7qf29c8pflx4m7tm5ttm6c6d854wnsravn49qyv9ppf",
"rewardAccountBalance": 500000000,
"delegation": null
}
]
cardano-cli query utxo --mainnet --address $(cat payment.addr)
TxHash TxIx Amount
--------------------------------------------------------------------------------------
5535b1d2b406362a7d6199bfba041c3a93e2e84ebab8fed058fe5c10bcd0f86d 0 34263240 lovelace
마찬가지로 원장을 작성하는데 withdrawal 로 stake.addr의 주소를 넣어주는점만 다릅니다.
cardano-cli transaction build-raw \
--tx-in 5535b1d2b406362a7d6199bfba041c3a93e2e84ebab8fed058fe5c10bcd0f86d#0 \
--tx-out $(cat payment.addr)+0 \
--withdrawal $(cat stake.addr)+0 \
--invalid-hereafter 0 \
--fee 0 \
--out-file withdraw_rewards.draft
cardano-cli transaction calculate-min-fee \
--tx-body-file withdraw_rewards.draft \
--tx-in-count 1 \
--tx-out-count 1 \
--witness-count 2 \
--byron-witness-count 0 \
--mainnet \
--protocol-params-file params.json
params.json을 만들고
원장을 작성후
cardano-cli transaction build-raw \
--tx-in 5535b1d2b406362a7d6199bfba041c3a93e2e84ebab8fed058fe5c10bcd0f86d#0 \
--tx-out $(cat payment.addr)+534084803 \
--withdrawal $(cat stake.addr)+500000000 \
--invalid-hereafter 31899897 \
--fee 178437 \
--out-file withdraw_rewards.raw
signing을 하고
cardano-cli transaction sign \
--tx-body-file withdraw_rewards.raw \
--signing-key-file ./cold-keys/payment.skey \
--signing-key-file ./cold-keys/stake.skey \
--mainnet \
--out-file withdraw_rewards.signed
제출합니다.
cardano-cli transaction submit \
--tx-file withdraw_rewards.signed \
--mainnet
이제 payment.addr에 500ADA가 돌아온 것을 볼 수 있습니다.
cardano-cli query utxo --mainnet --address $(cat payment.addr)
TxHash TxIx Amount
--------------------------------------------------------------------------------------
5581c9798036d6986e985a6dd666bcfe114d8db12107a39436c22a2ffe4c6330 0 534084803 lovelace