Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

Cardano/staking pool 구축

ADA Staking Pool 구축 #4

방피터 2022. 2. 28. 16:53

이전글

2022.02.28 - [Cardano/staking pool 구축] - ADA Staking Pool 구축 #3

 

ADA Staking Pool 구축 #3

이전글 2021.09.17 - [스테이킹] - ADA Staking Pool 구축 #2 계속 이어 staking pool을 구축하도록 하겠습니다. 다시 한번 말씀드리지만 cardano.io에 있는 공식 developer 문서는 따라하지 마시기 바랍니다. (21..

engschool.tistory.com

이번 글을 마지막으로 어느 정도 스테이킹 풀 구축이 끝날 것 같습니다.

 

이제부터의 나머지 과정은 블록을 100% 다운로드 받은 후 수행하시기 바랍니다.


블록생성 노드 키 만들기

블록 생성 노드는 3가지 종류의 키가 필요합니다.

 

이중에서 KES Key pair라는 것부터 생성해봅시다. KES 해커로부터 키를 손상시키는 것으로부터 스테이크 풀을 보호할 수 있는 키라고 설명하고 있습니다. 뭐 이렇게만 알고 넘어갑시다. 모든 것을 알고 지나갈 수는 없는 노릇이니까요. 확실한 것은 90일마다 한번씩 이 키를 교체해줘야 한다는 것입니다. 운영시 잊지 말아야겠네요.

 

아래를 실행해 KES 키를 생성합니다. 이 키는 hot key로 블록 생성 노드에서 생성하시면 됩니다.

 

<블록 생성 노드에서 실행>

cd $NODE_HOME
cardano-cli node key-gen-KES \
    --verification-key-file kes.vkey \
    --signing-key-file kes.skey

 

 

이제 cold-key들을 만들어 봅시다. cold-key는 저번 글에서 말씀드린데로 air-gapped machine, 그러니까 인터넷이 연결안되는 컴퓨터에서 생성하셔야 해요. 우선 폴더를 만들고

 

<air-gapped machine에서 수행>

mkdir $HOME/cold-keys
pushd $HOME/cold-keys

 

cold-key들을 생성합니다.

 

<air-gapped machine에서 수행>

cardano-cli node key-gen \
    --cold-verification-key-file node.vkey \
    --cold-signing-key-file $HOME/cold-keys/node.skey \
    --operational-certificate-issue-counter node.counter

 

*** 이 키들은 여러 개의 복사본을 만들어 안전하게 보관하시기 바랍니다.

 

genesis 파일로부터 KES 주기 당 슬롯 갯수를 가져옵니다.

 

<블록 생성 노드에서 수행>

pushd +1
slotsPerKESPeriod=$(cat $NODE_HOME/${NODE_CONFIG}-shelley-genesis.json | jq -r '.slotsPerKESPeriod')
echo slotsPerKESPeriod: ${slotsPerKESPeriod}

slotNo를 알아냅니다.

slotNo=$(cardano-cli query tip --mainnet | jq -r '.slot')
echo slotNo: ${slotNo}

kesPeriod를 알아냅니다.

kesPeriod=$((${slotNo} / ${slotsPerKESPeriod}))
echo kesPeriod: ${kesPeriod}
startKesPeriod=${kesPeriod}
echo startKesPeriod: ${startKesPeriod}

 

위 계산에서 알아낸 정보들로 풀 인증서를 생성할 수 있습니다. 이제 계속 진행하기 전에 kes.vkey를 air-gapped machine으로 복사합니다.

 

<air gapped machine에서 수행>

cardano-cli node issue-op-cert \
    --kes-verification-key-file kes.vkey \
    --cold-signing-key-file $HOME/cold-keys/node.skey \
    --operational-certificate-issue-counter $HOME/cold-keys/node.counter \
    --kes-period <startKesPeriod> \
    --out-file node.cert

생성된 node.cert 파일을 블록 생성 노드로 복사합니다.

 

블록 생성 노드에서 VRF key pair를 생성합니다. (VRF: Verifiable Random Function)

 

