Solana/Validator - 실행 (devnet & testnet)

[Solana Testnet] Validator 실행 시 주요 파일 & 커맨드

코딩굼벵이 2022. 9. 19. 15:14
728x90

Solana Validator를 돌리면서 구성했던 파일들을 백업차원으로 적어두려 한다.
현재는 안 돌아가고 있지만 그 때는 돌아갔으니, 공식 공지를 숙지하고 디스코드 커뮤니티에서 질문을 통해 trouble shooting 하면 다시 돌릴 수 있을 것이다.

 

validator 실행 방법

아래 실행 파일들과 시스템 파일들을 작성하고 시스템 파일을 구동하면 백그라운드에서 계속 돌아간다.

 

시스템 구동 command

// 서버 재부팅 시 자동 시작
sudo systemctl enable --now systuner.service && sudo systemctl enable --now validator.service \
  && sudo systemctl enable --now watchtower.service
  
// 시스템 데몬 종료
sudo systemctl stop validator.service

// 시스템 정상 작동 확인
systemctl status validator.service

 

validator 모니터링 관련 command

// 밸리데이터 동작여부 확인
solana-validator --ledger ~/ledger monitor

// 슬롯 모니터링
solana catchup ~/validator-keypair.json --our-localhost

// 밸리데이터 현 상태 확인
solana validators | grep <validator address>

// 투표활동 확인
solana vote-account ~/vote-account-keypair.json

// 현재 슬롯 확인
curl http://localhost:8899 -X POST -H "Content-Type: application/json" -d '
  {"jsonrpc":"2.0","id":1, "method":"getSlot"}
'
// 에러, 리더슬롯배정 확인
grep --ignore-case --extended-regexp -w 'ERROR' ~/log/validator.log
grep --ignore-case --extended-regexp -w 'My next leader' ~/log/validator.log

// 스테이킹 계정 상태 조회
solana stake-account ~/validator-stake-keypair.json

 

/home/sol 실행 파일

  • start-validator.sh
#!/bin/bash
exec solana-validator \
    --entrypoint entrypoint.testnet.solana.com:8001 \
    --entrypoint entrypoint2.testnet.solana.com:8001 \
    --entrypoint entrypoint3.testnet.solana.com:8001 \
    --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \
    --known-validator dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs \
    --known-validator Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN \
    --known-validator eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ \
    --known-validator 9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv \
    --known-validator eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ \
    --known-validator 82k4RGZAJxtXvW3hzgmHB2q4oDHzgwMR2cGXup324gsJ \
    --known-validator Bszp6hDL19ymPZ8efp9venQYb4ae2rRmEtVp4aG6k8nx \
    --known-validator 376e8QLx9qSkjFn7mK2kp3wBwvziKuMqiB3iAbK5Payx \
    --known-validator 8Apz17FY7vts5PUEP28apzqQBVgg6McbetFJqb45ew8F \
    --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \
    --dynamic-port-range 8000-8020 \
    --rpc-port 8899 \
    --only-known-rpc \
    --wal-recovery-mode skip_any_corrupted_record \
    --identity ~/validator-keypair.json \
    --vote-account ~/vote-account-keypair.json \
    --log ~/log/validator.log \
    --accounts /mnt/ramdisk/solana-accounts \
    --ledger ~/ledger \
    --limit-ledger-size 50000000 \
    --private-rpc \
    --no-port-check \
    --incremental-snapshots \
    --incremental-snapshot-interval-slots 200 \
    --minimal-snapshot-download-speed 1 \
    --maximum-local-snapshot-age 3000 \
    --full-rpc-api

 

* known-validator는 신뢰할 수 있는 밸리데이터 목록. 테스트넷 재부팅할 때 추가한 밸리데이터들은 지워야할 수 있다.

 

  • watchtower.sh
    validator 정상 작동 여부를 슬랙으로 5분마다 보내는 실행 파일.
    validator가 꺼져있으면 꺼져있다고 보내고, 켜져있으면 watchtower가 에러를 슬랙으로 보내게끔 구성했다.
