[Code States]Stake Wars: Episode III. Challenge 001~005

Code States
16 min readAug 9, 2022

--

안녕하세요.
코드스테이츠 BEB Node R&D입니다.

저희는 NEAR Validator가 되기 위한 NEAR Stake Wars Challenge에 동참했습니다.
모든 작업은 Amazon Web Services에서 진행했습니다.

이번 글은 Challenge 중 001~005에 대한 내용을 담도록 하겠습니다.

Challenge 001.

큰 작업 내용은 없었습니다.
001에서는 가이드에 따라 지갑을 생성하고, NEAR-CLI 세팅 준비를 했습니다.

  1. 머신 최신화를 진행합니다.
sudo apt update && sudo apt upgrade -y

2. 개발자 도구, Node js, npm 설치합니다.

curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install build-essential nodejs
PATH=”$PATH”
Node js 버젼 확인, npm 버젼 확인합니다.

3. NEAR-CLI 설치하는 방법은 아래와 같습니다.

sudo npm install -g near-cli

4. 환경변수 설정합니다.

export NEAR_ENV=shardnet// 특정환경을 지속적으로 설정하고 싶다면
echo ‘export NEAR_ENV=shardnet’ >> ~/.bashrc
echo ‘export NEAR_ENV=shardnet’ >> ~/.bash_profile
source $HOME/.bash_profile

Ref. 명령어 가이드

//제안들 확인(검증인 세트에 들어가고 싶다는 의미)
near proposals
// 현재 검증인들 확인
near validators current
// 다음 epoch 검증인 세트에 들어갈 validator들
near validator next

Challenge 002.

This challenge is focused on deploying a node (nearcore), downloading a snapshot, syncing it to the actual state of the network, then activating the node as a validator.

이 과제는 노드(nearcore)를 배포하고, 스냅샷을 다운로드하고, 네트워크의 실제 상태로 동기화한 다음, 노드를 검증인으로 활성화하는 데 초점을 맞추고 있습니다.

002에서는 노드를 세팅하고, 검증인으로 노드를 활성화해보는 작업을 했습니다.

002–1. Setup your node

  1. cpu 호환 확인합니다.
lscpu | grep -P '(?=.*avx )(?=.*sse4.2 )(?=.*cx16 )(?=.*popcnt )' > /dev/null \&& echo "Supported" \|| echo "Not supported"
“Supported”가 print 되어야 해당 cpu가 호환된다는 의미입니다.

2. 개발자 도구를 설치합니다.

// 각종 라이브러리 설치
sudo apt install -y git binutils-dev libcurl4-openssl-dev zlib1g-dev libdw-dev libiberty-dev cmake gcc g++ python docker.io protobuf-compiler libssl-dev pkg-config clang llvm cargo
// 우분투에 docker.io 설치 문제 있을때만 아래 명령어 실행!
apt-get install containerd=1.3.3–0ubuntu2
// python pip 설치
sudo apt install python3-pip
// python 환경구성 설정
USER_BASE_BIN=$(python3 -m site — user-base)/bin
export PATH=”$USER_BASE_BIN:$PATH”
// 빌드 환경 설정
sudo apt install clang build-essential make
// rust 설치 -> 메세지 나올시 dafault로 설치
curl — proto ‘=https’ — tlsv1.2 -sSf https://sh.rustup.rs | sh
// 환경 소스 설정
source $HOME/.cargo/env

3. nearcore를 설치합니다.

git clone https://github.com/near/nearcore
cd nearcore
git fetch
// 아래 링크로 들어가서 커밋바이너리 복사
https://github.com/near/stakewars-iii/blob/main/commit.md
// git checkout 받기 위에서 복사한 바이너리로 해야함 !!!
git checkout c1b047b8187accbf6bd16539feb7bb60185bdc38(위에서 복사한 커밋바이너리)

4. nearcore 바이너리를 빌드합니다.

// 빌드
cargo build -p neard --release --features shardnet
// 초기화
./target/release/neard --home ~/.near init --chain-id shardnet --download-genesis
사진과 같이 초기화되면 성공입니다.

5. config.json을 수정합니다.

// 아래 명령어를 실행하면 config.json 폴더를 지우고 새롭게 세팅된 config.json을 받을 수 있음
rm ~/.near/config.json
wget -O ~/.near/config.json https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/config.json
config.json에서 tracked_shard 필드가 위와 같이 되어야 합니다.
boot_nodes 필드가 위처럼 array로 되어야 합니다. 위의 사진 두 개 처럼 된다면 제대로 세팅된 것입니다.

6. 최신 스냅샷을 가져옵니다.

// AWS CLI 설치
sudo apt-get install awscli -y
// 스냅샷 다운
cd ~/.near
wget https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore-deploy/shardnet/genesis.json
// 위작업이 실패했다면 aws cli가 오래된 것임. 아래 명령어 실행후 다시 시도할 것
pip3 install awscli --upgrade

7. 노드를 실행합니다.

cd ~/nearcore
./target/release/neard --home ~/.near run

8. 성공!

성공하여 니어 노드 블록을 받는 중입니다.

002–2. Activating the node as validator

  1. 위의 과정을 거쳐 블록 다운로드가 완료되면, 지갑을 연결해서 활성화합니다.