<블록 생성 노드에서 수행>

cardano-cli node key-gen-VRF \
    --verification-key-file vrf.vkey \
    --signing-key-file vrf.skey

readonly로 파일 권한을 변경합니다.

chmod 400 vrf.skey

실행중인 노드를 잠시 멈추고

sudo systemctl stop cardano-node

실행 스크립트에 KES, VRF, CERT 경로를 추가합니다.

cat > $NODE_HOME/startBlockProducingNode.sh << EOF 
DIRECTORY=$NODE_HOME
PORT=6000
HOSTADDR=0.0.0.0
TOPOLOGY=\${DIRECTORY}/${NODE_CONFIG}-topology.json
DB_PATH=\${DIRECTORY}/db
SOCKET_PATH=\${DIRECTORY}/db/socket
CONFIG=\${DIRECTORY}/${NODE_CONFIG}-config.json
KES=\${DIRECTORY}/kes.skey
VRF=\${DIRECTORY}/vrf.skey
CERT=\${DIRECTORY}/node.cert
cardano-node run --topology \${TOPOLOGY} --database-path \${DB_PATH} --socket-path \${SOCKET_PATH} --host-addr \${HOSTADDR} --port \${PORT} --config \${CONFIG} --shelley-kes-key \${KES} --shelley-vrf-key \${VRF} --shelley-operational-certificate \${CERT}
EOF

 

노드를 재시작하고 .gLiveView로 모니터링합니다.

sudo systemctl start cardano-node

# Monitor with gLiveView
./gLiveView.sh

Payment 키와 Stake 키 만들기

 

첫번째로 protocol-parameter를 얻어옵니다. 카르다노 노드가 완벽하게 동작할 때 수행해야 합니다.

 

<블록 생성노드에서 수행>

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

 

이제 payment와 stake key pair르 생성해야 하는데 두가지 방법이 있습니다. 하나는 지금까지 해온 CLI 방식이고 다른 하나는 다이달로스나 요로이 지갑을 통해 생성하는 방식입니다. 해온 방식(CLI)대로 합시다.

 

이 키들을 이용해 에이다를 지불할 수 있으니 보안에 각별히 유의하시기 바랍니다.

 

 

<air gapped offline machine에서 수행>

 

payment key pair를 생성합니다.

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

 

stake key pair를 생성합니다.

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

 

생성된 키를 이용해 payment address를 만듭니다.

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

 

payment.addr 파일을 블록 생성 노드로 복사합니다.

 

이제 payment address로 에이다를 보내야 합니다. 처음에 말씀드렸다시피 스테이크 키 보증금이 2 에이다, 스테이크 풀 보증금이 500 에이다입니다. 그리고 거기에 더해 자신이 원하는 pledge 금액이 필요합니다. pledge를 0으로 할지라도 전송 수수료 등이 포함되므로 505에이다는 있어야 합니다. 아래를 실행해 자신의 주소를 확인할 수 있습니다.

cat payment.addr

 

보내고 나서 계좌를 확인해 봅시다. https://explorer.cardano.org/en 와 같은 사이트에서도 확인하실 수 있습니다.

 

<블록 생성 노드에서 수행>

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

아래와 같이 lovelace 단위로 표현되는 것을 확인하실 수 있습니다. 1 ADA = 1,000,000 lovelace입니다.


스테이크 주소 등록

 

먼저 stake.vkey를 이용하여 stake.cert 인증서를 생성합니다.

 

<air-gapped offline machine에서 수행>

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

 

생성된 stake.cert를 블록 생성 노드로 복사합니다.

그리고 invalid-hereafter 파라미터에 활용할 현재 slop 번호를 찾아야 합니다.

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

 

그리고 나서는 UTXO를 검색합니다. 아래는 복잡하게 생겼지만 사실은 단순히 UTXO가 여러개의 라인일 수 있어 편하게 계산하기 위함입니다.

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}

 

param.json으로부터 stakeAddresssDeposit이 얼마인지 확인해 봅시다. 편하게 cat param.json으로 확인하셔도 됩니다.

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

 

