May 25, 2023

Quicksilver (validator setup guide and network monitoring system)

Quicksilver is the Interchain Liquid Staking zone for Cosmos, an ecosystem of sovereign and interoperable zones (blockchains), interconnected via the Inter-Blockchain Communication Protocol (IBC). Quicksilver protocol enables users to delegate any IBC-compatible Asset to the validators of their choosing and receive a liquid staked voucher, or qAsset, allowing them to retain capital liquidity and freedom to pursue Defi opportunities while securing the native chains.

----------------------------------------------------------------------------------------

Update packages

sudo apt update && sudo apt upgrade -y

Install dependencies

sudo apt install curl tar wget clang pkg-config libssl-dev libleveldb-dev jq build-essential bsdmainutils git make ncdu htop screen unzip bc fail2ban htop -y

Install Go

wget https://golang.org/dl/go1.19.linux-amd64.tar.gz 
sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
cat <<EOF >> ~/.profile
export GOROOT=/usr/local/go 
export GOPATH=$HOME/go 
export GO111MODULE=on 
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin 
EOF 
source ~/.profile 
go version

The output should be:go version go1.9 linux/amd64

Download binary for work

cd $HOME
wget -O quicksilverd https://github.com/quicksilver-zone/quicksilver/releases/download/v1.2.17/quicksilverd-v1.2.17-amd64
chmod +x quicksilverd
mv quicksilverd $HOME/go/bin/quicksilverd

Specify variables, for ease of work:

echo 'export QUICK_MONIKER='${QUICK_MONIKER} >> $HOME/.profile 
echo 'export QUICK_WALLET='${QUICK_WALLET} >> $HOME/.profile 
source $HOME/.profile

You can check the output:

echo $QUICK_MONIKER 
echo $QUICK_WALLET

Initialize the node:

quicksilverd init $QUICK_MONIKER --chain-id quicksilver-2

Set the settings:

quicksilverd config chain-id quicksilver-2 && \
peers="" && \
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.quicksilverd/config/config.toml && \
seeds="[email protected]:10213,[email protected]:11156,[email protected]:11156" && \
sed -i.bak -e "s/^seeds =.*/seeds = \"$seeds\"/" $HOME/.quicksilverd/config/config.toml

Create wallet:

quicksilverd keys add $QUICK_WALLET

Save the wallet.

Or restore if there is a mnemonic:

quicksilverd keys add $QUICK_WALLET --recover

Download Genesis:

wget -O ~/.quicksilverd/config/genesis.json https://raw.githubusercontent.com/ingenuity-build/mainnet/main/genesis.json

Optional Settings:

  • Memory optimization
cd $HOME/.quicksilverd/config && \
indexer="null" && \ 
snapshot_interval="0" && \ 
pruning="custom" && \ 
pruning_keep_recent="100" && \ 
pruning_keep_every="0" && \ 
pruning_interval="10" && \ 
sed -i.bak -e "s/^indexer *=.*/indexer = \"$indexer\"/" config.toml && \ 
sed -i.bak -e "s/^snapshot-interval *=.*/snapshot-interval = \"$snapshot_interval\"/" app.toml && \ 
sed -i.bak -e "s/^pruning *=.*/pruning = \"$pruning\"/" app.toml && \ 
sed -i.bak -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" app.toml && \ 
sed -i.bak -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" app.toml && \ 
sed -i.bak -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" app.toml
  • Change port
cd $HOME/.quicksilverd/config && \
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:26653\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:26652\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:6061\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:26651\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":26655\"%" config.toml && \ 
sed -i.bak -e "s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:9092\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:9093\"%" app.toml && \ 
echo 'export NODE=http://localhost:26652' >> $HOME/.bash_profile && \ 
source $HOME/.bash_profile && \ 
quicksilverd config node $NODE

Create a service file

sudo tee /etc/systemd/system/quicksilverd.service > /dev/null <<EOF
[Unit]
Description=quicksilver
After=network-online.target 

[Service]
User=$USER
ExecStart=$(which quicksilverd) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535 

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload &&
sudo systemctl enable quicksilverd &&
sudo systemctl restart quicksilverd && sudo journalctl -u quicksilverd -f -o cat

Running a node from a state sync (optional)

sudo systemctl stop quicksilverd && \
quicksilverd tendermint unsafe-reset-all --home /root/.quicksilverd --keep-addr-book
peers="d86f9c285032139a9628c635aae5009dab578f42@rpc.quicksilver.stakeup.tech:26651" && \
sed -i.bak -e  "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" ~/.quicksilverd/config/config.toml && \
SNAP_RPC="https://rpc.quicksilver.stakeup.tech:443" && \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 300)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash) && \ 
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH && \
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \
s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" $HOME/.quicksilverd/config/config.toml
sudo systemctl restart quicksilverd && journalctl -u quicksilverd -f -o cat

Running a node from a snapshot (optional)

Stop quicksilver service

sudo systemctl stop quicksilverd.service

Backup priv_validator_state.json

cp $HOME/.quicksilverd/data/priv_validator_state.json $HOME/priv_validator_state.json

Remove old data in directory ~/.quicksilverd/data

