Cardano stake pool 등록 - [1/2]

이제부터는 신중하게 작업해야 합니다.

작업에 실수가 있을경우 ADA를 손실할 수 있습니다.

이전 POSTING에서 했던 일들을 절대로 재수행하지 마십시오.

Payment, Stake key 생성

block vm으로 들어갑니다.

cardano-cli query protocol-parameters \
   --mainnet \
   --mary-era \
   --out-file params.json

params.json 파일을 생성 합니다.

이제 다시 cold vm으로 돌아갑니다.

cd $NODE_HOME
cardano-cli address key-gen \
   --verification-key-file payment.vkey \
   --signing-key-file payment.skey

payment의 vkey, skey를 생성합니다.

cardano-cli stake-address key-gen \
   --verification-key-file stake.vkey \
   --signing-key-file stake.skey

stake의 vkey, skey를 생성합니다.

cardano-cli stake-address build \
   --stake-verification-key-file stake.vkey \
   --out-file stake.addr \
   --mainnet

stake.addr을 생성합니다. stake의 주소 파일 입니다.

cardano-cli address build \
   --payment-verification-key-file payment.vkey \
   --stake-verification-key-file stake.vkey \
   --out-file payment.addr \
   --mainnet

payment.addr을 생성합니다. 지갑 주소 파일 입니다.

payment.addr 파일을 block vm으로 복사합니다. payment.addr에 ada를 전송할 수 있게 되는 매우 중요한 주소입니다.

이제 block vm으로 돌아와서

cardano-cli query utxo \
   --address $(cat payment.addr) \
   --mary-era \
   --mainnet

cardano에 내 payment.addr에 ada가 얼마나 있는지 확인해봅니다.

아직 하나도 보내지 않았기 때문에 당연히 아무것도 없습니다.

                          TxHash                                 TxIx       Amount
--------------------------------------------------------------------------------------

이제 4 ADA를 이 주소로 전송합니다. ada 전송방법은 이전 post에서 보실수도 있지만

거래소에서 구매한 이후에 거래소에서 전송하시는 방법이 제일 간편합니다.

전송한 이후 다시

cardano-cli query utxo \
   --address $(cat payment.addr) \
   --mary-era \
   --mainnet
                          TxHash                                 TxIx       Amount
--------------------------------------------------------------------------------------
873e8ec3b5b715183c0654f5438fc77c4cdcb67f0c7e19a1c1fe7966bc0fac5a     0        4000000 lovelace

4 ADA가 온것을 볼 수 있습니다.

1 ADA = 1000000 lovelace 입니다.

stake address 등록

cold vm으로 돌아가서

cardano-cli stake-address registration-certificate \
   --stake-verification-key-file stake.vkey \
   --out-file stake.cert

stake.cert 파일을 생성합니다.

stake.cert 파일을 block vm으로 복사해줍니다.

block vm으로 돌아와서

currentSlot=$(cardano-cli query tip --mainnet | jq -r '.slotNo')
echo Current Slot: $currentSlot

currentSlot 환경변수를 설정하고

cardano-cli query utxo \
   --address $(cat payment.addr) \
   --mary-era \
   --mainnet > fullUtxo.out

현재 지갑의 내용을 file로 만듭니다.

cat fullUtxo.out

출력해보면

아래의 내용이 파일에 저장되었음을 알 수 있습니다.

                          TxHash                                 TxIx       Amount
--------------------------------------------------------------------------------------
873e8ec3b5b715183c0654f5438fc77c4cdcb67f0c7e19a1c1fe7966bc0fac5a     0        4000000 lovelace
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}

각종 변수들을 setting 해주는 script 입니다. 이전 post의 원장 작성에서 필요한 값들을 미리 변수로 만드는 과정입니다.

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

keyDeposit값 2000000이 나옵니다.(2 ADA) 등록하기 위해 사용될 ADA 입니다.

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

stake.cert를 등록하기 위한 원장 작성입니다. 이전 post의 원장작성과 비교해보시면 어떤 내용인지 이해가 쉽습니다.

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

fee값을 알아냅니다.

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

남게될 잔고값도 setting 합니다.

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

raw 원장 파일을 만들어 봅니다.

이제 tx.raw 파일을 cold vm에 복사해줍니다.

cold vm으로 돌아와서

cardano-cli transaction sign \
   --tx-body-file tx.raw \
   --signing-key-file payment.skey \
   --signing-key-file stake.skey \
   --mainnet \
   --out-file tx.signed

원장을 signing 해줍니다.

sigining된 원장을 다시 block vm으로 복사해줍니다.

여기서부터는 ADA가 소모됩니다.

원장을 제출하는 순간 2 ADA가 비용으로 지불되며 돌이킬 수 없습니다.

block vm으로 돌아와서

cardano-cli transaction submit \
   --tx-file tx.signed \
   --mainnet

원장을 제출합니다.