"stakeAddressDeposit": 2000000, 2,000,000 lovalace 즉 2 에이다 입니다.

 

build-raw를 작성합니다. 아까 계산해 두었던 currentSlot에 더하기 10,000을 해주어  invalid-hereafter 파라미터에 입력해줍니다. 이 의미는 현재 슬롯에서 10,000 슬롯이 지나면 invalid 된다는 의미입니다. 

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

 

위에서 작성한 build-raw를 이용해 스테이크 주소 보증금 납부를 위한 최소 수수료를 계산합니다.

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

 

보증금과 수수료 전송 후 변경될 output(잔고)을 계산합니다.

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

 

이제 실제 납부하기 위한 build-raw를 작성하여 생성된 tx.raw를 air-gapped offline machine으로 복사해 둡니다.

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

 

이제 해당 거래를 payment 키와 stake키로 서명합니다. 새로 생성된 tx.signed도 air-gapped offline machine으로 복사해 둡니다.

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

 

해당 거래를 제출하면 거래가 이루어집니다. 내 계좌에서 stake 보증금과 수수료가 출금된 것을 확인해보시기 바랍니다.

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

스테이크 풀 등록

스테이크 풀을 등록하려면 먼저 pool의 메타 데이터 json 파일을 만들고 이를 업데이트 해야 합니다.

cat > poolMetaData.json << EOF
{
"name": "MyPoolName",
"description": "My pool description",
"ticker": "MPN",
"homepage": "https://myadapoolnamerocks.com"
}
EOF

name: 내 스테이크 풀 이름입니다.

desciprtion: 내 스테이크 풀 설명입니다. 255자를 넘을 수 없습니다.

ticker: 내 스테이크 풀의 약어입니다. 3-5글자여야 하고 알파뱃과 0~9까지의 숫자만 허용됩니다.

homepage: 내 스테이크 풀에 대한 설명이나 홍보 자료가 있는 홈페이지 주소입니다. 본격적으로 하시려면 예쁘게 만드셔야겠죠?

 

파일을 생성했으면 해쉬를 계산해야 합니다. 생성된 poolMetaDataHash.txt를 air-gapped offline machine으로 복사해 둡니다.

cardano-cli stake-pool metadata-hash --pool-metadata-file poolMetaData.json > poolMetaDataHash.txt

 

poolMetaData.json은 웹에 업로드되어 있어야 합니다. 자신의 웹사이트를 사용하시거나 없다면 github page 같은 곳을 활용하세요. 다운로드 된 json 파일의 해시와 위에서 만들어준 해시를 비교하여 일치해야 합니다. 즉, 똑같아야 합니다.

저는 nextjs와 aws amplify를 이용하여 웹사이트를 구축 후 json파일을 업로드 했습니다. 구축하는 방법은 아래 글을 참고해 주세요. 

2021.09.16 - [Next.js] - Next.JS + AWS Amplify 맛만 보자 ㅎㅎ

 

Next.JS + AWS Amplify 맛만 보자 ㅎㅎ

Next.JS 부르는 React Framework이 있습니다. React Framework이니까 프론트 엔드... 그런데 서버 렌더링을 지원한다고? 음 ㅋㅋㅋ 뭔 소린지 모르겠습니다. 서버 렌더링 하려면 그냥 호스팅 가지고는 안되

etherbread.tistory.com

위의 과정에서 nextjs public folder에 poolMetaData.json 복사해 넣어주시고 배포하시면 간단하게 됩니다.

 

 ** github page를 이용해 poolMetaData.json파일을 업로드 하는 방법은 이 글에는 따로 언급하지 않겠습니다. 원하시면 댓글을 남겨주세요. 그러면 별도로 글을 올리도록 하겠습니다.

 

 

이제 params.json 파일로부터 minPoolCost를 추출합니다. minPoolCost는 1에포크(5일)당 풀을 운영하는데 드는 최소 금액입니다. 예를 들면 내 인건비 컴퓨터 사용료, 인터넷 사용도 등이 포함되어야 하겠지요. 이 금액이 높으면 위임한 사람들의 배당이 줄어들기 때문에 풀이 인기가 없겠죠. 그래서 보통 최소로 설정해 둡니다.

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

