[Cosmos-SDK] Chain Live Upgrade
Upgrade Module
x/upgrade
에서 live-chain에서 새로운 버전으로 업그레이드 하는 모듈(v0.44~)
BeginBlocker
hook에서 state machine이 정해진 pre-defined 블록 높이에 도달하면 블록이 진행되지 않게 함
- governance가 업그레이드를 어떻게 하는지에 관해서 아무것도 결정하지 않음
- upgrade를 안전하게 하는 것이 목적임
Cosmovisor
- governance 모듈의 chain upgrade proposal을 모니터링하며 Cosmos SDK app (terrad 등) 바이너리를 관리하는 프로세스 매니저
- proposal이 승인되면 cosmovisor가 자동으로 바이너리(새 버전)로 기존 바이너리(구 버전)를 바꾸는 역할을 함
설치 방법
// go install을 통한 설치
go install github.com/cosmos/cosmos-sdk/cosmovisor/cmd/cosmovisor@latest
// cosmos SDK 내에 포함된 버전을 통한 다운로드
git clone [email protected]:cosmos/cosmos-sdk
cd cosmos-sdk
git checkout cosmovisor/vx.x.x
make cosmovisor
x/upgrade
에서 live-chain에서 새로운 버전으로 업그레이드 하는 모듈(v0.44~)BeginBlocker
hook에서 state machine이 정해진 pre-defined 블록 높이에 도달하면 블록이 진행되지 않게 함- governance 모듈의 chain upgrade proposal을 모니터링하며 Cosmos SDK app (terrad 등) 바이너리를 관리하는 프로세스 매니저
- proposal이 승인되면 cosmovisor가 자동으로 바이너리(새 버전)로 기존 바이너리(구 버전)를 바꾸는 역할을 함
설치 방법
// go install을 통한 설치
go install github.com/cosmos/cosmos-sdk/cosmovisor/cmd/cosmovisor@latest
// cosmos SDK 내에 포함된 버전을 통한 다운로드
git clone [email protected]:cosmos/cosmos-sdk
cd cosmos-sdk
git checkout cosmovisor/vx.x.x
make cosmovisor
cosmovisor
실행 파일 사용을 위해 적절한 경로 설정도 추가
cp cosmovisor/cosmovisor ~/go/bin/cosmovisor
폴더 레이아웃
다음과 같은 환경 변수가 기본적으로 세팅이 되어야 함
DAEMON_HOME
:cosmovisor/
디렉토리가 genesis binary와 upgrade binary 등을 포함하는 위치 (e.g.$HOME/.terrad
)DAEMON_NAME
: binary 파일 이름 (e.g.terrad
)DAEMON_ALLOW_DOWNLOAD_BINARIES
(optional, default=false
) :true
로 세팅 시 새 바이너리를 자동으로 다운로드 함. security 이유로 validator가 아닌 full node를 대상으로 함DAEMON_RESTART_AFTER_UPGRADE
(optional, default=true
) :true
일 경우 업그레이드 성공 후 기존과 동일한 flag를 가진 채 새로운 버전의 바이너리를 재시작을 함.false
일 경우에는 관리자가 직접 재실행 해야 함DAEMON_POLL_INTERVAL
(optional, default=300 millisecond
) : upgrade plan 파일을 투표하는 간격의 길이.DAEMON_BACKUP_DIR
(optional, deafult=DAEMON_HOME
) : 커스텀 백업 디렉토리
columbus-6
업그레이드를 포함한 폴더 레이아웃
유의 사항
$DAEMON_HOME/cosmovisor
는 application binary만 저장하고 있음cosmovisor
binary는 어떤 곳이든 존재할 수 있음 (e.g./usr/local/bin
)- app은
--home
flag가 설정되어 있다면 계속해서$HOME/.terra
에 데이터를 저장하고 있음 cosmovisor
폴더 내에genesis
와upgrades/<name>
폴더를 직접 설치해야 함
Cosmovisor를 이용한 Upgrade 방법
기본적으로 코드 상에서 Upgrade 관련 함수가 작성 되어있다고 가정 (함수 작성 방법은 추후 포스팅)
방법 1. Auto-Download
- 기본적으로 업그레이드 전에 관련 binary 파일들을 요구함
- 하지만 쉬운 업그레이드를 원하는 사용자는
DAMON_ALLOW_DOWNLOAD_BINARIES
를 이용하여 binary 파일을 자동으로 다운로드하고 설치까지 하는 것을 가능하게 함
- os/architecture와 binary 파일 URL을 맵핑하여 저장하여 사용 가능
- 자세한 방법은 여기
방법 2. Manual Upgrade
Cosmos SDK 기반으로 만들어진 Terra를 통해 설명
- 환경변수 설정
# 예시
export DAEMON_HOME=~/.terra
export DAEMON_NAME=terrad
export DAEMON_RESTART_AFTER_UPGRADE=true
export UPGRADE_NAME=columbus-6
export KEY_NAME=harvey1
export UPGRADE_HEIGHT=20
export PROPOSAL_ID=1
export CHAIN_ID=1
cosmovisor
실행 파일 생성 및 디렉토리 세팅
# cosmovisor 실행 파일 생성 및 실행 경로 지정
cd ~/cosmos-sdk/cosmovisor
make cosmovisor
# cosmovisor 디렉토리 생성
mkdir -p $DAEMON_HOME/cosmovisor/genesis/bin
mkdir -p $DAEMON_HOME/cosmovisor/upgrades/columbus-6/bin
# columbus-5 (구버전) 설정
cd ~/core
git checkout main
make build
cp ~/core/build/terrad $DAEMON_HOME/cosmovisor/genesis/bin
# columbus-6 (신버전) 설정
cd ~/core
git checkout release/v0.6.x
make build
cp ~/core/build/terrad $DAEMON_HOME/cosmovisor/upgrades/columbus-6/bin
- 노드 초기화 및 어카운트 셋팅
#!/bin/sh
ACCOUNT_NAME="harvey1"
TESTNET_NAME="1"
NODE_MONIKER="test"
rm $HOME/.terra/config/genesis.json
rm -r $HOME/.terra/config/gentx/*
terrad unsafe-reset-all
terrad init --chain-id=$TESTNET_NAME $NODE_MONIKER
# voting 시간 기본 값이 172800s이기 때문에 테스트를 위해 시간 조정 필요
cat <<< $(jq '.app_state.gov.voting_params.voting_period = "20s"' $HOME/.terra/config/genesis.json) > $HOME/.terra/config/genesis.json
terrad keys add $ACCOUNT_NAME
terrad add-genesis-account $(terrad keys show $ACCOUNT_NAME -a) 100000000uluna,1000usd
terrad gentx $ACCOUNT_NAME 1000000uluna --chain-id=$TESTNET_NAME
terrad collect-gentxs
cosmovisor
실행
cp ~/cosmos-sdk/cosmovisor/cosmovisor ~/usr/local/bin
cosmovisor start
기본적으로 코드 상에서 Upgrade 관련 함수가 작성 되어있다고 가정 (함수 작성 방법은 추후 포스팅)
DAMON_ALLOW_DOWNLOAD_BINARIES
를 이용하여 binary 파일을 자동으로 다운로드하고 설치까지 하는 것을 가능하게 함Cosmos SDK 기반으로 만들어진 Terra를 통해 설명
# 예시
export DAEMON_HOME=~/.terra
export DAEMON_NAME=terrad
export DAEMON_RESTART_AFTER_UPGRADE=true
export UPGRADE_NAME=columbus-6
export KEY_NAME=harvey1
export UPGRADE_HEIGHT=20
export PROPOSAL_ID=1
export CHAIN_ID=1
cosmovisor
실행 파일 생성 및 디렉토리 세팅# cosmovisor 실행 파일 생성 및 실행 경로 지정
cd ~/cosmos-sdk/cosmovisor
make cosmovisor
# cosmovisor 디렉토리 생성
mkdir -p $DAEMON_HOME/cosmovisor/genesis/bin
mkdir -p $DAEMON_HOME/cosmovisor/upgrades/columbus-6/bin
# columbus-5 (구버전) 설정
cd ~/core
git checkout main
make build
cp ~/core/build/terrad $DAEMON_HOME/cosmovisor/genesis/bin
# columbus-6 (신버전) 설정
cd ~/core
git checkout release/v0.6.x
make build
cp ~/core/build/terrad $DAEMON_HOME/cosmovisor/upgrades/columbus-6/bin
#!/bin/sh
ACCOUNT_NAME="harvey1"
TESTNET_NAME="1"
NODE_MONIKER="test"
rm $HOME/.terra/config/genesis.json
rm -r $HOME/.terra/config/gentx/*
terrad unsafe-reset-all
terrad init --chain-id=$TESTNET_NAME $NODE_MONIKER
# voting 시간 기본 값이 172800s이기 때문에 테스트를 위해 시간 조정 필요
cat <<< $(jq '.app_state.gov.voting_params.voting_period = "20s"' $HOME/.terra/config/genesis.json) > $HOME/.terra/config/genesis.json
terrad keys add $ACCOUNT_NAME
terrad add-genesis-account $(terrad keys show $ACCOUNT_NAME -a) 100000000uluna,1000usd
terrad gentx $ACCOUNT_NAME 1000000uluna --chain-id=$TESTNET_NAME
terrad collect-gentxs
cosmovisor
실행cp ~/cosmos-sdk/cosmovisor/cosmovisor ~/usr/local/bin
cosmovisor start
cosmovisor
실행 시 current/bin의 binary 파일이 genesis/bin의 binary 파일에 의해 생성됨
- proposal 생성 및 투표
upgrade 이름과 proposal 시 이름이 반드시 동일해야 함
# 3 단계에서 설정 voting 시간 내에 투표가 완료되어야 함
terrad tx gov submit-proposal software-upgrade $UPGRADE_NAME --title upgrade --description upgrade --upgrade-height $UPGRADE_HEIGHT --from $KEY_NAME --yes --chain-id $CHAIN_ID
terrad tx gov deposit $PROPOSAL_ID 10000000uluna --from $KEY_NAME --yes --chain-id $CHAIN_ID
terrad tx gov vote 1 yes --from $KEY_NAME --yes --chain-id $CHAIN_ID
# voting 시간이 지나면 upgrade plan 확인 가능
terrad query upgrade plan
- 정해진 height에서 노드가 정지함
- governance에 의해 proposal이 통과되면
cosmovisor
가 upgrades 폴더에 있는 binary 파일로 current 폴더의 binary를 변경함
- 정상적인 업그레이드가 완료되어 v0.45.1 cosmos-sdk를 사용하는 columbus-6로 업그레이드 성공
Reference
Author And Source
이 문제에 관하여([Cosmos-SDK] Chain Live Upgrade), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@harvey/Cosmos-SDK-Chain-Live-Upgrade
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Author And Source
이 문제에 관하여([Cosmos-SDK] Chain Live Upgrade), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@harvey/Cosmos-SDK-Chain-Live-Upgrade저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)