rm -rf ~/.quicksilverd/data; \
mkdir -p ~/.quicksilverd/data; \
cd ~/.quicksilverd/data

Download snapshot

wget http://snapshots.stakeup.tech/quicksilver/quicksilver-2_latest.tar
tar -xf quicksilver-2_latest.tar -C $HOME/.quicksilverd/data/

Return your priv_validator_state.json

mv $HOME/priv_validator_state.json $HOME/.quicksilverd/data/priv_validator_state.json

Download addrbook

wget -O $HOME/.quicksilverd/config/addrbook.json "http://snapshots.stakeup.tech/quicksilver/addrbook.json"

Start service and check logs

sudo systemctl restart quicksilverd && journalctl -u quicksilverd -f -o cat

After full synchronization, you can request tokens and create your own validator.

Create a validator

quicksilverd tx staking create-validator \
--amount=1000000uqck \
--pubkey=$(quicksilverd tendermint show-validator) \
--moniker=$QUICK_MONIKER  \
--chain-id=quicksilver-2 \
--commission-rate="0.10" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.1" \
--min-self-delegation="1" \
--fees 200uqck \
--from=$QUICK_WALLET \
--identity="" \
--website="" \
--details="" \
-y

Network monitoring system (optional)

Install dependencies

sudo apt-get install jq sysstat bc smartmontools fdisk -y

Create a working directory

mkdir status && \
cd status

Download the script and settings

wget https://raw.githubusercontent.com/landerosua/status/main/tendermint/node_status/cosmos.sh && \
wget https://raw.githubusercontent.com/landerosua/status/main/tendermint/node_status/cosmos.conf && \
wget https://raw.githubusercontent.com/landerosua/status/main/tendermint/node_status/name.conf

Setting up access rights

chmod +x cosmos.sh

Customizing Your Options

CHAT_ID_ALARM="you_id_chat_for_alarm_messages(telegram)"
CHAT_ID_STATUS="you_id_chat_for_log_messages(telegram)"
BOT_TOKEN="you_bot_token(telegram bot)"
VALIDATOR_ADDRESS="you_valoper_address"
DELEGATOR_ADDRESS="you_wallet"
MONIKER="you_validator_moniker"

Updating and configuring settings in files

mv name.conf QUICK.conf && \
sed -i 's,# CURL=,CURL=, g' $HOME/status/QUICK.conf && \
sed -i "s/^SERVER *=.*/SERVER = \"Quickilver\"/" $HOME/status/cosmos.conf && \
sed -i "s/^CHAT_ID_ALARM *=.*/CHAT_ID_ALARM = \"$CHAT_ID_ALARM\"/" $HOME/status/cosmos.conf && \
sed -i "s/^BOT_TOKEN *=.*/BOT_TOKEN = \"$BOT_TOKEN\"/" $HOME/status/cosmos.conf && \
sed -i "s/^MONIKER *=.*/MONIKER = \"$MONIKER\"/" $HOME/status/QUICK.conf && \
sed -i 's,https://api-cosmos.cosmostation.io/v1/status/,https://quicksilver.api.explorers.guru/api/v1/blocks/latest, g' $HOME/status/QUICK.conf && \
sed -i "s/^DELEGATOR_ADDRESS *=.*/DELEGATOR_ADDRESS = \"$DELEGATOR_ADDRESS\"/" $HOME/status/QUICK.conf && \
sed -i "s/^VALIDATOR_ADDRESS *=.*/VALIDATOR_ADDRESS = \"$VALIDATOR_ADDRESS\"/" $HOME/status/QUICK.conf && \
sed -i "s/^TOKEN *=.*/TOKEN = \"uqck\"/" $HOME/status/QUICK.conf && \
sed -i "s/^DENOM *=.*/DENOM = \"1000000\"/" $HOME/status/QUICK.conf && \
sed -i "s/^PROJECT *=.*/PROJECT = \"quicksilver-mainnet\"/" $HOME/status/QUICK.conf && \
sed -i 's,/root/go/bin/cosmosd,/root/go/bin/quicksilverd, g' $HOME/status/QUICK.conf && \
sed -i 's,/root/.cosmos/config/,/root/.quicksilverd/config/, g' $HOME/status/QUICK.conf && \
sed -i "s/^CHAT_ID_ALARM *=.*/CHAT_ID_ALARM = \"$CHAT_ID_ALARM\"/" $HOME/status/QUICK.conf && \
sed -i "s/^CHAT_ID_STATUS *=.*/CHAT_ID_STATUS = \"$CHAT_ID_STATUS\"/" $HOME/status/QUICK.conf && \
sed -i "s/^BOT_TOKEN *=.*/BOT_TOKEN = \"$BOT_TOKEN\"/" $HOME/status/QUICK.conf

Setting up a crontab

crontab -e
Adding a line
1,11,21,31,41,51 * * * * bash $HOME/status/cosmos.sh >> $HOME/status/cosmos.log 2>&1

Done.

At work, the logs look like this

Useful links

Website - https://quicksilver.zone/

Discord - https://discord.com/invite/xrSmYMDVrQ

Twitter - https://twitter.com/quicksilverzone

Github - https://github.com/ingenuity-build

Medium - https://medium.com/quicksilverzone