현재 minPoolCost는 340 ADA입니다.

 

이제 스테이크 풀 인증서를 만들어봅시다. 아래에서 몇가지 신경쓸 점이 있습니다. 첫번째는 pledge 금액입니다. 이는 스테이크 풀이 항상 가지고 있을 금액을 이야기합니다. 이 금액은 클수록 좋으며 보상에 영향을 미칩니다. 두 번째는 pool-cost는 거의 모든 풀이 최소 금액(340 ADA)을 사용합니다. lovelace단위로 적어주시면 됩니다. 세번째는 pool-margin입니다. 1이 100%이고 0.01이 1%입니다. 풀 마진을 크게 하면 위임한 사람들에게 돌아갈 보상이 줄어들어 인기가 없어집니다. 그래서 0%으로 설정해 둔 풀들이 많습니다. 나머지 릴레이 ip 주소, poolMetaData.json URL 등은 정확하게 입력하시기 바랍니다.

 

<air-gapped offline machine에서 수행>

cardano-cli stake-pool registration-certificate \
    --cold-verification-key-file $HOME/cold-keys/node.vkey \
    --vrf-verification-key-file vrf.vkey \
    --pool-pledge <원하는 pledge금액> \
    --pool-cost 340000000 \
    --pool-margin 0.00 \
    --pool-reward-account-verification-key-file stake.vkey \
    --pool-owner-stake-verification-key-file stake.vkey \
    --mainnet \
    --pool-relay-ipv4 <릴레이 IP 주소>\
    --pool-relay-port 6000 \
    --metadata-url <poolMetaData.json가 업로드되어 있는 URL> \
    --metadata-hash $(cat poolMetaDataHash.txt) \
    --out-file pool.cert

 

스테이크 풀을 더 안정적으로 운영하기 위해 릴레이 노드를 2개 이상 두시려면 위의 옵션에서 릴레이 노드를 추가하시기 바랍니다.

    --pool-relay-port 6000 \
    --pool-relay-ipv4 <첫번째 릴레이 노드 ip address> \
    --pool-relay-port 6000 \
    --pool-relay-ipv4 <두번째 릴레이 노드 ip address> \

 

생성된 pool.cert 인증서를 블록 생성 노드에 복사합니다.

 

이제 delegation certificate를 만듭니다.

cardano-cli stake-address delegation-certificate \
    --stake-verification-key-file stake.vkey \
    --cold-verification-key-file $HOME/cold-keys/node.vkey \
    --out-file deleg.cert

생성된 deleg.cert 인증서를 블록 생성 노드에 복사합니다.

 

다음으로 이 인증서들을 등록하고 보증금을 납부하기 위한 과정을 진행합니다. invalid-hereafter에 사용할 slot 번호를 얻어옵니다.

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

 

UTXO Query를 통해 현재 잔액 등을 얻어옵니다.

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}

스테이크 풀 보증금이 얼마인지 params.json으로부터 읽어옵니다. 여러번 말씀드렸다시피 500에이다 입니다.

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

"stakePoolDeposit": 500000000,

 

수수료 계산을 위한 build-raw를 작성하고

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

생성된 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 3 \
    --byron-witness-count 0 \
    --protocol-params-file params.json | awk '{ print $1 }')
echo fee: $fee

 

보증금과 수수료가 납부된 이후의 계좌 잔고를 계산합니다.

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

 

새로 build-raw를 작성하고 생성된 tx.raw를 air-gapped offline machine으로 복사합니다. (영수증 같은 개념인가 봅니다.)

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

 

거래에 서명합니다.

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

 

거래를 제출하면 실제로 거래가 일어나서 내 계좌로부터 보증금 500 ADA와 수수료가 빠져나갑니다. 

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

 

query utxo 명령을 통해 내 계좌를 확인해 볼 수 있습니다.

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

 

이제 스테이크 풀이 카르다노 네트워크에 등록되었습니다.


스테이크 풀 동작 확인