#!/bin/bash
while [ true ]; do
        if [ ! `ps -ef | grep solana-watchtower | grep -v grep | awk '{print $2}'` ]; then
                # watchtower 꺼져있고 validator 켜져있으면 watchtower 켜고 슬랙 보내기
                if [ `ps -ef | grep solana-validator | grep -v grep | awk '{print $2}'` ]; then
                        nohup solana-watchtower \
                                --validator-identity E6ALR99bKvV45JiwKJtgCyDe7EZdAfYPhWaSd3Lw4d2c \
                                >> /home/sol/watchtower.log &
                        message="watchtower가 켜졌습니다."
                        curl -X POST --data-urlencode "payload={\"channel\": \"#testnet-validator\", \"username\": \"Watchtower\", \"text\": \"${message}\", \"icon_emoji\": \":tokyo_tower:\"}" https://hooks.slack.com/services/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
                # watchtower 꺼져있고 validator 꺼져있으면 밸리데이터 꺼져있다고 5분마다 슬랙 보내기
                else
                    message="validator가 꺼져있습니다. validator를 켜주세요."
                        curl -X POST --data-urlencode "payload={\"channel\": \"#testnet-validator\", \"username\": \"Validator_is_Off\", \"text\": \"${message}\", \"icon_emoji\": \":internet-problems:\"}" https://hooks.slack.com/services/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
                    sleep 300
                fi
        elif [ `ps -ef | grep solana-watchtower | grep -v grep | awk '{print $2}'` ]; then
                # watchtower 켜져있고 validator 꺼져있으면 watchtower 끄고 watchtower 껐다고 슬랙 보내기
                if [ ! `ps -ef | grep solana-validator | grep -v grep | awk '{print $2}'` ]; then
                        kill `ps -ef | grep solana-watchtower | grep -v grep | awk '{print $2}'`
                        message="watchtower가 꺼졌습니다."
                        curl -X POST --data-urlencode "payload={\"channel\": \"#testnet-validator\", \"username\": \"Watchtower\", \"text\": \"${message}\", \"icon_emoji\": \":tokyo_tower:\"}" https://hooks.slack.com/services/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
                fi
        fi
done

 

  • airdrop.sh
    테스트넷이라 필요할 때마다 에어드랍 100번을 돌리는 코드를 만들어두었다. 여타 테스트넷이 그렇듯이 에어드랍량 제한이 있어 100번을 한번에 전부 받아오진 못하고 중간부터 실패 처리 되더라.

#!/bin/bash
for i in $(seq 1 100)
do
        solana airdrop 1 -k ~/validator-stake-keypair.json
        sleep 30
done

 

/etc/systemd/system 시스템 파일

  • systuner.service
[Unit]
Description=Solana System Tuner
After=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=1
LogRateLimitIntervalSec=0
ExecStart=/home/solana/.local/share/solana/install/active_release/bin/solana-sys-tuner --user solana

[Install]
WantedBy=multi-user.target

 

  • validator.service
[Unit]
Description=Solana Validator
After=network.target
Wants=systuner.service
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=on-failure
RestartSec=1
LimitNOFILE=1000000
LogRateLimitIntervalSec=0
User=sol
Environment=PATH=/bin:/usr/bin:/home/solana/.local/share/solana/install/active_release/bin
Environment=SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea
ExecStart=/home/solana/start-validator.sh

[Install]
WantedBy=multi-user.target

 

  • watchtower.service
[Unit]
Description=Solana Watchtower

[Service]
Type=simple
User=sol
Environment=PATH=/bin:/usr/bin:/home/solana/.local/share/solana/install/active_release/bin
Environment=SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea
Environment=SLACK_WEBHOOK=https://hooks.slack.com/services/<슬랙 웹훅>
ExecStart=/home/solana/watchtower.sh

[Install]
WantedBy=multi-user.target

 

/etc/logrotate.d 시스템 파일

  • solana
    로그 파일이 하루에 하나씩 생기고, 일주일 지난 파일은 없어지게 하는 코드다.
/home/solana/log/validator.log {
  su sol sol
  daily
  rotate 7
  missingok
  postrotate
    systemctl kill -s USR1 validator.service
  endscript
}

 

적용 command

sudo systemctl restart logrotate