Pool을 은퇴시키고 출금하는 방법

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

풀을 은퇴하고 500개의 예탁된 에이다를 받으려고 원장을 작성하는 과정에서 주의점

  1. tx-out = withdrawal 이어야 합니다. 계산이 틀리면 안됩니다. 아래의 계산식으로 보면 되겠습니다.

tx- out = (payment.addr의 잔액) + ((인출하려는 수량)+(payment.addr의 잔액)-fee)
withdrawal = (stake.addr의 잔액) + (500ADA)

result : (tx-out) - (withdrawal) = 0

  1. invalid-hereafter는 계산된 슬롯보다 더 높은 숫자여야 합니다. 절대값도 있는거같은데, 그보단
    아래의 커맨드로 슬롯값을 구하고 이보다 높은 값으로 설정해주면 됩니다.

currentSlot=$(cardano-cli query tip --mainnet | jq -r ‘.slot’)
echo Current Slot: $currentSlot