보통스테이크 풀이 잘 동작하는지 여부는 https://pooltool.io/ 에서 자신의 TICKER 이름으로 검색해보는 것으로 쉽게 확인하실 수 있습니다.  아니면 아래와 같이 CLI로 Stake pool id를 얻어낸 후 query하는 방법으로 확인도 가능합니다.

 

<air-gapped offline machine에서 수행>

cardano-cli stake-pool id --cold-verification-key-file $HOME/cold-keys/node.vkey --output-format hex > stakepoolid.txt
cat stakepoolid.txt

<블록 생성 노드에서 수행>

cardano-cli query stake-snapshot --stake-pool-id $(cat stakepoolid.txt) --mainnet

non-empty string이 리턴되면 잘 등록되었다는 의미라도 되어 있으나 제가 수행했을 때는 메모리 부족으로 에러가 발생하였습니다. 저만 그런가요? 암튼 pooltool.io에서 확인이 되어 위 방법은 더 이상 시도해보지 않았습니다.


Topology file 설정

 

릴레이 노드의 topology 파일에 다른 신뢰할 수 있는 릴레이 노드들을 수동으로 추가해 주셔야 합니다. 하지만 수동으로 일일이 살았다 죽었다 하는 노드를 수동으로 추가하는 일은 쉽지 않습니다. 그래서 누군가 만들어놓은 topologyUpdater라는 스크립트를 사용하는 것을 추천합니다. 

 

이 과정은 릴레이 노드에 접속하여 수행합니다.

 

아래를 수행하여 topologyUpdater.sh를 생성합니다. 이 파일은 내 릴레이 정보를 topology fetch 리스트에 배포합니다.

cat > $NODE_HOME/topologyUpdater.sh << EOF
#!/bin/bash
# shellcheck disable=SC2086,SC2034
 
USERNAME=$(whoami)
CNODE_PORT=6000 # must match your relay node port as set in the startup command
CNODE_HOSTNAME="릴레이 노드 IP를 입력해주세요."
CNODE_BIN="/usr/local/bin"
CNODE_HOME=$NODE_HOME
CNODE_LOG_DIR="\${CNODE_HOME}/logs"
GENESIS_JSON="\${CNODE_HOME}/${NODE_CONFIG}-shelley-genesis.json"
NETWORKID=\$(jq -r .networkId \$GENESIS_JSON)
CNODE_VALENCY=1   # optional for multi-IP hostnames
NWMAGIC=\$(jq -r .networkMagic < \$GENESIS_JSON)
[[ "\${NETWORKID}" = "Mainnet" ]] && HASH_IDENTIFIER="--mainnet" || HASH_IDENTIFIER="--testnet-magic \${NWMAGIC}"
[[ "\${NWMAGIC}" = "764824073" ]] && NETWORK_IDENTIFIER="--mainnet" || NETWORK_IDENTIFIER="--testnet-magic \${NWMAGIC}"
 
export PATH="\${CNODE_BIN}:\${PATH}"
export CARDANO_NODE_SOCKET_PATH="\${CNODE_HOME}/db/socket"
 
blockNo=\$(/usr/local/bin/cardano-cli query tip \${NETWORK_IDENTIFIER} | jq -r .block )
 
# Note:
# if you run your node in IPv4/IPv6 dual stack network configuration and want announced the
# IPv4 address only please add the -4 parameter to the curl command below  (curl -4 -s ...)
if [ "\${CNODE_HOSTNAME}" != "CHANGE ME" ]; then
  T_HOSTNAME="&hostname=\${CNODE_HOSTNAME}"
else
  T_HOSTNAME=''
fi

if [ ! -d \${CNODE_LOG_DIR} ]; then
  mkdir -p \${CNODE_LOG_DIR};
fi
 
curl -s "https://api.clio.one/htopology/v1/?port=\${CNODE_PORT}&blockNo=\${blockNo}&valency=\${CNODE_VALENCY}&magic=\${NWMAGIC}\${T_HOSTNAME}" | tee -a \$CNODE_LOG_DIR/topologyUpdater_lastresult.json
EOF

 

 