// 로그인
near login
// 로그인시 링크가 뜰것입니다 타고 들어가서 로그인을 해주면 됩니다
https://wallet.near.org/login/?~~~~~~~~~~~~~
지갑 연결 완료.
next를 누르면 아래와 같이 에러 페이지가 뜹니다. 성공입니다. 다시 콘솔로 돌아갑니다.
위 페이지 이후 콘솔로 들어와서 자신의 지갑 계정을 입력 합니다.
위 사진과 같이 입력한 뒤 Enter를 눌러주시며 됩니다.

2. validator_kdy.json을 설정합니다.

// generate-key 생성
near generate-key codestates.factory.shardnet.near
// 생성된 파일을 shardnet 폴더에 복사
cp ~/.near-credentials/shardnet/codestates.factory.shardnet.near.json ~/.near/validator_key.json

3. validator_key.json파일을 편집합니다.

위와 같이 account_id를 “xx.factory.shardnet.near”의 형식으로, private_key를 “secret_key”로 필드명 변경합니다.

4. validator node를 시작합니다.

target/release/neard run

5. 시스템 명령 설정합니다.

sudo vi /etc/systemd/system/neard.service
위와 같이 <USER> 부분을 자신의 환경에 맞게 변경합니다.

Ref. 시스템 서비스 명령어 가이드

// 시스템 명령에 neard 등록 
sudo systemctl enable neard
// 위명령어를 등록하면 니어를 시작할 수 있다
sudo systemctl start neard
// 재시작
sudo systemctl reload neard
// 로그 확인
journalctl -n 100 -f -u neard
// 로그를 컬러로 보려면
sudo apt install ccze
journalctl -n 100 -f -u neard | ccze -A

6. 성공!

Challenge 003.

Deploy a new staking pool for your validator. Do operations on your staking pool to delegate and stake NEAR.

검증인을 위해 새 스테이킹 풀을 배포합니다. 스테이킹 풀에서 작업을 수행하여 NEAR를 위임하고 스테이킹합니다.

  1. 스테이킹 풀을 만듭니다.
near call factory.shardnet.near create_staking_pool '{"staking_pool_id": "<pool id>", "owner_id": "<accountId>", "stake_public_key": "<public key>", "reward_fee_fraction": {"numerator": 5, "denominator": 100}, "code_hash":"DD428g9eqLL8fWUxv8QSpVFzyHi1Qd16P8ephYCTmMSZ"}' --accountId="<accountId>" --amount=30 --gas=300000000000000

<pool id>, <accountId>, <public key> 내용에 맞춰서 입력을 해줍니

2. 스테이킹 수수료를 조정합니다.

near call <pool_name> update_reward_fee_fraction '{"reward_fee_fraction": {"numerator": 1, "denominator": 100}}' --accountId <account_id> --gas=300000000000000

<pool_name>, <accountId> 내용에 맞춰서 입력을 해줍니다.

스테이킹 수수료 조정 트랜젝션 성공!
SHARDNET 검증인 노드 확인에서 조정한 수수료 1%로 바뀐것을 확인할 수 있습니다.

3. 디파짓 스테이킹을 합니다.

near call <staking_pool_id> deposit_and_stake --amount <amount> --accountId <accountId> --gas=300000000000000

<staking_pool_id>, <amount>, <accountId> 내용에 맞춰서 입력을 해줍니다.

디파짓 스테이킹 트랜젝션 성공!

4. 핑(위임자의 스테이킹 잔액 갱신, 최신화)을 확인합니다.

near call <staking_pool_id> ping '{}' --accountId <accountId> --gas=300000000000000
<staking_pool_id>, <accountID> 내용에 맞춰서 입력을 해줍니다.

5. 총 잔액을 확인할 수 있는 명령어를 입력합니다.

near view <staking_pool_id> get_account_total_balance '{"account_id": "<accountId>"}'
<staking_pool_id>, <accountID>내용에 맞춰서 입력을 해줍니다.

Challenge 004

Setup tools for monitoring node status. Install and use RPC on port 3030 to get useful information for keep your node working.

노드 상태를 모니터링하기 위한 설정 도구입니다. RPC를 포트 3030에 설치하고 사용하여 노드가 계속 작동하도록 하는 데 유용한 정보를 얻으세요.

  1. 로그를 확인합니다.
journalctl -n 100 -f -u neard | ccze -A

2. 노드 버젼을 확인합니다.

// rpc 명령어 설치
sudo apt install curl jq
// 노드 버젼 확인
curl -s http://127.0.0.1:3030/status | jq .version

3. 킥을 당한다면, 킥 당한 이유를 확인합니다.

curl -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json' 127.0.0.1:3030 | jq -c '.result.prev_epoch_kickout[] | select(.account_id | contains ("<POOL_ID>"))' | jq .reason

4. 위임자 및 스테이크 명령 확인

near view <your pool>.factory.shardnet.near get_accounts '{"from_index": 0, "limit": 10}' --accountId <accountId>.shardnet.near

5. 킥 여부 확인하기

curl -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json' 127.0.0.1:3030 | jq -c '.result.prev_epoch_kickout[] | select(.account_id | contains ("<POOL ID>"))' | jq .reason

6. 생성된 블록 확인 or 예상

curl -r -s -d '{"jsonrpc": "2.0", "method": "validators", "id": "dontcare", "params": [null]}' -H 'Content-Type: application/json' 127.0.0.1:3030 | jq -c '.result.current_validators[] | select(.account_id | contains ("<POOL ID>"))'

--

--