권한을 주고 토폴로지 업데이터를 실행합니다.

cd $NODE_HOME
chmod +x topologyUpdater.sh
./topologyUpdater.sh

 

토폴로지 업데이터가 잘 수행되면 아래와 같은 메세지가 출력됩니다.

{ "resultcode": "201", "datetime":"2020-07-28 01:23:45", "clientIp": "1.2.3.4", "iptype": 4, "msg": "nice to meet you" }

 

일정 시간마다 반복하기 위해서 크론탭에 등록합니다. 33 * * * * 은 매 시간 33분마다 실행하라는 소리입니다. 1시 33분, 2시 33분 이런식으로 실행이 반복됩니다.

cat > $NODE_HOME/crontab-fragment.txt << EOF
33 * * * * ${NODE_HOME}/topologyUpdater.sh
EOF
crontab -l | cat - ${NODE_HOME}/crontab-fragment.txt > ${NODE_HOME}/crontab.txt && crontab ${NODE_HOME}/crontab.txt
rm ${NODE_HOME}/crontab-fragment.txt

 

4시간 후에 릴레이 노드가 topology fetch list에 등록됩니다.

 

다음으로는 릴레이 노드의 mainnet-topology.json 파일을 업데이트하기 위한 relay-topology_pull.sh를 작성합니다.

cat > $NODE_HOME/relay-topology_pull.sh << EOF
#!/bin/bash
BLOCKPRODUCING_IP=자신의 블록 생성 노드 IP 주소
BLOCKPRODUCING_PORT=자신의 블록 생성 노드 포트번호
curl -s -o $NODE_HOME/${NODE_CONFIG}-topology.json "https://api.clio.one/htopology/v1/fetch/?max=20&customPeers=\${BLOCKPRODUCING_IP}:\${BLOCKPRODUCING_PORT}:1|relays-new.cardano-mainnet.iohk.io:3001:2"
EOF

 

실행권한을 주고 실행합니다. 실행을 완료하면 mainnet-topology.json이 업데이트 된 것을 확인할 수 있습니다.

 

chmod +x relay-topology_pull.sh
./relay-topology_pull.sh

 

업데이트 된 topology를 적용하기 위해 릴레이 노드를 재시작합니다.

sudo systemctl restart cardano-node

 

정상적으로 동작한다면 gLiveView에서 Processed TX와 mempool Tx/Bytes가 증가하는 것을 보실 수 있습니다. Peer들도 잘 등록되어 있는지 확인하시면 됩니다.

여기까지 완료하셨다면 pool.vet에 방문하신 후 자신의 TICKER를 입력하셔서 스테이크 풀의 상태를 확인해보시기 바랍니다. topology updater가 정상적으로 동작하는지도 확인하실 수 있습니다.

 

위는 제가 만든 테스트하며 제작해본 SCCP 스테이크 풀입니다. 다행이도 정상적으로 동작하고 있군요.

 

 

휴... 겨우 끝이 났습니다. 자 이제 자신의 풀에 요로이나 다이달로스 지갑으로 위임을 테스트 해보시기 바랍니다.

*** 다이달로스 지갑은 스테이크 풀 업데이트가 조금 늦는 것 같습니다. 참고하시기 바랍니다.

 

이제는 본격적으로 운영을 해야 하겠죠? 홍보도 하고 90일마다 KES 키도 바꿔주고, 하드웨어 모니터링하면서 메모리는 부족하지 않은지 디스크 용량은 부족하지 않은지 여러 가지 해야 할 일들이 많습니다. 이런 운영에 관한 내용은 저도 운영해나가면서 추가 글로 계속하도록 하겠습니다.  현재 운영하고 있지 않습니다.

 

안녕~!

반응형

'Cardano > staking pool 구축' 카테고리의 다른 글

ADA Staking Pool 운영에 대해...  (0) 2022.02.28
ADA Staking Pool 구축 #3  (0) 2022.02.28
ADA Staking Pool 구축 #2  (0) 2022.02.28
ADA Staking Pool 구축 #1  (0) 2022.02.28