# Welcome

Welcome to the CodeBlockLabs official documentation. a place where we share the code together. from node installation tutorial to scripts & hacks that you may need for your code journey.

Together we build on [@CodeBlockLabs](https://t.me/codeblocklabs.com)&#x20;

We're empowered by [Contabo](https://Lihat.info/contabo), [Vultr](https://Lihat.info/vultr) & [OVH](https://Lihat.info/ovh)&#x20;

### Jump right in

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Getting Started</strong></td><td>What is Node?</td><td></td><td></td><td><a href="/pages/CyH2xJQs9yWJ1S8BYNav">/pages/CyH2xJQs9yWJ1S8BYNav</a></td></tr><tr><td><strong>Node Installation</strong></td><td>Installing Your 1st Node</td><td></td><td></td><td><a href="/pages/cEHgDv7NGBquDGHeLyQ4">/pages/cEHgDv7NGBquDGHeLyQ4</a></td></tr><tr><td><strong>Join The Community</strong></td><td>Code &#x26; Build Together</td><td></td><td></td><td><a href="https://t.me/codeblocklabs">https://t.me/codeblocklabs</a></td></tr></tbody></table>


# What is Node?

A blockchain node is a device or computer that participates in a blockchain network by maintaining a copy of the blockchain ledger and processing transactions. These nodes perform essential functions that support the decentralized and secure nature of the blockchain.

<figure><img src="/files/xTOfH5Jq7rNNCTsD7aJy" alt=""><figcaption><p>Blockchain</p></figcaption></figure>

Here’s a breakdown of the key roles and types of blockchain nodes:

#### 1. **Full Nodes**

* **Definition**: These nodes store the entire history of the blockchain. They validate transactions and blocks by checking them against the blockchain's rules.
* **Function**: They ensure the network's integrity by rejecting invalid transactions and blocks. They also broadcast verified data to other nodes.
* **Example**: Bitcoin and Ethereum full nodes.

#### 2. **Lightweight Nodes (Light Clients)**

* **Definition**: These nodes do not store the full blockchain but rely on full nodes to verify transactions. They store only essential data (like block headers) and request specific information when needed.
* **Function**: They allow users to interact with the blockchain without the need for large storage or extensive processing power.
* **Example**: Wallet apps like MetaMask for Ethereum.

#### 3. **Mining Nodes**

* **Definition**: These nodes are full nodes with the added responsibility of mining (proof of work) or validating blocks (proof of stake).
* **Function**: They participate in the process of creating new blocks by solving complex mathematical problems (in proof of work) or validating based on staked assets (in proof of stake).

#### 4. **Validator Nodes**

* **Definition**: Used primarily in proof-of-stake (PoS) blockchains, validator nodes verify and validate new transactions and propose new blocks.
* **Function**: They maintain the security and operation of PoS blockchains by staking tokens and voting on block proposals.

#### 5. **Archive Nodes**

* **Definition**: Similar to full nodes but store additional historical data beyond the latest state of the blockchain.
* **Function**: These nodes provide detailed historical data for developers, researchers, or services that need access to the complete history of transactions and contracts.

#### Key Functions of Blockchain Nodes:

* **Transaction Verification**: Nodes verify that transactions follow the rules of the blockchain (e.g., ensuring the sender has enough funds).
* **Block Validation**: Full nodes check each new block to confirm it adheres to consensus rules before adding it to their copy of the blockchain.
* **Propagation of Data**: Nodes share data (blocks, transactions) with other nodes to maintain network synchronization.
* **Network Security**: Nodes contribute to the decentralized nature of the network, making it harder for a single entity to control the blockchain.

Nodes are essential for maintaining decentralization and transparency in blockchain systems, ensuring that no single party can control the entire ledger or manipulate transactions.

{% hint style="info" %}
Every blockchain has a different nodes type, some has only mining/validator nodes, some has Full and Light nodes only and many others.
{% endhint %}


# Your First Nodes

Blockchain technology is at the heart of many decentralized applications (dApps), cryptocurrencies, and smart contract platforms. Deploying your own blockchain node allows you to contribute to the network by verifying transactions, maintaining a copy of the ledger, and even participating in consensus mechanisms. This article will guide you through the process of deploying your first blockchain node, focusing on an Ethereum-based network, though the steps can be applied to other blockchains as well.

**Why Deploy a Blockchain Node?**

1. **Decentralization**: By running your own node, you're helping maintain a decentralized network, reducing reliance on third-party services like centralized APIs.
2. **Control**: A node gives you full control over which data you access, directly from the blockchain. You’re no longer dependent on intermediaries.
3. **Participation in Consensus**: Some blockchains, like Proof of Stake (PoS) systems, allow node operators to participate in consensus and potentially earn rewards.

<figure><img src="/files/JTX2cIXOLS4O2DkXr4aI" alt=""><figcaption></figcaption></figure>

#### Prerequisites

Before deploying a node, make sure you have the following:

1. **Hardware**:
   * **CPU**: A modern multi-core processor (e.g., Intel Xeon or AMD Ryzen). (some nodes may only need 1 or 2 cpu)
   * **RAM**: At least 8 GB of RAM, though 16 GB or more is recommended. (some nodes may only need 1  to 4gb ram)
   * **Storage**: SSD storage with a capacity of at least 1 TB for networks like Ethereum that have large blockchain data. (some nodes may only need 100gb at start)
   * **Internet**: A stable connection with decent bandwidth, as blockchain nodes need to synchronize large amounts of data with the network.
2. **Software**:
   * **Operating System**: Linux-based distributions (e.g., Ubuntu, Debian) are widely used for node deployment due to better support and performance.
   * **Blockchain Client**: You need a blockchain client like Geth (Go Ethereum) for Ethereum-based chains or similar software for other blockchains.
3. **Network Setup**:
   * A properly configured network with open ports. If your node is behind a router, you'll need to forward certain ports to ensure smooth communication with other nodes in the network. Using a public IP and configuring a DMZ might be necessary.

{% hint style="info" %}
We'll try our best to add detailed specification for each blockchain nodes we install.
{% endhint %}


# Axone

Axone Mainnet

Anthropic's Model Context Protocol (MCP) and Google's Agent 2 Agent (A2A) Protocol are dominating the transport layer for agents, but the agentic economy still lacks an onchain semantic and micropayments layer that lets autonomous systems understand, transact, and self-govern at internet scale.&#x20;That layer is Axone.

* Homepages: <https://www.axone.xyz/>
* Explorer: [https://explorer.codeblocklabs.com/axone](https://explorer.codeblocklabs.com/lumera-testnet)

**Social Media**

* X <https://x.com/axonexyz>
* Telegram <https://t.me/axonexyz>
* Discord <https://discord.gg/axone>
* Galxe Quest <https://app.galxe.com/quest/Bp9FuLC8zseqCSoyBBRCbu>

**Minimum Requirements**:

* **CPU**:
  * Core: 4+ (x86\_64 architecture)
* **RAM**: 8Gb+
* **Storage**: 120Gb+ SSD NVME
* **Connection:** 1 Gbps dedicated line
* **Software**:
  * Golang go1.24.1 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

Lumera Testnet

Installation

```
// Install Dependencies
sudo apt-get update
sudo apt-get install curl git jq lz4 build-essential
sudo apt-get upgrade

// Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.1.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | tee -a $HOME/.profile)

// Download binaries
mkdir -p $HOME/.axoned/cosmovisor/genesis/bin
wget -O $HOME/.axoned/cosmovisor/genesis/bin/axoned https://green.codeblocklabs.com/mainnet/axone/axoned
chmod +x $HOME/.axoned/cosmovisor/genesis/bin/axoned

// Create application symlinks
ln -s $HOME/.axoned/cosmovisor/genesis $HOME/.axoned/cosmovisor/current -f
sudo ln -s $HOME/.axoned/cosmovisor/current/bin/axoned /usr/local/bin/axoned -f
```

***

## Setting Up Services

```
# Download and install Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.6.0

# Create service
sudo tee /etc/systemd/system/axoned.service > /dev/null << EOF
[Unit]
Description=axone node service
After=network-online.target

[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.axoned"
Environment="DAEMON_NAME=axoned"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:$HOME/.axoned/cosmovisor/current/bin"

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable axoned.service

```

***

## Setting Up Nodes

```
# Set node configuration
axoned config chain-id axone-1

# Initialize the node
lumerad init YourNodesName --chain-id axone-1

# Download genesis and addrbook
curl -Ls https://green.codeblocklabs.com/mainnet/axone/genesis.json > $HOME/.axoned/config/genesis.json
curl -Ls https://green.codeblocklabs.com/mainnet/axone/addrbook.json > $HOME/.axoned/config/addrbook.json

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.025uaxone\"|" $HOME/.axoned/config/app.toml

# Set pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.axoned/config/app.toml

# Set custom ports
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:16958\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:16957\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:16960\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:16956\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":16966\"%" $HOME/.axoned/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:16917\"%; s%^address = \":8080\"%address = \":16980\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:16990\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:16991\"%; s%:8545%:16945%; s%:8546%:16946%; s%:6065%:16965%" $HOME/.axoned/config/app.toml

```

## Chain Snapshots

Create new file with "sudo nano download\_axone.sh"

```
#!/bin/bash

# Config
BACKUP_URL="https://green.codeblocklabs.com/mainnet/axone/"
TARGET_DIR="$HOME/.axoned"
LOG_FILE="$HOME/axone_backup.log"

# Get today's and yesterday's dates in YYYY-MM-DD format
TODAY=$(date '+%Y-%m-%d')
YESTERDAY=$(date -d 'yesterday' '+%Y-%m-%d')

# Check if backup exists (today or yesterday)
check_backup() {
    local date=$1
    BACKUP_NAME="backup-${date}.tar.lz4"
    
    # Check if file exists on server
    if curl --output /dev/null --silent --head --fail "${BACKUP_URL}${BACKUP_NAME}"; then
        echo "$BACKUP_NAME"
        return 0
    else
        return 1
    fi
}

# Download and extract backup
download_and_extract() {
    local backup_name="$1"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Found backup: $backup_name" | tee -a "$LOG_FILE"
    
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⬇️ Downloading and extracting..." | tee -a "$LOG_FILE"
    mkdir -p "$TARGET_DIR"
    
    # Stream download → lz4 decompress → tar extract
    if curl -sL "${BACKUP_URL}${backup_name}" | lz4 -c -d - | tar -x -C "$TARGET_DIR"; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Successfully extracted to $TARGET_DIR" | tee -a "$LOG_FILE"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Extraction failed!" | tee -a "$LOG_FILE"
        exit 1
    fi
}

# Main execution
echo "=== Axone Backup Downloader ===" | tee -a "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔍 Checking for today's backup ($TODAY)..." | tee -a "$LOG_FILE"

# Try today's backup first
if BACKUP_NAME=$(check_backup "$TODAY"); then
    download_and_extract "$BACKUP_NAME"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⏳ Today's backup not found. Checking yesterday ($YESTERDAY)..." | tee -a "$LOG_FILE"
    if BACKUP_NAME=$(check_backup "$YESTERDAY"); then
        download_and_extract "$BACKUP_NAME"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ No backup found for today or yesterday!" | tee -a "$LOG_FILE"
        exit 1
    fi
fi
```

Make it executable

```
chmod +x download_axone_backup.sh
```

Run the download snapshot

```
./download_axone_backup.sh
```

After succesfully download snapshot, run the binary by starting the services

```
// Start the nodes on services
sudo systemctl start axoned.service && sudo journalctl -u axoned.service -f --no-hostname -o cat
```


# Useful Command

Useful set of commands for node operators. From key management to chain governance.

### 🔑 Key management <a href="#key-management" id="key-management"></a>

**Add new key**

```
axoned keys add wallet
```

**Recover existing key**

```
axoned keys add wallet --recover
```

**List all keys**

```
axoned keys list
```

**Delete key**

```
axoned keys delete wallet
```

**Export key to a file**

```
axoned keys export wallet
```

**Import key from a file**

```
axoned keys import wallet wallet.backup
```

**Query wallet balance**

```
axoned q bank balances $(axoned keys show wallet -a)
```

### 👷 Validator management <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

**Create new validator**

```
axoned tx staking create-validator <(cat <<EOF
{
  "pubkey": $(axoned comet show-validator),
  "amount": "1000000uaxone",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id axone-1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025uaxone \
-y
```

**Edit existing validator**

```
axoned tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id axone-1 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025uaxone \
-y
```

**Unjail validator**

```
axoned tx slashing unjail --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Jail reason**

```
axoned query slashing signing-info $(axoned comet show-validator)
```

**List all active validators**

```
axoned q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**List all inactive validators**

```
axoned q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**View validator details**

```
axoned q staking validator $(axoned keys show wallet --bech val -a)
```

### 💲 Token management <a href="#token-management" id="token-management"></a>

**Withdraw rewards from all validators**

```
axoned tx distribution withdraw-all-rewards --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Withdraw commission and rewards from your validator**

```
axoned tx distribution withdraw-rewards $(axoned keys show wallet --bech val -a) --commission --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Delegate tokens to yourself**

```
axoned tx staking delegate $(axoned keys show wallet --bech val -a) 1000000uaxone --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Delegate tokens to validator**

```
axoned tx staking delegate <TO_VALOPER_ADDRESS> 1000000uaxone --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Redelegate tokens to another validator**

```
axoned tx staking redelegate $(axoned keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000uaxone --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Unbond tokens from your validator**

```
axoned tx staking unbond $(axoned keys show wallet --bech val -a) 1000000uaxone --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Send tokens to the wallet**

```
axoned tx bank send wallet <TO_WALLET_ADDRESS> 1000000uaxone --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

### 🗳 Governance <a href="#governance" id="governance"></a>

**List all proposals**

```
axoned query gov proposals
```

**View proposal by id**

```
axoned query gov proposal 1
```

**Vote ‘Yes’**

```
axoned tx gov vote 1 yes --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Vote ‘No’**

```
axoned tx gov vote 1 no --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025axone -y
```

**Vote ‘Abstain’**

```
axoned tx gov vote 1 abstain --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

**Vote ‘NoWithVeto’**

```
axoned tx gov vote 1 NoWithVeto --from wallet --chain-id axone-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025uaxone -y
```

### ⚡️ Utility <a href="#utility" id="utility"></a>

**Update ports**

```
CUSTOM_PORT=110
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.axoned/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}90\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}91\"%" $HOME/.axoned/config/app.toml
```

**Update Indexer**

**Disable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.axoned/config/config.toml
```

**Enable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "kv"|' $HOME/.axoned/config/config.toml
```

**Update pruning**

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.axoned/config/app.toml
```

### 🚨 Maintenance <a href="#maintenance" id="maintenance"></a>

**Get validator info**

```
axoned status 2>&1 | jq .ValidatorInfo
```

**Get sync info**

```
axoned status 2>&1 | jq .SyncInfo
```

**Get node peer**

```
echo $(axoned comet show-node-id)'@'$(curl -4s ifconfig.me)':'$(cat $HOME/.axoned/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

**Check if validator key is correct**

```
[[ $(axoned rad q staking validator $(axoned keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(axoned status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
```

**Get live peers**

```
curl -sS http://localhost:16957/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}'
```

**Set minimum gas price**

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025uaxone\"/" $HOME/.axoned/config/app.toml
```

**Enable prometheus**

```
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.axoned/config/config.toml
```

**Reset chain data**

```
axoned comet unsafe-reset-all --keep-addr-book --home $HOME/.axoned --keep-addr-book
```

**Remove node**

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```
cd $HOME
sudo systemctl stop axoned.service
sudo systemctl disable axoned.service
sudo rm /etc/systemd/system/axoned.service
sudo systemctl daemon-reload
rm -f $(which axoned)
rm -rf $HOME/.axoned
rm -rf $HOME/axoned
```

### ⚙️ Service Management <a href="#service-management" id="service-management"></a>

**Reload service configuration**

```
sudo systemctl daemon-reload
```

**Enable service**

```
sudo systemctl enable axoned.service
```

**Disable service**

```
sudo systemctl disable axoned.service
```

**Start service**

```
sudo systemctl start axoned.service
```

**Stop service**

```
sudo systemctl stop axoned.service
```

**Restart service**

```
sudo systemctl restart axoned.service
```

**Check service status**

```
sudo systemctl status axoned.service
```

**Check service logs**

```
sudo journalctl -u axoned.service -f --no-hostname -o cat
```


# Key Management

## Key Management

### Add New Wallet

```bash
limonatad keys add wallet --home $HOME/.limonata
```

### Restore Existing Wallet

```bash
limonatad keys add wallet --recover --home $HOME/.limonata
```

### List All Wallets

```bash
limonatad keys list --home $HOME/.limonata
```

### Delete Wallet

```bash
limonatad keys delete wallet --home $HOME/.limonata
```

### Check Balance

```bash
limonatad q bank balances $(limonatad keys show wallet -a --home $HOME/.limonata) --home $HOME/.limonata
```

### Export Key

```bash
limonatad keys export wallet --home $HOME/.limonata
```

### Export Key to EVM

```bash
limonatad keys export wallet --unarmored-hex --unsafe --home $HOME/.limonata
```

### Import Key

```bash
limonatad keys import wallet wallet.backup --home $HOME/.limonata
```


# Services Management

## Services Management

### Check Logs

```bash
sudo journalctl -u limonatad -f
```

### Sync Info

```bash
limonatad status 2>&1 | jq .sync_info --home $HOME/.limonata
```

### Node Info

```bash
limonatad status 2>&1 | jq .node_info --home $HOME/.limonata
```

### Your Node Peer

```bash
echo $(limonatad comet show-node-id --home $HOME/.limonata)'@'$(wget -qO- eth0.me)':'$(cat $HOME/.limonata/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

### Restart Node

```bash
sudo systemctl restart limonatad && sudo journalctl -u limonatad -f
```


# Token Management

## Token Management

### Withdraw All Rewards

```bash
limonatad tx distribution withdraw-all-rewards --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Withdraw Rewards and Commission

```bash
limonatad tx distribution withdraw-rewards $(limonatad keys show wallet --bech val -a --home $HOME/.limonata) --from wallet --commission --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Check Balance

```bash
limonatad query bank balances $(limonatad keys show wallet -a --home $HOME/.limonata) --home $HOME/.limonata
```

### Delegate to Yourself

```bash
limonatad tx staking delegate $(limonatad keys show wallet --bech val -a --home $HOME/.limonata) 1000000alimo --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Delegate to Other Validator

```bash
limonatad tx staking delegate VALOPER_ADDRESS 1000000alimo --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Redelegate Stake

```bash
limonatad tx staking redelegate $(limonatad keys show wallet --bech val -a --home $HOME/.limonata) VALOPER_ADDRESS 1000000alimo --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Unbond

```bash
limonatad tx staking unbond $(limonatad keys show wallet --bech val -a --home $HOME/.limonata) 1000000alimo --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Transfer Funds

```bash
limonatad tx bank send $(limonatad keys show wallet -a --home $HOME/.limonata) WALLET_ADDRESS 1000000alimo --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```


# Validator Management

## Validator Management

### Edit Existing Validator

```bash
limonatad tx staking edit-validator \
--commission-rate 0.1 \
--new-moniker "YOUR_NODES_NAME" \
--identity "YOUR_KEYBASE" \
--details "YOUR_DETAIL" \
--from wallet \
--chain-id limonata_10777-1 \
--gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo \
--home $HOME/.limonata \
-y
```

### Validator Info

```bash
limonatad status 2>&1 | jq .validator_info --home $HOME/.limonata
```

### Validator Details

```bash
limonatad q staking validator $(limonatad keys show wallet --bech val -a --home $HOME/.limonata) --home $HOME/.limonata
```

### Jailing Info

```bash
limonatad q slashing signing-info $(limonatad comet show-validator --home $HOME/.limonata) --home $HOME/.limonata
```

### Slashing Parameters

```bash
limonatad q slashing params --home $HOME/.limonata
```

### Unjail Validator

```bash
limonatad tx slashing unjail --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Active Validators List

```bash
limonatad q staking validators -oj --limit=2000 --home $HOME/.limonata | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

### Signing Info

```bash
limonatad q slashing signing-info $(limonatad comet show-validator --home $HOME/.limonata) --home $HOME/.limonata
```


# Governance

## Governance

### Create New Text Proposal

```bash
limonatad tx gov submit-proposal \
--title "Governance" \
--description "DETAIL" \
--deposit 1000000alimo \
--type Text \
--from wallet \
--chain-id limonata_10777-1 \
--gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo \
--home $HOME/.limonata \
-y
```

### Proposals List

```bash
limonatad query gov proposals --home $HOME/.limonata
```

### View Proposal

```bash
limonatad query gov proposal 1 --home $HOME/.limonata
```

### Vote Yes

```bash
limonatad tx gov vote 1 yes --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Vote No

```bash
limonatad tx gov vote 1 no --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Vote No With Veto

```bash
limonatad tx gov vote 1 no_with_veto --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```

### Vote Abstain

```bash
limonatad tx gov vote 1 abstain --from wallet --chain-id limonata_10777-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25alimo --home $HOME/.limonata -y
```


# Key Management

## Key Management

### Add New Wallet

```bash
pchaind keys add wallet --home $HOME/.pushchain
```

### Restore Existing Wallet

```bash
pchaind keys add wallet --recover --home $HOME/.pushchain
```

### List All Wallets

```bash
pchaind keys list --home $HOME/.pushchain
```

### Delete Wallet

```bash
pchaind keys delete wallet --home $HOME/.pushchain
```

### Check Balance

```bash
pchaind q bank balances $(pchaind keys show wallet -a --home $HOME/.pushchain) --home $HOME/.pushchain
```

### Export Key

```bash
pchaind keys export wallet --home $HOME/.pushchain
```

### Export Key to EVM

```bash
pchaind keys export wallet --unarmored-hex --unsafe --home $HOME/.pushchain
```

### Import Key

```bash
pchaind keys import wallet wallet.backup --home $HOME/.pushchain
```


# Services Management

## Services Management

### Check Logs

```bash
sudo journalctl -u pchaind -f
```

### Sync Info

```bash
pchaind status 2>&1 | jq .sync_info --home $HOME/.pushchain
```

### Node Info

```bash
pchaind status 2>&1 | jq .node_info --home $HOME/.pushchain
```

### Your Node Peer

```bash
echo $(pchaind comet show-node-id --home $HOME/.pushchain)'@'$(wget -qO- eth0.me)':'$(cat $HOME/.pushchain/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

### Restart Node

```bash
sudo systemctl restart pchaind && sudo journalctl -u pchaind -f
```


# Token Management

## Token Management

### Withdraw All Rewards

```bash
pchaind tx distribution withdraw-all-rewards --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Withdraw Rewards and Commission

```bash
pchaind tx distribution withdraw-rewards $(pchaind keys show wallet --bech val -a --home $HOME/.pushchain) --from wallet --commission --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Check Balance

```bash
pchaind query bank balances $(pchaind keys show wallet -a --home $HOME/.pushchain) --home $HOME/.pushchain
```

### Delegate to Yourself

```bash
pchaind tx staking delegate $(pchaind keys show wallet --bech val -a --home $HOME/.pushchain) 1000000upc --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Delegate to Other Validator

```bash
pchaind tx staking delegate VALOPER_ADDRESS 1000000upc --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Redelegate Stake

```bash
pchaind tx staking redelegate $(pchaind keys show wallet --bech val -a --home $HOME/.pushchain) VALOPER_ADDRESS 1000000upc --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Unbond

```bash
pchaind tx staking unbond $(pchaind keys show wallet --bech val -a --home $HOME/.pushchain) 1000000upc --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Transfer Funds

```bash
pchaind tx bank send $(pchaind keys show wallet -a --home $HOME/.pushchain) WALLET_ADDRESS 1000000upc --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```


# Validator Management

## Validator Management

### Edit Existing Validator

```bash
pchaind tx staking edit-validator \
--commission-rate 0.1 \
--new-moniker "YOUR_NODES_NAME" \
--identity "YOUR_KEYBASE" \
--details "YOUR_DETAIL" \
--from wallet \
--chain-id push_42101-1 \
--gas auto --gas-adjustment 1.5 --gas-prices 0.25upc \
--home $HOME/.pushchain \
-y
```

### Validator Info

```bash
pchaind status 2>&1 | jq .validator_info --home $HOME/.pushchain
```

### Validator Details

```bash
pchaind q staking validator $(pchaind keys show wallet --bech val -a --home $HOME/.pushchain) --home $HOME/.pushchain
```

### Jailing Info

```bash
pchaind q slashing signing-info $(pchaind comet show-validator --home $HOME/.pushchain) --home $HOME/.pushchain
```

### Slashing Parameters

```bash
pchaind q slashing params --home $HOME/.pushchain
```

### Unjail Validator

```bash
pchaind tx slashing unjail --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Active Validators List

```bash
pchaind q staking validators -oj --limit=2000 --home $HOME/.pushchain | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

### Signing Info

```bash
pchaind q slashing signing-info $(pchaind comet show-validator --home $HOME/.pushchain) --home $HOME/.pushchain
```


# Governance

## Governance

### Create New Text Proposal

```bash
pchaind tx gov submit-proposal \
--title "Governance" \
--description "DETAIL" \
--deposit 1000000upc \
--type Text \
--from wallet \
--chain-id push_42101-1 \
--gas auto --gas-adjustment 1.5 --gas-prices 0.25upc \
--home $HOME/.pushchain \
-y
```

### Proposals List

```bash
pchaind query gov proposals --home $HOME/.pushchain
```

### View Proposal

```bash
pchaind query gov proposal 1 --home $HOME/.pushchain
```

### Vote Yes

```bash
pchaind tx gov vote 1 yes --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Vote No

```bash
pchaind tx gov vote 1 no --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Vote No With Veto

```bash
pchaind tx gov vote 1 no_with_veto --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```

### Vote Abstain

```bash
pchaind tx gov vote 1 abstain --from wallet --chain-id push_42101-1 --gas auto --gas-adjustment 1.5 --gas-prices 0.25upc --home $HOME/.pushchain -y
```


# Snapshot

Get synced faster and easy.

```bash
sudo apt update
sudo apt-get install snapd lz4 -y
```

## Chain Snapshots

Create new file with "sudo nano download\_axone.sh"

```
#!/bin/bash

# Config
BACKUP_URL="https://green.codeblocklabs.com/mainnet/axone/"
TARGET_DIR="$HOME/.axoned"
LOG_FILE="$HOME/axone_backup.log"

# Get today's and yesterday's dates in YYYY-MM-DD format
TODAY=$(date '+%Y-%m-%d')
YESTERDAY=$(date -d 'yesterday' '+%Y-%m-%d')

# Check if backup exists (today or yesterday)
check_backup() {
    local date=$1
    BACKUP_NAME="backup-${date}.tar.lz4"
    
    # Check if file exists on server
    if curl --output /dev/null --silent --head --fail "${BACKUP_URL}${BACKUP_NAME}"; then
        echo "$BACKUP_NAME"
        return 0
    else
        return 1
    fi
}

# Download and extract backup
download_and_extract() {
    local backup_name="$1"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Found backup: $backup_name" | tee -a "$LOG_FILE"
    
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⬇️ Downloading and extracting..." | tee -a "$LOG_FILE"
    mkdir -p "$TARGET_DIR"
    
    # Stream download → lz4 decompress → tar extract
    if curl -sL "${BACKUP_URL}${backup_name}" | lz4 -c -d - | tar -x -C "$TARGET_DIR"; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Successfully extracted to $TARGET_DIR" | tee -a "$LOG_FILE"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Extraction failed!" | tee -a "$LOG_FILE"
        exit 1
    fi
}

# Main execution
echo "=== Axone Backup Downloader ===" | tee -a "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔍 Checking for today's backup ($TODAY)..." | tee -a "$LOG_FILE"

# Try today's backup first
if BACKUP_NAME=$(check_backup "$TODAY"); then
    download_and_extract "$BACKUP_NAME"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⏳ Today's backup not found. Checking yesterday ($YESTERDAY)..." | tee -a "$LOG_FILE"
    if BACKUP_NAME=$(check_backup "$YESTERDAY"); then
        download_and_extract "$BACKUP_NAME"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ No backup found for today or yesterday!" | tee -a "$LOG_FILE"
        exit 1
    fi
fi
```

Make it executable

```
chmod +x download_axone_backup.sh
```

Run the download snapshot

```
./download_axone_backup.sh
```

After succesfully download snapshot, run the binary by starting the services

```
// Start the nodes on services
sudo systemctl start axoned.service && sudo journalctl -u axoned.service -f --no-hostname -o cat
```


# Aztec Network

Aztec Network Testnet

#### Aztec is a Privacy-First L2 on Ethereum[​](https://docs.aztec.network/#aztec-is-a-privacy-first-l2-on-ethereum) <a href="#aztec-is-a-privacy-first-l2-on-ethereum" id="aztec-is-a-privacy-first-l2-on-ethereum"></a>

On Ethereum today, everything is publicly visible, by everyone. In the real world, people enjoy privacy. Aztec brings privacy to Ethereum.

* private functions, executed and proved on a user's device
* public functions, executed in the Aztec Virtual Machine
* private state, stored as UTXOs that only the owner can decrypt
* public state, stored in a public merkle tree
* composability between private/public execution and private/public state
* public and private messaging with Ethereum

Sequencer Nodes Requirement

* CPU 4 Core+
* RAM 8Gb
* Disk 120Gb (NVME Recomended)
* Sepolia RPC ([Click Here To Setup Your Own RPC](https://documentation.codeblocklabs.com/blockchain-nodes/ethereum) (Recomended) or [Rent RPC Access From 3rd Party](https://blockpi.io/))


# Installation

Aztec Network Testnet

{% hint style="info" %}
You need  to have your own sepolia RPC or rent it from any paid provider, the free one will have limited access and can't be used.
{% endhint %}

### 1. Follow This Step If It's Your First Time Running Aztec Sequencer (Otherwise Just Next To Step 2):

```
sudo apt-get update && sudo apt-get upgrade -y
```

```
sudo apt install curl iptables build-essential git wget lz4 jq make gcc nano automake autoconf tmux htop nvme-cli libgbm1 pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev screen  -y
```

```
source <(wget -O - https://raw.githubusercontent.com/frianowzki/installer/main/docker.sh)
```

```
sudo groupadd docker && sudo usermod -aG docker $(whoami) && newgrp docker
```

```
bash -i <(curl -s https://install.aztec.network)
```

```
echo 'export PATH=$PATH:/root/.aztec/bin' >> ~/.bashrc
```

```
source ~/.bashrc
```

```
aztec-up alpha-testnet
```

### 2. Stop, Remove & Update Current Sequencer:

```
docker ps -a
```

```
docker stop [aztec-container-id] && docker rm [aztec-container-id]
```

```
rm -rf .aztec/alpha-testnet/data
```

```
aztec-up alpha-testnet

// OR use below if you need specific version (example: v0.87.2)
aztec-up -v 0.87.2
```

### 12. Now let's run Aztec Sequencer again if there is no error:

```
aztec start --node --archiver --sequencer \
  --network alpha-testnet \
  --l1-rpc-urls RPC_URL  \
  --l1-consensus-host-urls CONSENSUS_HOST_URL \
  --sequencer.validatorPrivateKey 0xPrivateKey \
  --sequencer.coinbase 0xPublicAddress \
  --p2p.p2pIp IP \
  --port 8081 
```

* Change `RPC_URL` with:

```
https://Your_Rented_RPC_URL

// OR

http://YourOWN_RPC_IP:PORT
```

* Change `CONSENSUS_HOST_URL` with:

```
https://Your_Rented_Beacon_RPC_URL

// OR

http://YourOWN__BEACON_RPC_IP:PORT
```

* Enter and wait until it fully synced, you can check the logs using:

```
docker ps -a
```

```
docker logs -f [aztec-container-ID]
```

### 13. Update Aztec Governance (Only for Validators):

```
docker ps -a
```

```
docker stop [aztec-container-id] && docker rm [aztec-container-id]
```

```
rm -rf .aztec/alpha-testnet/data
```

```
aztec-up alpha-testnet
```

If you are using CLI you can just add this line

```
--sequencer.governanceProposerPayload 0x54F7fe24E349993b363A5Fa1bccdAe2589D5E5Ef
```

Or if you use Docker Compose you can use this on your .env

```
cd .aztec/alpha-testnet
```

```
nano .env
```

```
ETHEREUM_RPC_URL=http:/your_IP:8545
CONSENSUS_BEACON_URL=http:/your_IP:3500
VALIDATOR_PRIVATE_KEY=0xPrivateKey
COINBASE=0xPublicAddress
P2P_IP=your_IP
GOVERNANCE_PAYLOAD=0x54F7fe24E349993b363A5Fa1bccdAe2589D5E5Ef
```

Save it and set Docker Compose:

```
nano docker-compose.yml
```

```
services:
  aztec-node:
    container_name: aztec-sequencer
    image: aztecprotocol/aztec:alpha-testnet
    restart: unless-stopped
    environment:
      ETHEREUM_HOSTS: ${ETHEREUM_RPC_URL}
      L1_CONSENSUS_HOST_URLS: ${CONSENSUS_BEACON_URL}
      DATA_DIRECTORY: /data
      VALIDATOR_PRIVATE_KEY: ${VALIDATOR_PRIVATE_KEY}
      COINBASE: ${COINBASE}
      P2P_IP: ${P2P_IP}
      LOG_LEVEL: debug
      GOVERNANCE_PAYLOAD: ${GOVERNANCE_PAYLOAD}
    entrypoint: >
      sh -c "node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js start \
      --network alpha-testnet \
      --node \
      --archiver \
      --sequencer \
      --sequencer.governanceProposerPayload ${GOVERNANCE_PAYLOAD}"
    ports:
      - 40400:40400/tcp
      - 40400:40400/udp
      - 8081:8081
    volumes:
      - /root/.aztec/alpha-testnet/data/:/data
```

Run it by use this command:

```
docker compose up -d
```


# Auto Restart

bash script for auto restart the aztec nodes if there is an error.

Create new file named run\_aztech.sh

```
sudo nano run_aztec.sh
```

then add code below:

```
#!/bin/bash

# Function to run the aztec command
run_aztec() {
    aztec start --node --archiver --sequencer \
        --network alpha-testnet \
        --l1-rpc-urls http://YOUR_RPC_URL \
        --l1-consensus-host-urls http://YOUR_BEACON_URL \
        --sequencer.validatorPrivateKey YOUR_PRIVATE_KEY\
        --sequencer.coinbase YOUR_ADDRESS \
        --p2p.p2pIp 38.102.84.231 \
        --p2p.maxTxPoolSize 1000000000 \
        --port 8081
}

# Trap Ctrl+C (SIGINT) to exit the script
trap "echo 'Script stopped by user'; exit" SIGINT

# Main loop
while true; do
    echo "Starting aztec command..."
    run_aztec
    
    # If the command fails, wait 5 seconds before restarting
    if [ $? -ne 0 ]; then
        echo "Command failed or exited. Restarting in 5 seconds..."
        sleep 5
    else
        # If the command exited successfully (unlikely in this case), break the loop
        echo "Command exited successfully. Stopping."
        break
    fi
done
```

use CTRL+X , Y , Enter to save the file

allow the file to be executed

```
chmod +x run_aztec.sh
```

to run the script you just need to use command:&#x20;

```
./run_aztec.sh
```

Stopping the command you'll need to use CTRL+C


# Banano

Banano is a feeless, instant, rich in potassium cryptocurrency powered by DAG technology disrupting the meme economy.

**Recommended Hardware**

* Run the node in a datacenter. Most SSD VPS packages will work. but better use NVME vps.
* 1 modern CPU core minimum. 2 or more is recommended especially for voting nodes and principal nodes.
* 100GB Free disk space (Blockchain database is \~25GB in size at the moment)
* 2 GB system RAM or more. 4 GB or more is recommended especially for voting nodes and principal nodes

Recomended VPS: \
Contabo -> <https://Lihat.info/contabo> \
Vultr -> <https://Lihat.info/vultr> \
OVH -> <https://Lihat.info/ovh>

<figure><img src="/files/150IyC2SsNhJZ6gYyYl5" alt=""><figcaption></figcaption></figure>


# Installation

### Installation (Docker) <a href="#installation-docker" id="installation-docker"></a>

Install docker from <https://docs.docker.com/engine/install/ubuntu/>

then use command below to install and run banano nodes automatically on port 6900.

```
docker run --restart=unless-stopped -d -p 6900:6900-v ~:/root bananocoin/banano
```

or if you want to use different folder or different port:

```
docker run --restart=unless-stopped -d \
  -p 7071:7071 \
  -p [::0]:7072:7072 \
  -p [::0]:7074:7074 \
  -v /mnt/blockstorage:/root \
  bananocoin/banano
```

just change the data on -v and port on -p (it's also specified more port for accessing nodes from outside)

To check logs, use command:

```
docker log
```

### Installation (sourcecode) <a href="#installation-sourcecode" id="installation-sourcecode"></a>

#### install dependencies <a href="#install-dependencies" id="install-dependencies"></a>

```
sudo apt update;
sudo apt upgrade -y;
sudo apt-get install -y git cmake make g++ curl wget python-dev;
sudo apt install python3-pip;
sudo pip install cmake-format;
```

#### create swap (only if your nodes are not having a good configuration) <a href="#create-swap-only-if-your-nodes-are-not-having-a-good-configuration" id="create-swap-only-if-your-nodes-are-not-having-a-good-configuration"></a>

```
sudo fallocate -l 4G /swapfile;
sudo chmod 600 /swapfile;
sudo mkswap /swapfile;
sudo swapon /swapfile;
sudo nano /etc/fstab;

# add the below line to /etc/fstab
/swapfile swap swap defaults 0 0
```

**Installing precompiled Boost**

```
sudo apt install -y libboost-all-dev
```

**Building static Boost**

***automatic build***

```
sudo banano_build/util/build_prep/bootstrap_boost.sh --m
```

\*\*the --m flags are optional, it may reduce time, but may break Boost for other use cases than building the bananode

***manual build***

```
wget https://netix.dl.sourceforge.net/project/boost/boost/1.70.0/boost_1_70_0.tar.gz   
tar xzvf boost_1_70_0.tar.gz   
cd boost_1_70_0   
./bootstrap.sh --with-libraries=system,thread,log,filesystem,program_options,coroutine,context  
./b2 --prefix=/usr/local/boost link=static install   
cd ..
```

**Cloning the Bananode's git repository**

**check out master branch**

```
git clone --recursive https://github.com/BananoCoin/banano.git banano_build   
```

**check out V23.3 branch.**

```
git clone --branch v23.3 --recursive https://github.com/BananoCoin/banano.git banano_build
```

NOTE: rocksdb needs to be updated or you get a compiler error regarding `block_rep` The below code updates rocksdb to the v24 version of rocksdb:

```
cd banano_build
cd rocksdb
git checkout 79f08d7ffa6d34d9ca3357777bcb335884a56cfb
cd ..
cd ..
```

**check out V24 branch.**

```
git clone --branch v24 --recursive https://github.com/BananoCoin/banano.git banano_build
```

**Building bananode**

```
cd banano_build   

git submodule update --init --force --recursive

cmake -G "Unix Makefiles"   
make bananode
```

**Configuring bananode**

```
## copy the node executable into the parent directory
cp bananode ../bananode;
cd ..;
## check if the freshly compiled executable executes 
./bananode --diagnostics;
## generate default config files with all available options. You can then customize the config files, for example to activate RPC or activate voting.
mkdir BananoData;
./bananode --generate_config node > /root/BananoData/config-node.toml 
./bananode --generate_config rpc > /root/BananoData/config-rpc.toml
cp ./banano_build/docker/node/config/config-* BananoData;
## you can delete the banano_build directory now, if you want
```

**Running the bananode**

```
# start the node in the background
screen -dmSL bananode ./bananode --daemon;

# check that it has peers (firewall may prevent peers)
curl -g -d '{"action": "peers"}' 'localhost:7072';

# check local block count (RPC)
curl -g -d '{"action": "block_count"}' 'localhost:7072';

# check local block count (CLI)
./bananode --debug_block_count;

# check kalium block count (RPC)
curl -g -d '{"action": "block_count"}' 'https://kaliumapi.appditto.com/api';

# check how many accounts are still being processed.
cat BananoData/log/* | grep -e 'accounts in pull queue' | tail -n 2
```


# Node Configuration

Configuration for config-node.toml

```
[node]
# throttle bandwidth (recommended unless on a large vps)
# bandwidth_limit = 1

# only allow one person to bootstrap from you at a time (recommended unless on a large vps or a principle rep)
# bootstrap_connections_max = 1

# don't allow burst mode (recommended unless on a large vps or a principle rep)
# bandwidth_limit_burst_ratio = 1.0

[node.rocksdb]
# only enable if you are using rocksdb, by default it's false
enable = true

[node.websocket]
# WebSocket server bind address.
# type:string,ip
address = "::ffff:0.0.0.0"

# Enable or disable WebSocket server. disable unless you need it.
# type:bool
enable = false

[rpc]
# Enable or disable RPC. 
# enable to allow debugging of bootstrapping. disable if not needed after bootstrapping.
# type:bool
enable = true
```

Configuration for config-rpc.toml

```

# Bind address for the RPC server.
# type:string,ip
address = "::ffff:0.0.0.0"

# Enable or disable control-level requests.
# WARNING: Enabling this gives anyone with RPC access the ability to stop the node and access wallet funds.
# type:bool
enable_control = true

# Maximum number of levels in JSON requests.
# type:uint8
max_json_depth = 20

# Maximum number of bytes allowed in request bodies.
# type:uint64
max_request_size = 33554432

# Listening port for the RPC server.
# type:uint16
port = 6900

[logging]

# Whether to log RPC calls.
# type:bool
#log_rpc = true

[process]

# Number of threads used to serve IO.
# type:uint32
#io_threads = 4

# Address of IPC server.
# type:string,ip
#ipc_address = "::1"

# Listening port of IPC server.
# type:uint16
#ipc_port = 46000

# Number of IPC connections to establish.
# type:uint32
#num_ipc_connections = 1
```


# RPC Command

Check nodes version

```
curl -d '{"action": "version"}' localhost:6900
```

Check nodes version

```
curl -d '{"action": "block_count"}' localhost:6900
```

Create New Nodes Wallet\_ID

```
curl -g -d '{ "action": "wallet_create"}' localhost:6900
```

Import your wallet into nodes

```
curl -g -d '{ "action": "wallet_change_seed", "wallet": "YOUR_NODES_WALLET_ID", "seed": "YOUR_SEED_64char"}' localhost:6900
```

more rpc command are available on official nano pages, since banano are fork from nano, it's RPC are same :) <https://docs.nano.org/commands/rpc-protocol/>


# Cli Command

Check nodes version

```
./bananode --version
```

Check all wallet on nodes

```
./bananode --wallet_list
```

more cli command are available on official nano pages, since banano are fork from nano, it's CLI are same :) <https://docs.nano.org/commands/command-line-interface/>


# Other

more RPC, Command and banano playground are available on special site made by banano official developer on [https://nanoo.tools/](https://nanoo.tools/action_filter.txt)

for security you can also use different server to connect directly to your nodes, this will make your nodes safer. use script from <https://nanoo.tools/action_filter.txt> to filter each request you make.


# BlockCast

A DePIN in content delivery networks to earn with idle internet bandwidth, powered by solana.

Blockcast brings together capacity from independent node operators and commercial networks through open standards to enable content delivery services at a fraction of the cost, without compromising security or performance.

<figure><img src="/files/mp4QqOE0hEfZYi5qtOxE" alt=""><figcaption><p>How BlockCast Works</p></figcaption></figure>

**Minimum Requirements**:

* **CPU**:
  * Core: 2+
* **RAM**: 4GB+
* **Storage**: 120GB+ SSD/NVME
* **Software**:
  * Docker + Docker-Compose
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

BlockCast Installation

**Windows Users**:

* Must install Ubuntu on Windows using this [guide](https://documentation.codeblocklabs.com/other/wsl), then continue further steps.

**VPS Users**:

* Get your cheap vps from [Contabo](https://lihat.info/contabo), [Vultr](https://lihat.info/vultr) or [VpsAG](https://lihat.info/vpsag)&#x20;

***

### Install Dependecies:

Update packages:

```
sudo apt-get update && sudo apt-get upgrade -y
```

Install Packages:

```
sudo apt install curl iptables build-essential git wget lz4 jq make gcc nano automake autoconf tmux htop nvme-cli libgbm1 pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev  -y
```

Install Docker:

```
sudo apt update -y && sudo apt upgrade -y
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update -y && sudo apt upgrade -y

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Test Docker
sudo docker run hello-world

sudo systemctl enable docker
sudo systemctl restart docker
```

***

### Register Dashboard:

To get started, [register in Dashboard](https://app.blockcast.network/?referral-code=1TEhib)

***

### Install

```
git clone https://github.com/pramonoutomo/blockcast
```

```
cd blockcast
```

***

### Run

```
docker compose up -d
```

* Note: Before procceding to run node, make sure port `18080` is not in-use. If so, open configuration file with `nano docker-compose.yml` and change the port to other, for example to `18081` by replacing `18080:8080` with `18081:8080`.

***

### Check Logs

List Containers:

```
docker compose ps -a
```

Response:

```
NAME                                 IMAGE                             COMMAND                  SERVICE          
beacon-docker-compose-watchtower-1   containrrr/watchtower             "/watchtower"            watchtower
beacond                              blockcast/cdn_gateway_go:stable   "/usr/bin/beacond -l…"   beacond
blockcastd                           blockcast/cdn_gateway_go:stable   "/usr/bin/blockcastd…"   blockcastd
control_proxy                        blockcast/cdn_gateway_go:stable   "/usr/bin/control_pr…"   control_proxy
```

Check logs:

```
docker compose logs -fn 1000
```

* skip logs if you have all containers running.

***

### Register Node

Get location:

```
curl -s https://ipinfo.io | jq '.city, .region, .country, .loc'
```

Generate Node Data & Register:

```
docker compose exec blockcastd blockcastd init
```

* Copy and paste the `Registration URL` from the terminal in browser to open the Dashboard.
* With your Hardware ID and Challenge Key pre-filled, Fill-in your location from previous command.
* Register your Node. Make sure you choose the right location of your machine.
* Wait a few minutes until your node turn **Online.**

  <br>

  <figure><img src="/files/QtuAS0Ia2AtRVrM7IKoD" alt=""><figcaption></figcaption></figure>


# BlockX

An EVM+Cosmos Layer 1 blockchain ecosystem built for lightning-fast transactions and low gas fees, welcoming developers to build dApps seamlessly, together

BlockX has made blockchain development safer and more supportive. Our community of builders is vetted, and committed to helping each succeed in the world of blockchain development

* Homepages: <https://www.blockxnet.com/>
* Explorer: <https://ping.blockxnet.com/> / <https://explorer.codeblocklabs.com/blockx>

**Minimum Requirements**:

* **CPU**:
  * Core: 2+
* **RAM**: 4GB+
* **Storage**: 120GB+ SSD/NVME
* **Software**:
  * Golang go1.16.1 - go1.19.4 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

BlockX Installation

{% hint style="danger" %}
This testnet installation may already obsolete as the BloxkX already launch it's mainnet.
{% endhint %}

Install Golang

```
// download and install
wget -q -O - https://raw.githubusercontent.com/canha/golang-tools-install-script/master/goinstall.sh | bash -s -- --version 1.18
```

When installation is finished please load variables into system

```
source ~/.profile
```

Check if Go already installed sucessfully

```
// It should return go version go1.18 linux/amd64
go version
```

Run Fullnodes

```
git clone https://github.com/defi-ventures/blockx-node-public-compiled.git
cd blockx-node-public-compiled
./run-fullnode-cosmovisor.sh
```

{% hint style="info" %}
**Useful Tips**\
*Check Version:* blockxd version --long

*CHECK STATUS BINARY:* systemctl status blockxd \
*CHECK RUNNING LOGS:* journalctl -fu blockxd -o cat \
*CHECK LOCAL STATUS:* curl -s localhost:26657/status | jq .result.sync\_info
{% endhint %}


# Useful Command

Useful set of commands for node operators. From key management to chain governance.

### 🔑 Key management <a href="#key-management" id="key-management"></a>

**Add new key**

```
blockxd keys add wallet
```

**Recover existing key**

```
blockxd keys add wallet --recover
```

**List all keys**

```
blockxd keys list
```

**Delete key**

```
blockxd keys delete wallet
```

**Export key to the file**

```
blockxd keys export wallet
```

**Import key from the file**

```
blockxd keys import wallet wallet.backup
```

**Query wallet balance**

```
blockxd q bank balances $(blockxd keys show wallet -a)
```

### 👷 Validator management <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

**Create new validator**

```
blockxd tx staking create-validator \
--amount 1000000abcx \
--pubkey $(blockxd tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id blockx_12345-2 \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--from wallet \
--gas-prices 0.025abcx \
-y
```

**Edit existing validator**

```
blockxd tx staking edit-validator \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL"
--chain-id blockx_12345-2 \
--commission-rate 0.05 \
--from wallet \
--gas-prices 0.025abcx \
-y
```

**Unjail validator**

```
blockxd tx slashing unjail --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas-prices 0.025abcx -y
```

**Jail reason**

```
blockxd query slashing signing-info $(blockxd tendermint show-validator)
```

**List all active validators**

```
blockxd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**List all inactive validators**

```
blockxd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**View validator details**

```
blockxd q staking validator $(blockxd keys show wallet --bech val -a)
```

### 💲 Token management <a href="#token-management" id="token-management"></a>

**Withdraw rewards from all validators**

```
blockxd tx distribution withdraw-all-rewards --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Withdraw commission and rewards from your validator**

```
blockxd tx distribution withdraw-rewards $(blockxd keys show wallet --bech val -a) --commission --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Delegate tokens to yourself**

```
blockxd tx staking delegate $(blockxd keys show wallet --bech val -a) 1000000abcx --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Delegate tokens to validator**

```
blockxd tx staking delegate <TO_VALOPER_ADDRESS> 1000000abcx --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Redelegate tokens to another validator**

```
blockxd tx staking redelegate $(blockxd keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000abcx --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Unbond tokens from your validator**

```
blockxd tx staking unbond $(blockxd keys show wallet --bech val -a) 1000000abcx --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Send tokens to the wallet**

```
blockxd tx bank send wallet <TO_WALLET_ADDRESS> 1000000abcx --from wallet --chain-id blockx_12345-2
```

### 🗳 Governance <a href="#governance" id="governance"></a>

**List all proposals**

```
blockxd  query gov proposals
```

**View proposal by id**

```
blockxd query gov proposal 1
```

**Vote 'Yes'**

```
blockxd tx gov vote 1 yes --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Vote 'No'**

```
blockxd tx gov vote 1 no --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Vote 'Abstain'**

```
blockxd tx gov vote 1 abstain --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

**Vote 'NoWithVeto'**

```
blockxd tx gov vote 1 nowithveto --from wallet --chain-id blockx_12345-2 --gas-adjustment 1.4 --gas auto --fees 500abcx -y
```

### ⚡️ Utility <a href="#utility" id="utility"></a>

**Update ports**

```
CUSTOM_PORT=28
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}660\"%" $HOME/.blockxd/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}317\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}091\"%" $HOME/.nolus/config/app.toml
```

## **Update Indexer**

**Disable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.blockxd/config/config.toml
```

**Enable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "kv"|' $HOME/.blockxd/config/config.toml
```

**Update pruning**

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.blockxd/config/app.toml
```

## 🚨 Maintenance <a href="#maintenance" id="maintenance"></a>

**Get validator info**

```
blockxd status 2>&1 | jq .ValidatorInfo
```

**Get sync info**

```
blockxd status 2>&1 | jq .SyncInfo
```

**Get node peer**

```
echo $(blockxd tendermint show-node-id)'@'$(curl -s ifconfig.me)':'$(cat $HOME/.blockxd/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

**Check if validator key is correct**

```
[[ $(blockxd q staking validator $(blockxd keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(blockxd status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
```

**Get live peers**

```
curl -sS http://localhost:25657/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}'
```

**Set minimum gas price**

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0025unls\"/" $HOME/.blockxd/config/app.toml
```

**Enable prometheus**

```
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.blockxd/config/config.toml
```

**Reset chain data**

```
blockxd tendermint unsafe-reset-all --home $HOME/.blockxd --keep-addr-book
```

**Remove node**

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```
cd $HOME
sudo systemctl stop blockxd 
sudo systemctl disable blockxd 
sudo rm /etc/systemd/system/blockxd.service
sudo systemctl daemon-reload
rm -f $(which blockxd)
rm -rf $HOME/.blockxd
rm -rf $HOME/blockx-node-public-compiled
```

### ⚙️ Service Management <a href="#service-management" id="service-management"></a>

**Reload service configuration**

```
sudo systemctl daemon-reload
```

**Enable service**

```
sudo systemctl enable blockx
```

**Disable service**

```
sudo systemctl disable blockx
```

**Start service**

```
sudo systemctl start blockx
```

**Stop service**

```
sudo systemctl stop blockx
```

**Restart service**

```
sudo systemctl restart blockx
```

**Check service status**

```
sudo systemctl status blockx
```

**Check service logs**

```
sudo journalctl -u blockx -f --no-hostname -o cat
```


# BitBadges

BitBadges offers tokenization-as-a-service and gating-as-a-service. We are building the best tokenization standard out there because current standards are simply not good enough. Our revolutionary token standard goes far beyond ERC-20, ERC-721, and other existing standards with features like time-dependent ownership, fine-grained transferability controls, multi-chain compatibility, connecting to 7000+ apps, connecting to EVM, IBC, CosmWASM, and more.

* Homepages: <https://bitbadges.io/>
* Explorer: <https://documentation.codeblocklabs.com/blockchain-nodes/bitbadges>

**Social Media**

* X <https://twitter.com/bitbadges_io>
* Telegram <https://t.me/bitbadges_io>
* Discord <https://discord.gg/DyZAc4aXkm>
* Github <https://github.com/bitbadges>

**Minimum Requirements**:

* **CPU**:
  * Core: 4+ (x86\_64 architecture)
* **RAM**: 8Gb+
* **Storage**: 120Gb+ SSD NVME
* **Connection:** 1 Gbps dedicated line
* **Software**:
  * Golang go1.24.1 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

Bitbadges Mainnet

### Step 1: Update & Install Dependencies

```bash
bashsudo apt update && sudo apt upgrade -y
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

### Step 2: Install Golang

```bash
bashcd $HOME
GO_VERSION="1.24.5"
wget "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz"
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"
rm "go${GO_VERSION}.linux-amd64.tar.gz"
[ ! -f ~/.bash_profile ] && touch ~/.bash_profile
echo "export PATH=$PATH:/usr/local/go/bin:~/go/bin" >> ~/.bash_profile
source $HOME/.bash_profile
[ ! -d ~/go/bin ] && mkdir -p ~/go/bin
```

### Step 3: Setup Environment Variables

```bash
bashecho "export BITBADGES_WALLET="wallet"" >> $HOME/.bash_profile
echo "export BITBADGES_MONIKER="test"" >> $HOME/.bash_profile
echo "export BITBADGES_CHAIN_ID="bitbadges-1"" >> $HOME/.bash_profile
echo "export BITBADGES_PORT="13"" >> $HOME/.bash_profile
source $HOME/.bash_profile
```

### Step 4: Install Bitbadges Binary

```bash
bashcd $HOME
mkdir -p $HOME/.bitbadgeschain
wget https://github.com/BitBadges/bitbadgeschain/releases/download/v12/bitbadgeschain-linux-amd64 -O $HOME/go/bin/bitbadgeschaind
chmod +x $HOME/go/bin/bitbadgeschaind
```

```bash
bashcd /usr/lib
sudo curl -L -o libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/releases/download/v1.2.3/libwasmvm.x86_64.so
bash
sudo ldconfig
```

### Step 5: Initialize the Node

```bash
bashbitbadgeschaind init $BITBADGES_MONIKER --chain-id $BITBADGES_CHAIN_ID
```

### Step 6: Download Genesis & Addrbook File

```bash
bashcurl -Ls https://data.winsnip.xyz/list/mainnet/bitbadges/genesis.json > $HOME/.bitbadgeschain/config/genesis.json
curl -Ls https://data.winsnip.xyz/list/mainnet/bitbadges/addrbook.json > $HOME/.bitbadgeschain/config/addrbook.json
```

### Step 7: Configure Node

```bash
bash# Change default ports
sed -i.bak -e "s%:1317%:${BITBADGES_PORT}317%g;
s%:8080%:${BITBADGES_PORT}080%g;
s%:9090%:${BITBADGES_PORT}090%g;
s%:9091%:${BITBADGES_PORT}091%g;
s%:8545%:${BITBADGES_PORT}545%g;
s%:8546%:${BITBADGES_PORT}546%g;
s%:6065%:${BITBADGES_PORT}065%g" $HOME/.bitbadgeschain/config/app.toml

sed -i.bak -e "s%:26658%:${BITBADGES_PORT}658%g;
s%:26657%:${BITBADGES_PORT}657%g;
s%:6060%:${BITBADGES_PORT}060%g;
s%:26656%:${BITBADGES_PORT}656%g;
s%^external_address = \"\"%external_address = \"$(wget -qO- eth0.me):${BITBADGES_PORT}656\"%;
s%:26660%:${BITBADGES_PORT}660%g" $HOME/.bitbadgeschain/config/config.toml
```

### Step 8: Set Pruning & Prometheus

```bash
bashsed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.bitbadgeschain/config/app.toml 
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.bitbadgeschain/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.bitbadgeschain/config/app.toml

sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.bitbadgeschain/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.bitbadgeschain/config/config.toml
```

### Step 9: Create Systemd Service

```bash
bashsudo tee /etc/systemd/system/bitbadgeschaind.service > /dev/null <<EOF
[Unit]
Description=Bitbadges node
After=network-online.target
[Service]
User=$USER
WorkingDirectory=$HOME/.bitbadgeschain
ExecStart=$(which bitbadgeschaind) start --home $HOME/.bitbadgeschain
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
```

### Step 10: Start Service

```bash
bashbitbadgeschaind tendermint unsafe-reset-all --home $HOME/.bitbadgeschain
sudo systemctl daemon-reload
sudo systemctl enable bitbadgeschaind
sudo systemctl restart bitbadgeschaind
```

### Step 11: Monitor Node Status

```bash
bashsudo journalctl -u bitbadgeschaind -fo cat
```


# Useful Command

### 1. Key Management

#### Create a New Wallet

```bash
bashbitbadgeschaind keys add $BITBADGES_WALLET
```

> Keep the generated seed phrase safe. It is the only way to recover your wallet.

#### Recover Wallet from Seed Phrase

```bash
bashbitbadgeschaind keys add $BITBADGES_WALLET --recover
```

> You will be prompted to enter your seed phrase.

#### List Wallets

```bash
bashbitbadgeschaind keys list
```

#### Show Wallet Details

```bash
bashbitbadgeschaind keys show $BITBADGES_WALLET
```

#### Delete Wallet

```bash
bashbitbadgeschaind keys delete $BITBADGES_WALLET
```

### 2. Wallet Operations

#### Check Balance

```bash
bashbitbadgeschaind query bank balances $(bitbadgeschaind keys show $BITBADGES_WALLET -a)
```

#### Send Tokens

```bash
bashbitbadgeschaind tx bank send $(bitbadgeschaind keys show $BITBADGES_WALLET -a) <receiver_wallet_address> <amount><denom> \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
-y
```

> Example:

```bash
bashbitbadgeschaind tx bank send $(bitbadgeschaind keys show $BITBADGES_WALLET -a) bb...yyy 1000000ubadge \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
-y
```

### 3. Validator Management

Ensure you have enough `ubadge` tokens for self-delegation and transaction fees before creating a validator.

#### Create Validator

```bash
bashbitbadgeschaind tx staking create-validator \
--amount 1000000000ubadge \
--from $BITBADGES_WALLET \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--pubkey $(bitbadgeschaind comet show-validator) \
--moniker "YourMoniker" \
--identity "KeybaseKey" \
--website "YourWebsite.com" \
--details "YourDescription" \
--security-contact "youremail@example.com" \
--chain-id $BITBADGES_CHAIN_ID \
--gas auto --gas-adjustment 1.4 --fees 400ubadge \
-y
```

#### Create Validator with json

```bash
bashcd $HOME
# Create validator.json file
echo "{\"pubkey\":{\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"$(bitbadgeschaind comet show-validator | grep -Po '\"key\":\s*\"\K[^"]*')\"},
    \"amount\": \"1000000000000000000ubadge\",
    \"moniker\": \"YourMoniker\",
    \"identity\": \"KeybaseKey\",
    \"website\": \"YourWebsite.com\",
    \"security\": \"youremail@example.com\",
    \"details\": \"YourDescription\",
    \"commission-rate\": \"0.1\",
    \"commission-max-rate\": \"0.2\",
    \"commission-max-change-rate\": \"0.01\",
    \"min-self-delegation\": \"1\"
}" > $HOME/.bitbadgeschain/validator.json

# Create validator
bitbadgeschaind tx staking create-validator $HOME/.bitbadgeschain/validator.json \
--from $BITBADGES_WALLET --chain-id $BITBADGES_CHAIN_ID \
--gas-adjustment 1.4 --gas auto --gas-prices 400ubadge \
-y
```

#### Delegate Tokens

```bash
bashbitbadgeschaind tx staking delegate $(bitbadgeschaind keys show $BITBADGES_WALLET --bech val -a) <amount>ubadge \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
--from $BITBADGES_WALLET \
-y
```

#### Withdraw Rewards (Delegator)

```bash
bashbitbadgeschaind tx distribution withdraw-rewards $(bitbadgeschaind keys show $BITBADGES_WALLET --bech val -a) \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
--from $BITBADGES_WALLET \
-y
```

#### Withdraw Rewards (Validator Commission)

```bash
bashbitbadgeschaind tx distribution withdraw-rewards $(bitbadgeschaind keys show $BITBADGES_WALLET --bech val -a) --commission \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
--from $BITBADGES_WALLET \
-y
```

#### Unbond Tokens

```bash
bashbitbadgeschaind tx staking unbond $(bitbadgeschaind keys show $BITBADGES_WALLET --bech val -a) <amount>ubadge \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
--from $BITBADGES_WALLET \
-y
```

#### Redelegate Tokens

```bash
bashbitbadgeschaind tx staking redelegate $(bitbadgeschaind keys show $BITBADGES_WALLET --bech val -a) <destination_validator_address> <amount>ubadge \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
--from $BITBADGES_WALLET \
-y
```

#### Jail Info

```bash
bashbitbadgeschaind q slashing signing-info $(bitbadgeschaind tendermint show-validator) 
```

#### Unjail Validator

```bash
bashbitbadgeschaind tx slashing unjail \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
--from $BITBADGES_WALLET \
-y
```

### 4. Node Status & Info

#### Check Sync Status

```bash
bashbitbadgeschaind status 2>&1 | jq .SyncInfo
```

#### Check Peer Info

```bash
bashbitbadgeschaind status 2>&1 | jq .SyncInfo.catching_up
bitbadgeschaind status 2>&1 | jq .NodeInfo.listen_addr
```

#### Show Node ID

```bash
bashbitbadgeschaind tendermint show-node-id
```

#### Restart Node

```bash
bashsudo systemctl restart bitbadgeschaind
```

#### View Node Logs

```bash
bashsudo journalctl -u bitbadgeschaind -fo cat
```

### 5. Governance

#### List Proposals

```bash
bashbitbadgeschaind query gov proposals
```

#### View Proposal Details

```bash
bashbitbadgeschaind query gov proposal <proposal_id>
```

#### Vote on Proposal

```bash
bashbitbadgeschaind tx gov vote <proposal_id> <yes|no|no_with_veto|abstain> \
--chain-id $BITBADGES_CHAIN_ID \
--gas-prices 0.025ubadge \
--gas-adjustment 1.5 \
--gas auto \
--from $BITBADGES_WALLET \
-y
```

### 6. Environment Variables

Make sure to set these in your `~/.bash_profile` or equivalent shell config:

```bash
bashexport BITBADGES_WALLET="wallet"
export BITBADGES_MONIKER="YourMoniker"
export BITBADGES_CHAIN_ID="bitbadges-1"
export BITBADGES_PORT="13"
```

Apply the changes with:

```bash
bashsource ~/.bash_profile
```

***

This cheat sheet is provided to streamline Bitbadges Chain validator and wallet management.


# Snapshot

Get synced faster..

```bash
sudo apt update
sudo apt-get install snapd lz4 -y
```

## Chain Snapshots

Create new file with "sudo nano download\_bitbadges.sh"

```
#!/bin/bash

# Config
BACKUP_URL="https://green.codeblocklabs.com/mainnet/bitbadges/"
TARGET_DIR="$HOME/.bitbadgeschain"
LOG_FILE="$HOME/bitbadges_backup.log"

# Get today's and yesterday's dates in YYYY-MM-DD format
TODAY=$(date '+%Y-%m-%d')
YESTERDAY=$(date -d 'yesterday' '+%Y-%m-%d')

# Check if backup exists (today or yesterday)
check_backup() {
    local date=$1
    BACKUP_NAME="backup-${date}.tar.lz4"
    
    # Check if file exists on server
    if curl --output /dev/null --silent --head --fail "${BACKUP_URL}${BACKUP_NAME}"; then
        echo "$BACKUP_NAME"
        return 0
    else
        return 1
    fi
}

# Download and extract backup
download_and_extract() {
    local backup_name="$1"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Found backup: $backup_name" | tee -a "$LOG_FILE"
    
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⬇️ Downloading and extracting..." | tee -a "$LOG_FILE"
    mkdir -p "$TARGET_DIR"
    
    # Stream download → lz4 decompress → tar extract
    if curl -sL "${BACKUP_URL}${backup_name}" | lz4 -c -d - | tar -x -C "$TARGET_DIR"; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Successfully extracted to $TARGET_DIR" | tee -a "$LOG_FILE"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Extraction failed!" | tee -a "$LOG_FILE"
        exit 1
    fi
}

# Main execution
echo "=== Axone Backup Downloader ===" | tee -a "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔍 Checking for today's backup ($TODAY)..." | tee -a "$LOG_FILE"

# Try today's backup first
if BACKUP_NAME=$(check_backup "$TODAY"); then
    download_and_extract "$BACKUP_NAME"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⏳ Today's backup not found. Checking yesterday ($YESTERDAY)..." | tee -a "$LOG_FILE"
    if BACKUP_NAME=$(check_backup "$YESTERDAY"); then
        download_and_extract "$BACKUP_NAME"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ No backup found for today or yesterday!" | tee -a "$LOG_FILE"
        exit 1
    fi
fi
```

Make it executable

```
chmod +x download_bitbadges_backup.sh
```

Run the download snapshot

```
./download_bitbadges_backup.sh
```

After succesfully download snapshot, run the binary by starting the services

```
// Start the nodes on services
sudo systemctl start bitbadgeschaind.service && sudo journalctl -u bitbadgeschaind.service -f --no-hostname -o cat
```


# Elys

Elys is a layer 1 blockchain that brings a suite of Defi products and features fueled by Wallet and Chain Abstraction

* Homepages: <https://elys.network>
* Web App: <https://app.elys.network/>
* Explorer: <https://explorer.codeblocklabs.com/elys> / <https://ping.pub/elys>&#x20;

**Minimum Requirements**:

* **CPU**:
  * Core: 2+
* **RAM**: 4GB+
* **Storage**: 250GB+ SSD/NVME
* **Software**:
  * Golang go1.23.5 - go1.23.5 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

Elys Mainnet Installation

#### Setup Server <a href="#setup" id="setup"></a>

```bash
# Update Packages and Install Prerequisites
sudo apt update && apt upgrade -y
sudo apt install curl git jq lz4 build-essential unzip fail2ban ufw -y
```

```bash
# Set Firewall
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow 9100
```

```bash
# Enable Firewall
sudo ufw enable
```

#### Install Elys Daemon

```
# Install elys through repository
cd $HOME
rm -rf elys
git clone https://github.com/elys-network/elys.git elys
cd elys
git checkout v2.3.0
make install
```

#### Setting Up Your Node

```
# config
elysd config chain-id elys-1
elysd config keyring-backend file

# init, make sure to change your NodeName
elysd init NodeName --chain-id elys-1

# Add Genesis File and Addrbook
curl -Ls https://snapshots.indonode.net/elys/genesis.json > $HOME/.elys/config/genesis.json
curl -Ls https://snapshots.indonode.net/elys/addrbook.json > $HOME/.elys/config/addrbook.json

# Configure Seeds and Peers
PEERS="8186ee0b11f74bb7e28f99b6c27dff498904bb68@185.119.118.114:6000,6a748ef8164e501223c830c0ad79b331a05ef16a@141.94.199.25:36442,ba252ed5b0ee59a80f1c147dc43c27dc17e9a54e@51.83.140.142:30856,e93fbb087acb7c0f8ca850a796310bb745b510b6@23.227.223.249:26656,303c2632596a00cdec34205ab612f33def631b49@195.154.100.227:56656,d71d3bce45274bf8354298042674a08c778f6d27@202.61.243.56:22056,d95bdf717eb751667586b5e31083770630742038@65.109.58.158:22156,c8703ffc49271d7951aebce09e8419f1066b89af@65.108.30.59:32656,1d079e8b757b21b390f3eca0880ca03f7f90d8f0@95.217.143.167:20656,12f932304c5d8c60280cec4bf0dcf4e4b99e454f@169.0.32.67:26656,380048bb45143b2b87c540c772886f5a08bae344@86.90.185.145:26156,36a24ccff963cd7339ec3178e4a5ad33c285d553@149.56.240.152:26656,6aaf6c59af92adde0ef65cdb43ce281609ad348a@37.27.53.176:22056,77b3ee6202e3508f705229bbb068f8199275bd29@65.108.71.137:22056,637077d431f618181597706810a65c826524fd74@65.109.111.111:22056,45afc781e9afa4dfe6db2f2afedd1e476eac2fb3@23.227.222.185:32556,6185b8cbf01c697d116c84378eecc8f433024065@144.76.115.182:26656,d9bfa29e0cf9c4ce0cc9c26d98e5d97228f93b0b@37.27.61.38:15356,b4fca2e4f5c017a817d36b2a8e214b74dc436e7f@65.109.23.55:31126,df2b8a0137aba24ec652ccb8e44a2823a67c56c5@144.76.217.47:26656,b6f3ed7ecefdaad90be7b963ba75eb583c367f0c@135.181.238.225:10056,43699fd956ac02a90aed34ed49b6da125a2b55ab@144.76.217.227:26656,2b8417ec0e27025a10b494a71b92349e5e38487c@65.109.115.172:22056,c5f791d8385a5d7e946f2fc659489fd4c8e51fbd@73.40.158.140:33656,60209d3b252bd07229530d4d64591a181b7f0483@65.109.25.246:31056,89000b116f3f9485ab091b1ab5513b70fc2f9c08@91.134.9.162:22056,9b9dee928a174bcd0272be9127f5f455d418d6b2@102.182.201.193:26656,e1b058e5cfa2b836ddaa496b10911da62dcf182e@164.152.161.168:26656,e726816f42831689eab9378d5d577f1d06d25716@169.155.171.162:26656,b42c60adafb47b19f0b36c58985364a897db6b85@65.109.26.242:22056,db9a5cd7e5adcfad626a416db390567ae0d840b1@149.102.155.91:22056,1af6af8fa99d70c3f3a69ae48d30c8d8a52dbf7b@64.120.114.5:22056,effbd226550543e98baa7c8b3aa0e5b5d6a9a3c6@164.152.161.131:32556,6a7b53154be0d4a161bdc732b0fecdf6c4da810c@65.109.30.116:6000,1da47479beaf73dd16195eb35e56d643ec4c8885@213.239.198.181:46656,36d9c4dcdee38411d680f897481322bcb7e10aa8@65.108.75.179:41656,3f30f68cb08e4dae5dd76c5ce77e6e1a15084346@167.235.21.165:36656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$PEERS\"|" $HOME/.elys/config/config.toml

```

#### Setting Pruning, Minimum Gas Prices and Indexer (Optional)

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
$HOME/.elys/config/app.toml
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.elys/config/config.toml
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.0003uelys\"|" $HOME/.elys/config/app.toml
```

Setup Cosmovisor

```
// install cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest

// make genesis directory
mkdir -p ~/.elys/cosmovisor/genesis/bin
// make upgrades directory
mkdir -p ~/.elys/cosmovisor/upgrades

// get elys daemon location
which elysd
// you should now getting the elysd location, for example like: ~/go/bin/elysd
// copy to genesis directory
cp YourBinaryLocation ~/.elys/cosmovisor/genesis/bin/ 

```

#### Running as services with cosmovisor

<pre><code>// Get your cosmovisor binary location
which cosmovisor
// you should now getting the cosmovisor location, for example like: ~/go/bin/cosmovisor
// save this cosmovisor binary location

// create services
<strong>sudo nano /etc/systemd/system/elysd.service
</strong></code></pre>

{% code title="elysd.service" %}

```
    [Unit] 
    Description=Elys Network node 
    After=network.target

    [Service] 
    Type=simple 
    Restart=on-failure 
    RestartSec=5 
    User=YOUR_USERNAME 
    ExecStart=YOUR_COSMOVISOR_BINARY_LOCATION run start
    LimitNOFILE=65535
    Environment="DAEMON_NAME=elysd"
    Environment="DAEMON_HOME=YOUR_DATA_FOLDER/.elys"
    Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
    Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
    Environment="UNSAFE_SKIP_BACKUP=true"

    [Install] 
    WantedBy=multi-user.target
```

{% endcode %}

\*\*save the file, make sure to change YOUR\_USERNAME, YOUR\_COSMOVISOR\_BINARY\_LOCATION, YOUR\_DATA\_FOLDER.

```
// Reload Daemon
sudo systemctl daemon-reload
// Enable Services
systemctl enable elysd.service
// To check logs, use: journalctl -fu elysdd

```

***

Using Snapshots

```
sudo apt update
sudo apt-get install snapd lz4 -y
```

The latest snapshot : `elys_snapshot_(todaydate).tar.lz4`

`for example filename:` elys\_snapshot\_2025-04-17.tar.lz4

```
// Download
curl -L https://green.codeblocklabs.com/mainnet/elys/elys_snapshot_(todaydate).tar.lz4 | tar -Ilz4 -xf - -C $HOME/.elys

```

{% hint style="info" %}
**Useful Tips**\
*Check Version:* elysd version --long

*CHECK STATUS BINARY:* systemctl status elysd \
*CHECK RUNNING LOGS:* journalctl -fu elysd -o cat \
*CHECK LOCAL STATUS:* curl -s localhost:26657/status | jq .result.sync\_info
{% endhint %}


# Snapshot

```
sudo systemctl stop elys

# Backup priv_validator_state.json
cp $HOME/.elys/data/priv_validator_state.json $HOME/.elys/priv_validator_state.json.backup

# Remove old data and wasm
rm -rf $HOME/.elys/data $HOME/.elys/wasm

# Download and extract Highstakes snapshot (.tar.gz)
curl -L https://green.codeblocklabs.com/mainnet/elys/backup_latest.tar.gz | tar -xz -C $HOME/.elys

# Restore priv_validator_state.json
mv $HOME/.elys/priv_validator_state.json.backup $HOME/.elys/data/priv_validator_state.json

# Restart node
sudo systemctl restart elys && sudo journalctl -u elys -f

```


# Useful Command

Useful set of commands for node operators. From key management to chain governance.

### Key Management <a href="#key" id="key"></a>

Add new key

```bash
elysd keys add wallet
```

Recover existing key

```bash
elysd keys add wallet --recover
```

List All key

```bash
elysd keys list
```

Delete key

```bash
elysd keys delete wallet
```

Export Key (save to wallet.backup)

```bash
elysd keys export wallet
```

Import key

```bash
elysd keys import wallet wallet.backup
```

Query Wallet Balance

```bash
elysd q bank balances $(elysd keys show wallet -a)
```

***

### Validator Management <a href="#validator" id="validator"></a>

Create Validator

```bash
elysd tx staking create-validator \
  --amount "1000000uelys" \
  --pubkey $(elysd tendermint show-validator) \
  --moniker "My Node Name" \
  --identity "My Keybase ID" \
  --details "My Node Details" \
  --website "YOUR WEBSITE" \
  --chain-id elys-1 \
  --commission-rate "0.05" \
  --commission-max-rate "0.2" \
  --commission-max-change-rate "0.01" \
  --min-self-delegation "1" \
  --gas-prices 0.0003uelys \
  --gas "auto" \
  --gas-adjustment "1.5" \
  --from wallet \
  -y
```

Edit Validator

```bash
elysd tx staking edit-validator \
--new-moniker "My Node Name" \
--identity "My Keybase ID" \
--details "My Node Details" \
--website "YOUR WEBSITE" \
--chain-id elys-1 \
--commission-rate "0.05" \
--gas-prices 0.0003uelys \
--gas "auto" \
--gas-adjustment "1.5" \
--from wallet \
-y
```

Unjail Validator

```bash
elysd tx slashing unjail \
--chain-id elys-1 \
--gas-prices 0.0003uelys \
--gas-adjustment 1.5 \
--gas "auto" \
--from wallet \
-y 
```

Signing Info

```bash
elysd query slashing signing-info $(elysd tendermint show-validator) 
```

List all inactive validators

```bash
elysd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " 	 " + .description.moniker' | sort -gr | nl 
```

List all active validators

```bash
elysd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED") or .status=="BOND_STATUS_UNBONDING")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " 	 " + .description.moniker' | sort -gr | nl 
```

View validators details

```bash
elysd q staking validator $(elysd keys show wallet --bech val -a) 

```

***

### Token Management <a href="#token" id="token"></a>

Withdraw rewards from all validators

```bash
elysd tx distribution withdraw-all-rewards --from wallet --chain-id elys-1 --gas-prices 0.0003uelys  --gas-adjustment 1.5 --gas "auto" -y 
```

Withdraw comission and rewards from your validator

```bash
elysd tx distribution withdraw-rewards $(elysd keys show wallet --bech val -a) --commission --from wallet --chain-id elys-1 --gas-prices 0.0003uelys  --gas-adjustment 1.5 --gas "auto" -y 
```

Delegate to your validator

```bash
elysd tx staking delegate $(elysd keys show wallet --bech val -a) 1000000uelys --from wallet --chain-id elys-1 --gas-prices 0.0003uelys  --gas-adjustment 1.5 --gas "auto" -y 
```

Delegate to other

```bash
elysd tx staking delegate TO_VALOPER_ADDRESS 1000000uelys --from wallet --chain-id elys-1 --gas-prices 0.0003uelys  --gas-adjustment 1.5 --gas "auto" -y 
```

Redelegate your stake to other validators

```bash
elysd tx staking redelegate $(elysd keys show wallet --bech val -a) TO_VALOPER_ADDRESS 1000000uelys --from wallet --chain-id elys-1 --gas-prices 0.0003uelys  --gas-adjustment 1.5 --gas "auto" -y 
```

Unbond stake

```bash
elysd tx staking unbond $(elysd keys show wallet --bech val -a) 1000000uelys --from wallet --chain-id elys-1 --gas-prices 0.0003uelys  --gas-adjustment 1.5 --gas "auto" -y 
```

Send tokens

```bash
elysd tx bank send wallet TO_WALLET_ADDREESS 1000000uelys --from wallet --chain-id elys-1 --gas-prices 0.0003uelys  --gas-adjustment 1.5 --gas "auto" -y 
```

### Governance <a href="#governance" id="governance"></a>

Create new text proposal

```bash
elysd tx gov submit-proposal \
--title "New Prosposals" \
--description "Detailed Proposal Information" \
--deposit "1000000uelys" \
--type "Text" \
--from wallet \
--gas-prices 0.0003uelys \ 
--gas-adjustment 1.5 \
--gas "auto" \
-y 
```

List all proposals

```bash
elysd query gov proposals
```

Vote

```bash
elysd tx gov vote PROPOSAL_NUMBER yes \
--from wallet \
--chain-id elys-1 \
--gas-prices 0.0003uelys \
--gas-adjustment 1.5 \
--gas "auto" \
-y 
```

***

### Utility <a href="#utility" id="utility"></a>

Set Indexer to NULL

```bash
sed -i 's|^indexer *=.*|indexer = "null"|' $HOME/.elys/config/config.toml
```

Set Custom Port

```bash
CUSTOM_PORT=13
sed -i.bak -e "s%^proxy_app = "tcp://127.0.0.1:26658"%proxy_app = "tcp://127.0.0.1:${CUSTOM_PORT}658"%; s%^laddr = "tcp://127.0.0.1:26657"%laddr = "tcp://127.0.0.1:${CUSTOM_PORT}657"%; s%^pprof_laddr = "localhost:6060"%pprof_laddr = "localhost:${CUSTOM_PORT}060"%; s%^laddr = "tcp://0.0.0.0:26656"%laddr = "tcp://0.0.0.0:${CUSTOM_PORT}656"%; s%^prometheus_listen_addr = ":26660"%prometheus_listen_addr = ":${CUSTOM_PORT}660"%" $HOME/.elys/config/config.toml
sed -i.bak -e "s%^address = "tcp://0.0.0.0:1317"%address = "tcp://0.0.0.0:${CUSTOM_PORT}317"%; s%^address = ":8080"%address = ":${CUSTOM_PORT}080"%; s%^address = "0.0.0.0:9090"%address = "0.0.0.0:${CUSTOM_PORT}090"%; s%^address = "0.0.0.0:9091"%address = "0.0.0.0:${CUSTOM_PORT}091"%; s%^address = "0.0.0.0:8545"%address = "0.0.0.0:${CUSTOM_PORT}545"%; s%^ws-address = "0.0.0.0:8546"%ws-address = "0.0.0.0:${CUSTOM_PORT}546"%" $HOME/.elys/config/app.toml
```

Get Validator info

```bash
elysd status 2>&1 | jq .ValidatorInfo
```

Get denom info

```bash
elysd q bank denom-metadata -oj | jq
```

Get sync status

```bash
elysd status 2>&1 | jq .SyncInfo.catching_up
```

Get latest height

```bash
elysd status 2>&1 | jq .SyncInfo.latest_block_height
```

Reset Node

```bash
elysd tendermint unsafe-reset-all --home $HOME/.elys --keep-addr-book
```

Delete Node

```bash
cd $HOME && sudo systemctl stop elysd && sudo systemctl disable elysd && sudo rm /etc/systemd/system/elysd.service && sudo systemctl daemon-reload && sudo rm -rf $(which elysd) && sudo rm -rf $HOME/.elys && sudo rm -rf $(which elysd) 
```

***

### Services Management <a href="#services" id="services"></a>

Reload Service

```bash
sudo systemctl daemon-reload
```

Enable Service

```bash
sudo systemctl enable elysd
```

Disable Service

```bash
sudo systemctl disable elysd
```

Start Service

```bash
sudo systemctl start elysd
```

Stop Service

```bash
sudo systemctl stop elysd
```

Restart Service

```bash
sudo systemctl restart elysd
```

Check Service Status

```bash
sudo systemctl status elysd
```

Check Service Logs

```bash
sudo journalctl -u elysd -f --no-hostname -o cat
```


# Empeiria


# Cheatsheet

### ⚙️Service operations <a href="#service-operations" id="service-operations"></a>

Check logs

```
sudo journalctl -fu emped
```

Reload daemon

```
sudo systemctl daemon-reload
```

Enable service

```
sudo systemctl enable emped
```

Disable service

```
sudo systemctl disable emped
```

Start service

```
sudo systemctl start emped
```

Stop service

```
sudo systemctl stop emped
```

Restart service

```
sudo systemctl status emped
```

Check service status

```
sudo systemctl status emped
```

### 🖥️Node operations <a href="#node-operations" id="node-operations"></a>

Overall statusNode infoSync info

```
emped status | jq
```

Node info

```
emped status 2>&1 | jq .NodeInfo
```

Sync info

```
emped status 2>&1 | jq .SyncInfo
```

### 🗝️Key Management <a href="#key-management" id="key-management"></a>

Add new

```
emped keys add $WALLET
```

Restore wallet

```
emped keys add $WALLET --recover
```

List all wallet

```
emped keys list
```

Check balance

```
emped q bank balances $(emped keys show $WALLET -a)
```

### 💱Transaction operations <a href="#transaction-operations" id="transaction-operations"></a>

Withdraw all rewards

```
emped tx distribution withdraw-all-rewards \
--from $WALLET \
--chain-id empe-testnet-2 \
--gas auto \
--gas-adjustment 1.5 \
--fees 20uempe -y
```

Withdraw rewards and commission from your validator

```
emped tx distribution withdraw-rewards $(emped keys show $WALLET --bech val -a) \
--from $WALLET \
--commission \
--chain-id empe-testnet-2 \
--gas auto \
--gas-adjustment 1.5 \
--fees 20uempe -y
```

Self delegate

```
emped tx staking delegate $(emped keys show $WALLET --bech val -a) 1000000uempe \
--from $WALLET \
--chain-id empe-testnet-2 \
--gas auto \
--gas-adjustment 1.5 \
--fees 20uempe -y
```

Redelegate

```
emped tx staking redelegate <FROM_VALOPER_ADDRESS> <TO_VALOPER_ADDRESS> 1000000uempe \
--from $WALLET \
--chain-id empe-testnet-2 \
--gas auto \
--gas-adjustment 1.5 \
--fees 20uempe -y
```

Unbond

```
emped tx staking unbond $(emped keys show $WALLET --bech val -a) 1000000uempe \
--from $WALLET \
--chain-id empe-testnet-2 \
--gas auto --gas-adjustment 1.5 \
--fees 20uempe -y
```

Transfer token

```
emped tx bank send $WALLET <TO_WALLET_ADDRESS> 1000000uempe \
--gas auto \
--gas-adjustment 1.5 \
--fees 20uempe -y
```

### ✅Validator operations <a href="#validator-operations" id="validator-operations"></a>

Unjail Validator

```
emped tx slashing unjail \
--from $WALLET \
--chain-id empe-testnet-2 \
--fees=20uempe -y
```

### 🏛️Governance <a href="#governance" id="governance"></a>

Query Proposal List

```
emped query gov proposals
```

Vote

```
emped tx gov vote 1 yes \
--from $WALLET \
--chain-id empe-testnet-2 \
--gas auto \
--gas-adjustment 1.5 \
--fees=20uempe -y
```

vote value can be `yes`, `no`, `no_with_veto` and `abstain`


# Ethereum

This guide is only for Ethereum Sepolia - Execution & Consensus Node

### System Requirement:

* CPU: 4 Core (minimum), 8 Core (recomended)
* RAM: 16Gb (minimum), 32Gb (recomended)
* Disk: 1Tb (as of this documentation written, it's enough, but it'll increased soon).

Recomended to use vps from: [Contabo VDS](https://lihat.info/contaboVDS), [Hetzner](https://lihat.info/hetzner), [ServaRica](https://lihat.info/servarica)

***

## Installation

### Installing Dependencies:

```
apt -y update && apt -y upgrade
apt-get install coreutils curl iptables build-essential git wget lz4 jq make gcc nano automake autoconf tmux htop nvme-cli libgbm1 pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y
apt dist-upgrade && sudo apt autoremove
```

### Activate Firewall & Open Port:

```
sudo ufw allow 8545/tcp
sudo ufw allow 3500/tcp
sudo ufw allow 4000/tcp
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
sudo ufw allow 12000/udp
sudo ufw allow 13000/tcp
sudo ufw allow 22/tcp
sudo ufw allow 443/tcp
sudo ufw enable
```

```
# To check status of your firewall
sudo ufw status
```

### Add New Users & Group:

```
sudo adduser --home /home/geth --disabled-password --gecos 'Geth Client' geth
sudo adduser --home /home/beacon --disabled-password --gecos 'Prysm Beacon Client' beacon
sudo groupadd eth
sudo usermod -a -G eth geth
sudo usermod -a -G eth beacon
```

### Generate JWT Secret:

```
sudo mkdir -p /var/lib/secrets
```

```
sudo chgrp -R eth /var/lib/ /var/lib/secrets
```

```
sudo chmod 750 /var/lib/ /var/lib/secrets
```

```
sudo openssl rand -hex 32 | tr -d '\n' | sudo tee /var/lib/secrets/jwt.hex > /dev/null
```

```
sudo chown root:eth /var/lib/secrets/jwt.hex
sudo chmod 640 /var/lib/secrets/jwt.hex
```

### Create Directory for `geth` and `beacon`:

```
sudo -u geth mkdir /home/geth/geth
sudo -u beacon mkdir /home/beacon/beacon
```

### Install Ethereum & geth:

```
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
```

```
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.15.11-36b2371c.tar.gz
```

```
tar -xvf geth-linux-amd64-1.15.11-36b2371c.tar.gz
```

```
sudo mv geth-linux-amd64-1.15.11-36b2371c/geth /usr/bin/geth
```

### Create `geth` Service:

```
sudo nano /etc/systemd/system/geth.service
```

```
[Unit]

Description=Geth
After=network-online.target
Wants=network-online.target

[Service]

Type=simple
Restart=always
RestartSec=5s
User=geth
WorkingDirectory=/home/geth
ExecStart=/usr/bin/geth \
  --sepolia \
  --http \
  --http.addr "0.0.0.0" \
  --http.port 8545 \
  --http.api "eth,net,engine,admin" \
  --authrpc.addr "127.0.0.1" --authrpc.port 8551 \
  --http.corsdomain "*" \
  --http.vhosts "*" \
  --datadir /home/geth/geth \
  --authrpc.jwtsecret /var/lib/secrets/jwt.hex

[Install]
WantedBy=multi-user.target
```

#### Start & Enable `geth` Service

```
sudo systemctl daemon-reload
sudo systemctl start geth
sudo systemctl enable geth
```

#### Check `geth` Status:

```
sudo systemctl status geth
```

#### Check `geth` Logs:

```
sudo journalctl -fu geth
```

***

### Create `beacon` Directory & Configure `prysm`:

```
sudo -u beacon mkdir /home/beacon/bin
sudo -u beacon curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output /home/beacon/bin/prysm.sh
sudo -u beacon chmod +x /home/beacon/bin/prysm.sh
```

#### Create `beacon` Service:

```
sudo nano /etc/systemd/system/beacon.service
```

```
[Unit]

Description=Prysm Beacon
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
Restart=always
RestartSec=5s
User=beacon
ExecStart=/home/beacon/bin/prysm.sh beacon-chain \
  --sepolia \
  --http-modules=beacon,config,node,validator \
  --rpc-host=0.0.0.0 --rpc-port=4000 \
  --grpc-gateway-host=0.0.0.0 --grpc-gateway-port=3500 \
  --datadir /home/beacon/beacon \
  --execution-endpoint=http://127.0.0.1:8551 \
  --jwt-secret=/var/lib/secrets/jwt.hex \
  --checkpoint-sync-url=https://checkpoint-sync.sepolia.ethpandaops.io/ \
  --genesis-beacon-api-url=https://checkpoint-sync.sepolia.ethpandaops.io/ \
  --accept-terms-of-use

[Install]
WantedBy=multi-user.targe
```

#### Start & Enable `beacon` Service:

```
sudo systemctl daemon-reload
sudo systemctl start beacon
sudo systemctl enable beacon
```

#### Check `beacon` Status:

```
sudo systemctl status beacon
```

#### Check `beacon` Logs:

```
sudo journalctl -fu beacon
```

**\*wait until both of `geth` and `beacon` are fully synced (could take a few hours or even a day).**

***

### You can check your sync by running this script:

```
nano sync.sh
```

Insert code below

```
#!/bin/bash

echo "=== GETH SYNC STATUS ==="
curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' \
     -H "Content-Type: application/json" http://localhost:8545 | jq

echo ""
echo "=== BEACON SYNC STATUS ==="
curl -s http://localhost:3500/eth/v1/node/syncing | jq
```

```
# Change File Access
chmod +x sync.sh
```

To check the sync status, use command below:

```
./sync.sh
```

After synced, your ethereum sepolia Execution & Consensus Node RPC are ready to use.


# Intento

This is only for intento governor not the validator.

### Unlock Cross-chain Automation with Security at Its Core

Seamlessly manage cross-chain operations with our IBC-powered blockchain, designed for secure and efficient execution.

{% content-ref url="/pages/cKUoJc6jeoJLEupcKYvP" %}
[Installation](/blockchain-nodes/intento/installation)
{% endcontent-ref %}

For running validator it's Recomended to use vps from: [Contabo VDS](https://lihat.info/contaboVDS), [Hetzner](https://lihat.info/hetzner), [ServaRica](https://lihat.info/servarica)\
follow the official documentation on <https://github.com/trstlabs/networks/tree/main/mainnet/intento-1>


# Installation

Governor Tutorial Only!

{% hint style="info" %}
You'll need 1,2 INTO tokens to start
{% endhint %}

**Setup the Cli**

```
// install Go
sudo rm -rvf /usr/local/go/
wget https://golang.org/dl/go1.23.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz
rm go1.23.4.linux-amd64.tar.gz

// configure Go
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export GO111MODULE=on
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin

// setup the intento cli
git clone https://github.com/trstlabs/intento intento
cd intento
git checkout v1.0.1
make install
```

**Create validator data**

```
// init , change [moniker] to your nodes name
intentod init [moniker] --chain-id intento-1

// grab your key, copy all data shown after command entered.
// example: {"@type":"/cosmos.crypto.ed25519.PubKey","key":"fCUIxxxxxxxxxxxxxxxxx="}
intentod cometbft show-validator

// create validatordata.json
sudo nano validatordata.json
```

\*enter script below for validatordata.json

```
// validatordata.json
{
    "pubkey": {"@type":"/cosmos.crypto.ed25519.PubKey","key":"YOURKEY_HERE="},
    "amount": "1200000uinto",
    "moniker": "YOUR_GOVERNOR_NAME",
    "identity": "YOUR_KEYBASE",
    "website": "YOUR_WEBSITE",
    "security": "YOUR_EMAIL",
    "details": "YOUR_NODES_DETAILS",
    "commission-rate": "0.1",
    "commission-max-rate": "0.1",
    "commission-max-change-rate": "0.05",
    "min-self-delegation": "1"
}
```

CTRL+X , Y , Enter to save.

**Create / Import Your Wallet and fill it with some INTO tokens.**

```
// Add Wallet
intentod keys add wallet

// OR //

// Import Wallet
intentod keys add wallet --recover
// then insert your phrase
```

**Deploy Governor**

```
// Deploy
intentod tx staking create-validator validatordata.json --from wallet --chain-id intento-1 --gas auto --gas-adjustment 2 --node https://rpc.intento.ccnodes.com/ --fees auto --gas auto
```

{% hint style="info" %}
In this case i'm using ccnodes rpc, you can use any public intento rpc. ofcourse you can also use your own intento rpc. \
Running Intento RPC nodes aren't required for governor, but you may/may not receive delegation from team if not running complete services.
{% endhint %}


# JayNetwork

A Layer-1 blockchain built on Cosmos SDK with CosmWasm smart contracts, IBC interoperability, and instant finality.

Official Website: <https://thejaynetwork.com/>&#x20;

We use these providers for all nodes:\
Contabo [https://Lihat.info/contabo](https://lihat.info/contabo)\
Vultr [https://Lihat.info/vultr](https://lihat.info/vultr)\
Servarica [https://Lihat.info/servarica](https://lihat.info/servarica)\
VPSAG [https://Lihat.info/vpsag](https://lihat.info/vpsag)\
Hetzner [https://Lihat.info/hetzner](https://lihat.info/hetzner)


# Installation

```bash
# Install Dependencies
sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

```bash
# install go, if needed
cd $HOME
sudo rm -rf /usr/local/go
VER="1.24.5"
curl -Ls https://go.dev/dl/go$VER.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
mkdir -p ~/go/bin
go version
```

```bash
# Download Binary
cd $HOME
mkdir -p ~/go/bin
wget https://github.com/bbtccore/thejaynetwork/releases/download/v3-static/jaynd-linux-amd64 -O jaynd
chmod +x jaynd
mv jaynd ~/go/bin/
```

```bash
# config and init app
jaynd init "Your_Nodes_Name" --chain-id thejaynetwork
```

```bash
# download genesis and addrbook
wget -O $HOME/.jayn/config/genesis.json https://backup.codeblocklabs.com/thejaynetwork/genesis.json
wget -O $HOME/.jayn/config/addrbook.json https://backup.codeblocklabs.com/thejaynetwork/addrbook.json
```

```bash
# Set custom ports in app.toml
sed -i -e "s%:1317%:11117%; s%:8080%:11180%; s%:9090%:11190%; s%:9091%:11191%; s%:8545%:11145%; s%:8546%:11146%; s%:6065%:11165%" $HOME/.jayn/config/app.toml
sed -i -e "s%:26658%:11158%; s%:26657%:11157%; s%:6060%:11160%; s%:26656%:11156%; s%:26660%:11160%" $HOME/.jayn/config/config.toml
sed -i -e "s|^node *=.*|node = \"tcp://localhost:11157\"|" $HOME/.jayn/config/client.toml
```

```bash
# config pruning
pruning="custom"
pruning_keep_every="0"
pruning_keep_recent="100"
pruning_interval="19"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.jayn/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.jayn/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.jayn/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.jayn/config/app.toml
```

```bash
# set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.025ujay\"|" $HOME/.jayn/config/app.toml
```

```bash
# set persistent peers
peers="218942ae4b1d1d8ab6517b06e0828198a0867bb1@65.21.234.111:18256,ba900c17cfcc187e374323ff31016b178d088d55@89.58.24.232:26656,9951f5546f067ed877dc425fadc98e234e0480c1@152.53.195.74:26656"
sed -i -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.jayn/config/config.toml
```

```bash
# Disable indexing
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.jayn/config/config.toml
```

{% tabs %}
{% tab title="Cosmovisor" %}

<pre><code><strong>mkdir -p $HOME/.jayn/cosmovisor/genesis/bin
</strong>mv $HOME/go/bin/jaynd $HOME/.jayn/cosmovisor/genesis/bin/

# Create symlinks
sudo ln -s $HOME/.jayn/cosmovisor/genesis $HOME/.jayn/cosmovisor/current -f
sudo ln -s $HOME/.jayn/cosmovisor/current/bin/jaynd /usr/local/bin/jaynd -f

# Install cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.7.0

# Create systemd service
sudo tee /etc/systemd/system/jaynd.service > /dev/null &#x3C;&#x3C; EOF
[Unit]
Description=jayn node service
After=network-online.target

[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.jayn"
Environment="DAEMON_NAME=jaynd"
Environment="UNSAFE_SKIP_BACKUP=true"

[Install]
WantedBy=multi-user.target
EOF
</code></pre>

{% endtab %}

{% tab title="Non Cosmovisor" %}

```
sudo tee /etc/systemd/system/republicd.service > /dev/null <<EOF
[Unit]
Description=Republic node
After=network-online.target
[Service]
User=$USER
WorkingDirectory=$HOME/.republic
ExecStart=$(which republicd) start --home $HOME/.republic
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
```

{% endtab %}
{% endtabs %}

```bash
# # enable and start service
sudo systemctl daemon-reload
sudo systemctl enable jaynd
sudo systemctl restart jaynd && sudo journalctl -u jaynd -f
```


# State Sync

```plaintext
sudo systemctl stop jaynd
```

```plaintext
cp $HOME/.jayn/data/priv_validator_state.json $HOME/.jayn/priv_validator_state.json.backup
```

```plaintext
jaynd comet unsafe-reset-all --home $HOME/.jayn --keep-addr-book
```

```plaintext
SNAP_RPC="http://152.53.195.5:26657"
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000))
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)
sed -i \
-e "s|^enable *=.*|enable = true|" \
-e "s|^rpc_servers *=.*|rpc_servers = \"$SNAP_RPC,$SNAP_RPC\"|" \
-e "s|^trust_height *=.*|trust_height = $BLOCK_HEIGHT|" \
-e "s|^trust_hash *=.*|trust_hash = \"$TRUST_HASH\"|" \
$HOME/.jayn/config/config.toml
```

```plaintext
mv $HOME/.jayn/priv_validator_state.json.backup $HOME/.jayn/data/priv_validator_state.json
```

```plaintext
sudo systemctl restart jaynd && sudo journalctl -u jaynd -f
```


# Useful Command

Wallet

```bash
# to create a new wallet, use the following command. don’t forget to save the mnemonic
republicd keys add wallet

# to restore exexuting wallet, use the following command
republicd keys add wallet --recover

# check sync status, once your node is fully synced, the output from above will print "false"
republicd status 2>&1 | jq .sync_info
```

Create Validator File

```bash
# Write your validator configuration.
tee $HOME/validator.json > /dev/null << EOF
{
	"pubkey": $(republicd comet show-validator),
	"amount":  "1000000arai",
	"moniker": "Your_Nodes_Name",
	"identity": "Your_Keybase",
	"website": "Your_Website",
	"details": "Your_Detail",
	"commission-rate": "0.05",
	"commission-max-rate": "0.2",
	"commission-max-change-rate": "0.05",
	"min-self-delegation": "1"
}
EOF
```

Deploy Validator From File

```bash
republicd tx staking create-validator $HOME/validator.json --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

<br>

Remove Node

```bash
sudo systemctl stop republicd
sudo systemctl disable republicd
sudo rm -rf /etc/systemd/system/republicd.service
sudo rm $(which republicd)
sudo rm -rf $HOME/.republic
```


# Key Management

Add New Wallet

```bash
jaynd keys add wallet
```

Restore executing wallet

```bash
jaynd keys add wallet --recover
```

List All Wallets

```bash
jaynd keys list
```

Delete wallet

```bash
jaynd keys delete wallet
```

Check Balance

```bash
jaynd q bank balances $(jaynd keys show wallet -a)
```

Export Key (save to wallet.backup)

```bash
jaynd keys export wallet
```

Export Key to EVM

```bash
jaynd keys export wallet --unarmored-hex --unsafe
```

Import Key (restore from wallet.backup)

```bash
jaynd keys import wallet wallet.backup
```


# Services Management

Check logs

```bash
sudo journalctl -u jaynd -f
```

Sync info

```bash
jaynd status 2>&1 | jq .sync_info
```

Node info

```bash
jaynd status 2>&1 | jq .node_info
```

Your node peer

```bash
echo $(jaynd comet show-node-id)'@'$(wget -qO- eth0.me)':'$(cat $HOME/.jayn/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

Restart Nodes

<pre><code><strong>sudo systemctl restart jaynd &#x26;&#x26; sudo journalctl -u jaynd -f
</strong></code></pre>


# Token Management

Withdraw all rewards

```bash
jaynd tx distribution withdraw-all-rewards --from wallet --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay
```

Withdraw rewards and commission from your validator

```bash
jaynd tx distribution withdraw-rewards $(jaynd keys show wallet --bech val -a) --from wallet --commission --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Check your balance

```bash
jaynd query bank balances $(jaynd keys show wallet -a)
```

Delegate to Yourself

```bash
jaynd tx staking delegate $(jaynd keys show wallet --bech val -a) 1000000ujay --from wallet --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Delegate to Other Validator

```bash
jaynd tx staking delegate VALOPER_ADDRESS 1000000ujay --from wallet --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Redelegate Stake to Another Validator

```bash
jaynd tx staking redelegate $(jaynd keys show wallet --bech val -a) VALOPER_ADDRESS 1000000ujay --from wallet --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Unbond

```bash
jaynd tx staking unbond $(jaynd keys show wallet --bech val -a) 1000000ujay --from wallet --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Transfer Funds

```bash
jaynd tx bank send $(jaynd keys show wallet -a) WALLET_ADDRESS 1000000ujay --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

<br>


# Validator Management

Edit Existing Validator

```bash
jaynd tx staking edit-validator \
--commission-rate 0.1 \
--new-moniker "YOUR_NODES_NAME" \
--identity "YOUR_KEYBASE" \
--details "YOUR_DETAIL" \
--from wallet \
--chain-id thejaynetwork \
--gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay \
-y
```

Validator info

```bash
jaynd status 2>&1 | jq .validator_info
```

Validator Details

```bash
jaynd q staking validator $(jaynd keys show wallet --bech val -a)
```

Jailing info

```bash
jaynd q slashing signing-info $(jaynd comet show-validator)
```

Slashing parameters

```bash
jaynd q slashing params
```

Unjail validator

```bash
jaynd tx slashing unjail --from wallet --chain-id thejaynetwork --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Active Validators List

```bash
jaynd q staking validators -oj --limit=2000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " 	 " + .description.moniker' | sort -gr | nl
```

Check Validator key

```bash
[[ $(jaynd q staking validator $(jaynd keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(republicd status 2>&1 | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "Your key status is ok" || echo -e "Your key status is error"
```

Signing info

```bash
jaynd q slashing signing-info $(jaynd comet show-validator)
```


# Governance

Create New Text Proposal

```bash
jaynd  tx gov submit-proposal \
--title "Governance" \
--description "DETAIL" \
--deposit 1000000arai \
--type Text \
--from wallet \
--chain-id thejaynetwork \
--gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay \
-y 
```

Proposals List

```bash
jaynd query gov proposals
```

View proposal

```bash
jaynd query gov proposal 1
```

Vote Yes

```bash
jaynd tx gov vote 1 yes --from wallet --chain-id thejaynetwork  --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Vote No

```bash
jaynd tx gov vote 1 no --from wallet --chain-id thejaynetwork  --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```

Vote No With Veto

```bash
jaynd tx gov vote 1 no_with_veto --from wallet --chain-id thejaynetwork  --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Vote Abstain

```bash
jaynd tx gov vote 1 abstain --from wallet --chain-id thejaynetwork  --gas auto --gas-adjustment 1.5  --gas-prices 0.025ujay -y
```


# LayerEdge

LayerEdge is the first decentralized network that enhances the capabilities of Bitcoin Blockspace with ZK & BitVM, enabling every layer to be secured on Bitcoin.

### Why LayerEdge? <a href="#why-layeredge" id="why-layeredge"></a>

Imagine Bitcoin not just as a store of value, but as a decentralized supercomputer capable of verifying vast computations without ever executing them directly. **LayerEdge enables this by allowing verifiable, off-chain execution powered by Bitcoin’s Proof-of-Work (PoW) security.** Rather than forcing Bitcoin to perform every transaction, LayerEdge makes it possible to aggregate and verify proofs at a fraction of cost.

The benefits don’t stop with financial transactions. The applications of ZK proofs extend far beyond finance. From artificial intelligence (AI) to the Internet of Things (IoT) like DePIN, verifiable computation is essential for ensuring trust in decentralized systems. With LayerEdge, Bitcoin’s computational security can now support these emerging technologies, transforming it from a passive financial asset to a backbone of verifiable trust for the decentralized internet.


# Installation

**Step 1: Clone the Light Node Repository**

```
git clone https://github.com/Layer-Edge/light-node.git
cd light-node
```

**Step 2: Install Required Dependencies**

Ensure the following dependencies are installed:

* **Go**: Version 1.18 or higher
* **Rust**: Version 1.81.0 or higher&#x20;

  <pre data-full-width="true"><code>curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  </code></pre>
* **Risc0 Toolchain**: If not installed, run:

  <pre data-full-width="true"><code>curl -L https://risczero.com/install | bash &#x26;&#x26; rzup install
  </code></pre>
* **LayerEdge gRPC Endpoint**: Ensure access to a LayerEdge node for seamless communication.

**Step 3: Configure Environment Variables**

Set up the required environment variables in your terminal session or add them to a `.env` file:

```
GRPC_URL=grpc.testnet.layeredge.io:9090
CONTRACT_ADDR=cosmos1ufs3tlq4umljk0qfe8k5ya0x6hpavn897u2cnf9k0en9jr7qarqqt56709
ZK_PROVER_URL=http://127.0.0.1:3001
# Alternatively:
ZK_PROVER_URL=https://layeredge.mintair.xyz/
API_REQUEST_TIMEOUT=100
POINTS_API=https://light-node.layeredge.io
PRIVATE_KEY='cli-node-private-key'
```

Ensure that the `ZK_PROVER_URL` matches the server where the Merkle service is running.

**Step 4: Start the Merkle Service**

Before running the Light Node, start the Merkle service:

```
cd risc0-merkle-service
cargo build && cargo run
```

Wait until the Merkle service is fully initialized before proceeding.

**Step 5: Build and Run the LayerEdge Light Node**

In a separate terminal window, navigate to the root directory and execute:

```
go build
./light-node
```

Ensure that the Light Node is running **independently** and correctly **connected** to the Merkle service.

***

#### **Connecting CLI Node with LayerEdge Dashboard** <a href="#connecting-cli-node-with-layeredge-dashboard" id="connecting-cli-node-with-layeredge-dashboard"></a>

To link your CLI node with the dashboard for **analytics**:

**Fetch Points via CLI**

```
https://light-node.layeredge.io/api/cli-node/points/{walletAddress}
```

Replace `{walletAddress}` with your **actual CLI wallet address**.

**Connect to Dashboard**

1. Navigate to [dashboard.layeredge.io](https://dashboard.layeredge.io/)
2. Connect your wallet
3. Link your CLI node’s Public Key

**Important Notes:**

* One CLI wallet **can only** link to one dashboard wallet.
* Linking is **mandatory**, even if the CLI and dashboard wallets are identical.

**Dashboard Monitoring Features**

* **Node status** (Active/Inactive)
* **Points tracking & detailed analytics**

***

#### **Logging & Monitoring** <a href="#logging-and-monitoring" id="logging-and-monitoring"></a>

The node provides comprehensive logs for:

* **Merkle tree discovery**
* **ZK proof generation and verification**
* **Submission status**
* **Performance optimizations** (tree sleep state)

***

#### **Security Best Practices** <a href="#security-best-practices" id="security-best-practices"></a>

* Always store keys, mnemonics, and AUTHKEY offline.
* Utilize firewall protections and secure SSH configurations.
* Regularly update nodes from official LayerEdge sources.

***

#### **Troubleshooting Common Issues** <a href="#troubleshooting-common-issues" id="troubleshooting-common-issues"></a>

**Issue:** gRPC connection is inactive. **Solution:** Verify gRPC connection settings.

**Issue:** Risc0 prover service is not running. **Solution:** Restart the prover service and check logs.

**Issue:** Incorrect wallet or signature configurations. **Solution:** Double-check wallet addresses and environment variables.

Consult detailed logs for more specific errors.


# Automation

To keep the provers restart when it's died.

Create new file auto.sh

```
sudo nano auto.sh
```

Paste Code below to the file and save the file with CTRL+X , Y and Enter

```
#!/bin/bash

# Path to the light-node executable
LIGHT_NODE="./light-node"

# Infinite loop to keep the script running
while true; do
    # Run the light-node
    $LIGHT_NODE

    # Check the exit status of the light-node
    if [ $? -eq 0 ]; then
        echo "light-node exited normally. Restarting in 5 seconds..."
    else
        echo "light-node crashed or exited with an error. Restarting in 5 seconds..."
    fi

    # Wait for 5 seconds before restarting
    sleep 5
done
```

Give permission to the file auto.sh

```
chmod +x auto.sh
```

Run the automation

```
./auto.sh
```


# Lumera

Lumera Testnet

The Lumera Protocol is a layer-1 blockchain that provides developers and users with critical tools to elevate projects to the next level.

* Homepages: <https://lumera.io/>
* Explorer: <https://explorer.codeblocklabs.com/lumera-testnet>

**Social Media**

* X <https://x.com/lumeraprotocol>
* Reddit <https://www.reddit.com/r/LumeraProtocol/?rdt=58979>
* Discord <https://discord.com/invite/lumeraprotocol>
* Youtube <https://www.youtube.com/@lumeraprotocol>
* Github <https://github.com/LumeraProtocol/>

**Minimum Requirements**:

* **CPU**:
  * Core: 4+ (x86\_64 architecture)
* **RAM**: 8Gb+
* **Storage**: 120Gb+ SSD NVME
* **Connection:** 1 Gbps dedicated line
* **Software**:
  * Golang go1.24.2 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

Lumera Testnet

Installation

```
// Install Dependencies
sudo apt-get update
sudo apt-get install curl git jq lz4 build-essential
sudo apt-get upgrade

// Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.2.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | tee -a $HOME/.profile)

// Download binaries
mkdir -p $HOME/.lumera/cosmovisor/genesis/bin
wget -O $HOME/.lumera/cosmovisor/genesis/bin/lumerad https://green.codeblocklabs.com/testnet/lumera/lumerad_v1.0.1-linux-amd64
chmod +x $HOME/.lumera/cosmovisor/genesis/bin/lumerad

// Download Libraries Needed
wget -O /usr/lib/libwasmvm.x86_64.so https://green.codeblocklabs.com/testnet/lumera/libwasmvm.x86_64.so

// Create application symlinks
ln -s $HOME/.lumera/cosmovisor/genesis $HOME/.lumera/cosmovisor/current -f
sudo ln -s $HOME/.lumera/cosmovisor/current/bin/lumerad /usr/local/bin/lumerad -f
```

***

## Setting Up Services

```
# Download and install Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.6.0

# Create service
sudo tee /etc/systemd/system/lumera.service > /dev/null << EOF
[Unit]
Description=lumera node service
After=network-online.target

[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.lumera"
Environment="DAEMON_NAME=lumerad"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:$HOME/.lumera/cosmovisor/current/bin"

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable lumera.service

```

***

## Setting Up Nodes

```
# Set node configuration
lumerad config chain-id lumera-testnet-1
lumerad config keyring-backend test
lumerad config node tcp://localhost:10069

# Initialize the node
lumerad init YourNodesName --chain-id lumera-testnet-1

# Download genesis and addrbook
curl -Ls https://green.codeblocklabs.com/testnet/lumera/genesis.json > $HOME/.lumera/config/genesis.json
curl -Ls https://green.codeblocklabs.com/testnet/lumera/addrbook.json > $HOME/.lumera/config/addrbook.json

# Add seeds
sed -i -e "s|^seeds *=.*|seeds = \"6b552c8ebdbffee1394a5d9974ab05c45cdba843@135.181.238.225:16956\"|" $HOME/.lumera/config/config.toml

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.025ulume\"|" $HOME/.lumera/config/app.toml

# Set pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.lumera/config/app.toml

# Set custom ports
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:16958\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:16957\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:16960\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:16956\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":16966\"%" $HOME/.lumera/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:16917\"%; s%^address = \":8080\"%address = \":16980\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:16990\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:16991\"%; s%:8545%:16945%; s%:8546%:16946%; s%:6065%:16965%" $HOME/.lumera/config/app.toml

```

## Chain Snapshots

```
curl -L https://green.codeblocklabs.com/testnet/lumera/snapshot_latest.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.lumera
[[ -f $HOME/.lumera/data/upgrade-info.json ]] && cp $HOME/.lumera/data/upgrade-info.json $HOME/.lumera/cosmovisor/genesis/upgrade-info.json
```

```
// Start the nodes on services
sudo systemctl start lumera.service && sudo journalctl -u lumera.service -f --no-hostname -o cat
```


# Useful Command

Useful set of commands for node operators. From key management to chain governance.

### 🔑 Key management <a href="#key-management" id="key-management"></a>

**Add new key**

```
lumerad keys add wallet
```

**Recover existing key**

```
lumerad keys add wallet --recover
```

**List all keys**

```
lumerad keys list
```

**Delete key**

```
lumerad keys delete wallet
```

**Export key to a file**

```
lumerad keys export wallet
```

**Import key from a file**

```
lumerad keys import wallet wallet.backup
```

**Query wallet balance**

```
lumerad q bank balances $(lumerad keys show wallet -a)
```

### 👷 Validator management <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

**Create new validator**

```
lumerad tx staking create-validator <(cat <<EOF
{
  "pubkey": $(lumerad comet show-validator),
  "amount": "1000000ulume",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id lumera-testnet-1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025ulume \
-y
```

**Edit existing validator**

```
lumerad tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id lumera-testnet-1 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025ulume \
-y
```

**Unjail validator**

```
lumerad tx slashing unjail --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Jail reason**

```
lumerad query slashing signing-info $(lumerad comet show-validator)
```

**List all active validators**

```
lumerad q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**List all inactive validators**

```
lumerad q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**View validator details**

```
lumerad q staking validator $(lumerad keys show wallet --bech val -a)
```

### 💲 Token management <a href="#token-management" id="token-management"></a>

**Withdraw rewards from all validators**

```
lumerad tx distribution withdraw-all-rewards --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Withdraw commission and rewards from your validator**

```
lumerad tx distribution withdraw-rewards $(lumerad keys show wallet --bech val -a) --commission --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Delegate tokens to yourself**

```
lumerad tx staking delegate $(lumerad keys show wallet --bech val -a) 1000000ulume --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Delegate tokens to validator**

```
lumerad tx staking delegate <TO_VALOPER_ADDRESS> 1000000ulume --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Redelegate tokens to another validator**

```
lumerad tx staking redelegate $(lumerad keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000ulume --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Unbond tokens from your validator**

```
lumerad tx staking unbond $(lumerad keys show wallet --bech val -a) 1000000ulume --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Send tokens to the wallet**

```
lumerad tx bank send wallet <TO_WALLET_ADDRESS> 1000000ulume --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

### 🗳 Governance <a href="#governance" id="governance"></a>

**List all proposals**

```
lumerad query gov proposals
```

**View proposal by id**

```
lumerad query gov proposal 1
```

**Vote ‘Yes’**

```
lumerad tx gov vote 1 yes --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Vote ‘No’**

```
lumerad tx gov vote 1 no --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Vote ‘Abstain’**

```
lumerad tx gov vote 1 abstain --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

**Vote ‘NoWithVeto’**

```
lumerad tx gov vote 1 NoWithVeto --from wallet --chain-id lumera-testnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ulume -y
```

### ⚡️ Utility <a href="#utility" id="utility"></a>

**Update ports**

```
CUSTOM_PORT=110
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.lumera/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}90\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}91\"%" $HOME/.lumera/config/app.toml
```

**Update Indexer**

**Disable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.lumera/config/config.toml
```

**Enable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "kv"|' $HOME/.lumera/config/config.toml
```

**Update pruning**

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.lumera/config/app.toml
```

### 🚨 Maintenance <a href="#maintenance" id="maintenance"></a>

**Get validator info**

```
lumerad status 2>&1 | jq .ValidatorInfo
```

**Get sync info**

```
lumerad status 2>&1 | jq .SyncInfo
```

**Get node peer**

```
echo $(lumerad comet show-node-id)'@'$(curl -4s ifconfig.me)':'$(cat $HOME/.lumera/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

**Check if validator key is correct**

```
[[ $(lumerad q staking validator $(lumerad keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(lumerad status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
```

**Get live peers**

```
curl -sS http://localhost:16957/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}'
```

**Set minimum gas price**

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025ulume\"/" $HOME/.lumera/config/app.toml
```

**Enable prometheus**

```
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.lumera/config/config.toml
```

**Reset chain data**

```
lumerad comet unsafe-reset-all --keep-addr-book --home $HOME/.lumera --keep-addr-book
```

**Remove node**

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```
cd $HOME
sudo systemctl stop lumera.service
sudo systemctl disable lumera.service
sudo rm /etc/systemd/system/lumera.service
sudo systemctl daemon-reload
rm -f $(which lumerad)
rm -rf $HOME/.lumera
rm -rf $HOME/lumera
```

### ⚙️ Service Management <a href="#service-management" id="service-management"></a>

**Reload service configuration**

```
sudo systemctl daemon-reload
```

**Enable service**

```
sudo systemctl enable lumera.service
```

**Disable service**

```
sudo systemctl disable lumera.service
```

**Start service**

```
sudo systemctl start lumera.service
```

**Stop service**

```
sudo systemctl stop lumera.service
```

**Restart service**

```
sudo systemctl restart lumera.service
```

**Check service status**

```
sudo systemctl status lumera.service
```

**Check service logs**

```
sudo journalctl -u lumera.service -f --no-hostname -o cat
```


# Snapshot

Get synced faster and easy.

```bash
sudo apt update
sudo apt-get install snapd lz4 -y
```

```bash
# Stop the service and reset the data
sudo systemctl stop lumerad
cp $HOME/.lumera/data/priv_validator_state.json $HOME/.lumera/priv_validator_state.json.backup
rm -rf $HOME/.lumera/data
```

```bash
# Download Latest Snapshot
curl -L https://green.codeblocklabs.com/testnet/lumera/snapshot_latest.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.lumera
mv $HOME/.lumera/priv_validator_state.json.backup $HOME/.lumera/data/priv_validator_state.json
```

```bash
# Restart chain
sudo systemctl start lumerad && sudo journalctl -u lumerad -f -o cat
```


# Odiseo

Odiseo Testnet

ODISEO is an Open Ledger shared by the network of existing real estate development projects. It is a transparent environment where all parties can access reliable information about the assets under development.

<figure><img src="/files/e7gpTw7p9VFLH99FEyLh" alt=""><figcaption><p>what is odiseo</p></figcaption></figure>

* Homepages: <https://daodiseo.money/>
* Explorer: <https://explorer.codeblocklabs.com/odiseo-testnet/staking>

**Social Media**

* Telegram <https://t.me/+hDCihbTGG1w3M2E6>
* Github <https://github.com/DAODISEOmoney>

**Minimum Requirements**:

* **CPU**:
  * Core: 4+ (x86\_64 architecture)
* **RAM**: 8Gb+
* **Storage**: 120Gb+ SSD NVME
* **Connection:** 1 Gbps dedicated line
* **Software**:
  * Golang go1.24.2 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

Lumera Testnet

Installation

```
// Install Dependencies
sudo apt-get update
sudo apt update && sudo apt upgrade -y && sudo apt install curl tar wget clang pkg-config libssl-dev jq build-essential bsdmainutils git make ncdu gcc git jq chrony liblz4-tool -y
sudo apt-get upgrade

// Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.2.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | tee -a $HOME/.profile)

// Download binaries
cd $HOME
rm -rf Achilles
git clone https://github.com/daodiseomoney/Achilles.git
cd Achilles/achilles
git checkout v1.0.1
make install

mkdir -p $HOME/.achilles/cosmovisor/genesis/bin
wget -O $HOME/.achilles/cosmovisor/genesis/bin/achillesd https://green.codeblocklabs.com/testnet/odiseo/achillesd
chmod +x $HOME/.achilles/cosmovisor/genesis/bin/achillesd 

// Create application symlinks
ln -s $HOME/.achilles/cosmovisor/genesis $HOME/.achilles/cosmovisor/current -f
sudo ln -s $HOME/.achilles/cosmovisor/current/bin/achillesd /usr/local/bin/achilles -f
```

***

## Setting Up Services

```
# Download and install Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.6.0

# Create service
sudo tee /etc/systemd/system/achilles.service > /dev/null << EOF
[Unit]
Description=odiseo node service
After=network-online.target

[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.achilles"
Environment="DAEMON_NAME=achillesd"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:$HOME/.lumera/cosmovisor/current/bin"

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable lumera.service

```

***

## Setting Up Nodes

```
# Set node configuration
lumerad config chain-id ithaca-1
lumerad config keyring-backend test
lumerad config node tcp://localhost:10049

# Initialize the node
lumerad init YourNodesName --chain-id ithaca-1

# Download genesis and addrbook
curl -Ls https://green.codeblocklabs.com/testnet/odiseo/genesis.json > $HOME/.achilles/config/genesis.json
curl -Ls https://green.codeblocklabs.com/testnet/odiseo/addrbook.json > $HOME/.achilles/config/addrbook.json

# Add seeds
sed -i -e "s|^seeds *=.*|seeds = \"fed2bf1d2ec1714b1fe3889c2379ef72bff74646@135.181.238.225:19156\"|" $HOME/.achilles/config/config.toml

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.25uodis\"|" $HOME/.achilles/config/app.toml

# Set pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.lumera/config/app.toml

# Set custom ports (use any)
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:16958\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:16957\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:16960\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:16956\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":16966\"%" $HOME/.lumera/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:16917\"%; s%^address = \":8080\"%address = \":16980\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:16990\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:16991\"%; s%:8545%:16945%; s%:8546%:16946%; s%:6065%:16965%" $HOME/.lumera/config/app.toml

```

## Chain Snapshots

```
curl -L https://green.codeblocklabs.com/testnet/odiseo/snapshot_latest.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.achilles
```

```
// Start the nodes on services
sudo systemctl start achilles.service && sudo journalctl -u achilles.service -f --no-hostname -o cat
```


# Useful Command

Useful set of commands for node operators. From key management to chain governance.

### 🔑 Key management <a href="#key-management" id="key-management"></a>

**Add new key**

```
achillesd keys add wallet
```

**Recover existing key**

```
achillesd keys add wallet --recover
```

**List all keys**

```
achillesd keys list
```

**Delete key**

```
achillesd keys delete wallet
```

**Export key to a file**

```
achillesd keys export wallet
```

**Import key from a file**

```
achillesd keys import wallet wallet.backup
```

**Query wallet balance**

```
achillesd q bank balances $(achillesd keys show wallet -a)
```

### 👷 Validator management <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

**Create new validator**

```
achillesd tx staking create-validator <(cat <<EOF
{
  "pubkey": $(lumerad comet show-validator),
  "amount": "1000000uodis",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id ithaca-1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.25uodis \
-y
```

**Edit existing validator**

```
achillesd tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id ithaca-1 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.25uodis \
-y
```

**Unjail validator**

```
achillesd tx slashing unjail --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Jail reason**

```
achillesd query slashing signing-info $(achillesd comet show-validator)
```

**List all active validators**

```
achillesd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**List all inactive validators**

```
achillesd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**View validator details**

```
achillesd q staking validator $(achillesd keys show wallet --bech val -a)
```

### 💲 Token management <a href="#token-management" id="token-management"></a>

**Withdraw rewards from all validators**

```
achillesd tx distribution withdraw-all-rewards --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Withdraw commission and rewards from your validator**

```
achillesd tx distribution withdraw-rewards $(achillesd keys show wallet --bech val -a) --commission --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Delegate tokens to yourself**

```
achillesd tx staking delegate $(achillesd keys show wallet --bech val -a) 1000000uodis --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Delegate tokens to validator**

```
achillesd tx staking delegate <TO_VALOPER_ADDRESS> 1000000uodis --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Redelegate tokens to another validator**

```
achillesd tx staking redelegate $(achillesd keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000uodis --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Unbond tokens from your validator**

```
achillesd tx staking unbond $(achillesd  keys show wallet --bech val -a) 1000000uodis --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Send tokens to the wallet**

```
achillesd tx bank send wallet <TO_WALLET_ADDRESS> 1000000uodis--from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

### 🗳 Governance <a href="#governance" id="governance"></a>

**List all proposals**

```
achillesd query gov proposals
```

**View proposal by id**

```
achillesd query gov proposal 1
```

**Vote ‘Yes’**

```
achillesd tx gov vote 1 yes --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Vote ‘No’**

```
achillesd tx gov vote 1 no --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Vote ‘Abstain’**

```
achillesd tx gov vote 1 abstain --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

**Vote ‘NoWithVeto’**

```
achillesd tx gov vote 1 NoWithVeto --from wallet --chain-id ithaca-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.25uodis -y
```

### ⚡️ Utility <a href="#utility" id="utility"></a>

**Update ports**

```
CUSTOM_PORT=110
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.achilles/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}90\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}91\"%" $HOME/.achilles/config/app.toml
```

**Update Indexer**

**Disable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.achilles/config/config.toml
```

**Enable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "kv"|' $HOME/.achilles/config/config.toml
```

**Update pruning**

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.achilles/config/app.toml
```

### 🚨 Maintenance <a href="#maintenance" id="maintenance"></a>

**Get validator info**

```
achillesd status 2>&1 | jq .ValidatorInfo
```

**Get sync info**

```
achillesd status 2>&1 | jq .SyncInfo
```

**Get node peer**

```
echo $(achillesd comet show-node-id)'@'$(curl -4s ifconfig.me)':'$(cat $HOME/.achilles/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

**Check if validator key is correct**

```
[[ $(achillesd q staking validator $(achillesd keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(achillesd status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
```

**Get live peers**

```
curl -sS http://localhost:16957/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}'
```

**Set minimum gas price**

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.25uodis\"/" $HOME/.achilles/config/app.toml
```

**Enable prometheus**

```
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.achilles/config/config.toml
```

**Reset chain data**

```
achillesd comet unsafe-reset-all --keep-addr-book --home $HOME/.achilles --keep-addr-book
```

**Remove node**

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```
cd $HOME
sudo systemctl stop achilles.service
sudo systemctl disable achilles.service
sudo rm /etc/systemd/system/achilles.service
sudo systemctl daemon-reload
rm -f $(which achilles)
rm -rf $HOME/.achilles
rm -rf $HOME/Achilles
```

### ⚙️ Service Management <a href="#service-management" id="service-management"></a>

**Reload service configuration**

```
sudo systemctl daemon-reload
```

**Enable service**

```
sudo systemctl enable achilles.service
```

**Disable service**

```
sudo systemctl disable achilles.service
```

**Start service**

```
sudo systemctl start achilles.service
```

**Stop service**

```
sudo systemctl stop achilles.service
```

**Restart service**

```
sudo systemctl restart achilles.service
```

**Check service status**

```
sudo systemctl status achilles.service
```

**Check service logs**

```
sudo journalctl -u achilles.service -f --no-hostname -o cat
```


# Snapshot

Get synced faster and easy.

```bash
sudo apt update
sudo apt-get install snapd lz4 -y
```

```bash
# Stop the service and reset the data
sudo systemctl stop achillesd 
cp $HOME/.achilles/data/priv_validator_state.json $HOME/.achilles/priv_validator_state.json.backup
rm -rf $HOME/.achilles/data
```

```bash
# Download Latest Snapshot
curl -L https://green.codeblocklabs.com/testnet/odiseo/snapshot_latest.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.achilles
mv $HOME/.achilles/priv_validator_state.json.backup $HOME/.achilles/data/priv_validator_state.json
```

```bash
# Restart chain
sudo systemctl start achilles && sudo journalctl -u achilles -f -o cat
```


# RaiBlocksOne

Instant and feeless transactions. The distribution is based on a Snapshot of Nano from the 24/05/2023. Rewards for being a Principal Representative incentivize community commitment.

**Recommended Hardware**

* Run the node in a datacenter. Most SSD VPS packages will work. but better use NVME vps.
* 1 modern CPU core minimum. 2 or more is recommended especially for voting nodes and principal nodes.
* 100GB Free disk space (Blockchain database is \~25GB in size at the moment)
* 2 GB system RAM or more. 4 GB or more is recommended especially for voting nodes and principal nodes

Recomended VPS: \
Contabo -> <https://Lihat.info/contabo> \
Vultr -> <https://Lihat.info/vultr> \
OVH -> <https://Lihat.info/ovh>


# Installation

Update and Install Dependencies

```
apt update -y && apt upgrade -y && apt autoremove -y && apt install screen zip unzip curl -y
```

Set up Docker's `apt` repository

```
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
```

Install the Docker packages.

```
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

{% hint style="info" %}
Note

The Docker service starts automatically after installation. To verify that Docker is running, use:

```console
 sudo systemctl status docker
```

Some systems may have this behavior disabled and will require a manual start:

```console
 sudo systemctl start docker
```

{% endhint %}

Download & Extract From Snapshots

```
wget http://45.76.1.67/raiblocksone_202602.zip
unzip -o raiblocksone_202602.zip
rm -rf raiblocksone_202602.zip
rm -rf __MACOSX
```

Run Nodes

```
// To Run With Root Account use command below:
docker run -d --name xro --restart unless-stopped -p 0.0.0.0:8075:8075 -p 127.0.0.1:8076:8076 -p 127.0.0.1:8078:8078 -e prefix="xro_" -e name="RaiblocksOne" -e account="xro_3oh6tp9b8y65w1fzp3aaxgebptkdhnrziiqaairqfhzkcntiwn1r97cgzikp" -e source="D5E4D58E937883E01BFB0508EB989B6A4B7D31F842E8443176BFF255350E5018" -e work="9da7e03b2a2ec54b" -e signature="FBB7588466EAA76196181C3CDF249178BAC70929E28AABBD5DE284362A34899AB4C972A232824067F439E89F2672B792105D3A55763B852FD21967EC7957260D" -e peering="peering.raione.cc" -e peering_port=8075 -e RPC_PORT=8076 -e WS_PORT=8078 -v /root/raiblocksone:/root yxse/nan

// Or Run With Another User, for example username is "ubuntu"
docker run -d --name xro --restart unless-stopped -p 0.0.0.0:8075:8075 -p 127.0.0.1:8076:8076 -p 127.0.0.1:8078:8078 -e prefix="xro_" -e name="RaiblocksOne" -e account="xro_3oh6tp9b8y65w1fzp3aaxgebptkdhnrziiqaairqfhzkcntiwn1r97cgzikp" -e source="D5E4D58E937883E01BFB0508EB989B6A4B7D31F842E8443176BFF255350E5018" -e work="9da7e03b2a2ec54b" -e signature="FBB7588466EAA76196181C3CDF249178BAC70929E28AABBD5DE284362A34899AB4C972A232824067F439E89F2672B792105D3A55763B852FD21967EC7957260D" -e peering="peering.raione.cc" -e peering_port=8075 -e RPC_PORT=8076 -e WS_PORT=8078 -v /home/ubuntu/raiblocksone:/root yxse/nan
```

***

Useful RPC Command

```
// check blocks
curl -g -d '{ "action": "block_count"}' 'localhost:8076'

// check version
curl -g -d '{ "action": "version"}' 'localhost:8076'

// Create New Wallet ID
curl -g -d '{ "action": "wallet_create"}' localhost:8076

// Create New Wallet Address Inside Wallet ID
curl -g -d '{ "action": "account_create","wallet": "WALLET_ID"}' localhost:8076

// Import Your Old Wallet
curl -g -d '{ "action": "wallet_change_seed", "wallet": "WALLET_ID", "seed": "YOUR_OWN_SEED"}' localhost:8076

```

Useful CLI Command

```
// Backup Wallet (Getting your SEED & Private Key for each address)
docker exec -it xro nan_node --wallet_decrypt_unsafe --wallet=WALLET_ID

// Backup Wallet (If you set password before)
docker exec -it xro nan_node --wallet_decrypt_unsafe --wallet=WALLET_ID --password=YOUR_PASSWORD

```

{% hint style="info" %}
**Note**

Please get in touch with us if the snapshots not available for download. we'll try our best to mirror it to another host.
{% endhint %}

<br>


# RPC Command

Check nodes version

```
curl -d '{"action": "version"}' localhost:6900
```

Check nodes version

```
curl -d '{"action": "block_count"}' localhost:6900
```

Create New Nodes Wallet\_ID

```
curl -g -d '{ "action": "wallet_create"}' localhost:6900
```

Import your wallet into nodes

```
curl -g -d '{ "action": "wallet_change_seed", "wallet": "YOUR_NODES_WALLET_ID", "seed": "YOUR_SEED_64char"}' localhost:6900
```

more rpc command are available on official nano pages, since RaiBlocksOne are fork from nano, it's RPC are same :) <https://docs.nano.org/commands/rpc-protocol/>


# Other

more RPC, Command and Playground are available on special site made by banano official developer on [https://nanoo.tools/](https://nanoo.tools/action_filter.txt)

for security you can also use different server to connect directly to your nodes, this will make your nodes safer. use script from <https://nanoo.tools/action_filter.txt> to filter each request you make.


# Republic

Republic is a decentralized system that leverages blockchain technology to coordinate and verify computational tasks.

GPU Mining Are Optional but it'll giving better points on portal.\
<https://points.republicai.io/?ref=63F949>&#x20;

We use these providers for all nodes:\
Contabo [https://Lihat.info/contabo](https://lihat.info/contabo)\
Vultr [https://Lihat.info/vultr](https://lihat.info/vultr)\
Servarica [https://Lihat.info/servarica](https://lihat.info/servarica)\
VPSAG [https://Lihat.info/vpsag](https://lihat.info/vpsag)\
Hetzner [https://Lihat.info/hetzner](https://lihat.info/hetzner)


# Installation

```bash
# Install Dependencies
sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

```bash
# install go, if needed
cd $HOME
sudo rm -rf /usr/local/go
VER="1.25.5"
curl -Ls https://go.dev/dl/go$VER.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
mkdir -p ~/go/bin
go version
```

```bash
# Download Binary
cd $HOME
mkdir -p ~/go/bin
wget https://github.com/RepublicAI/networks/raw/refs/heads/main/testnet/releases/v0.3.0/republicd-linux-amd64 -O republicd
chmod +x republicd
mv republicd ~/go/bin/
```

```bash
# config and init app
republicd init "Your_Nodes_Name" --chain-id raitestnet_77701-1
```

```bash
# download genesis and addrbook
wget -O $HOME/.republic/config/genesis.json https://backup.codeblocklabs.com/republic/genesis.json
wget -O $HOME/.republic/config/addrbook.json https://backup.codeblocklabs.com/republic/addrbook.json
```

```bash
# Set custom ports in app.toml
sed -i -e "s%:1317%:30317%; s%:8080%:30080%; s%:9090%:30090%; s%:9091%:30091%; s%:8545%:30545%; s%:8546%:30546%; s%:6065%:30065%" $HOME/.republic/config/app.toml
sed -i -e "s%:26658%:30658%; s%:26657%:30657%; s%:6060%:30060%; s%:26656%:30656%; s%:26660%:30660%" $HOME/.republic/config/config.toml
sed -i -e "s|^node *=.*|node = \"tcp://localhost:30657\"|" $HOME/.republic/config/client.toml
```

```bash
# config pruning
pruning="custom"
pruning_keep_every="0"
pruning_keep_recent="100"
pruning_interval="19"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.republic/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.republic/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.republic/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.republic/config/app.toml
```

```bash
# set minimum gas price
sed -i 's|minimum-gas-prices =.*|minimum-gas-prices = "2500000000arai"|g' $HOME/.republic/config/app.toml
```

```bash
# Disable indexing
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.republic/config/config.toml
```

{% tabs %}
{% tab title="Cosmovisor" %}

<pre><code><strong>mkdir -p $HOME/.republic/cosmovisor/genesis/bin
</strong>mv $HOME/go/bin/republicd $HOME/.republic/cosmovisor/genesis/bin/

# Create symlinks
sudo ln -s $HOME/.republic/cosmovisor/genesis $HOME/.republic/cosmovisor/current -f
sudo ln -s $HOME/.republic/cosmovisor/current/bin/republicd /usr/local/bin/republicd -f

# Install cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.7.0

# Create systemd service
sudo tee /etc/systemd/system/republicd.service > /dev/null &#x3C;&#x3C; EOF
[Unit]
Description=republic node service
After=network-online.target

[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.republic"
Environment="DAEMON_NAME=republicd"
Environment="UNSAFE_SKIP_BACKUP=true"

[Install]
WantedBy=multi-user.target
EOF
</code></pre>

{% endtab %}

{% tab title="Non Cosmovisor" %}

```
sudo tee /etc/systemd/system/republicd.service > /dev/null <<EOF
[Unit]
Description=Republic node
After=network-online.target
[Service]
User=$USER
WorkingDirectory=$HOME/.republic
ExecStart=$(which republicd) start --home $HOME/.republic
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
```

{% endtab %}
{% endtabs %}

```bash
# # enable and start service
sudo systemctl daemon-reload
sudo systemctl enable republicd
sudo systemctl restart republicd && sudo journalctl -u republicd -f
```


# Upgrade

v0.3.0

{% tabs %}
{% tab title="Cosmovisor" %}

```
cd $HOME
wget https://github.com/RepublicAI/networks/releases/download/v0.3.0/republicd-linux-amd64  -O republicd
chmod +x republicd
mkdir -p $HOME/.republic/cosmovisor/upgrades/v0.3.0/bin
mv republicd $HOME/.republic/cosmovisor/upgrades/v0.3.0/bin/
sudo systemctl restart republicd && sudo journalctl -u republicd -f
```

{% endtab %}

{% tab title="Non Cosmovisor" %}

```
wget https://github.com/RepublicAI/networks/releases/download/v0.3.0/republicd-linux-amd64  -O republicd
chmod +x republicd
mv republicd ~/go/bin/
sudo systemctl restart republicd && sudo journalctl -u republicd -f
```

{% endtab %}
{% endtabs %}


# Snapshot

```plaintext
sudo apt install lz4 -y
```

```plaintext
sudo systemctl stop republicd
```

```plaintext
cp $HOME/.republic/data/priv_validator_state.json $HOME/.republic/priv_validator_state.json.backup
```

```plaintext
republicd comet unsafe-reset-all --home $HOME/.republic --keep-addr-book
```

{% tabs %}
{% tab title="Republic Team" %}

```
wget https://republic-snapshots.s3.amazonaws.com/republic-snapshot-20260226.tar.gz
tar -xzf republic-snapshot-20260226.tar.gz -C ~/.republic/
```

{% endtab %}

{% tab title="CodeBlockLabs" %}

```plaintext
curl -L http://45.76.1.67/republic/latest.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.republic
```

{% endtab %}
{% endtabs %}

```plaintext
mv $HOME/.republic/priv_validator_state.json.backup $HOME/.republic/data/priv_validator_state.json
```

```plaintext
sudo systemctl restart republicd
sudo journalctl -u republicd -f -o cat
```


# Useful Command

Wallet

```bash
# to create a new wallet, use the following command. don’t forget to save the mnemonic
republicd keys add wallet

# to restore exexuting wallet, use the following command
republicd keys add wallet --recover

# check sync status, once your node is fully synced, the output from above will print "false"
republicd status 2>&1 | jq .sync_info
```

Create Validator File

```bash
# Write your validator configuration.
tee $HOME/validator.json > /dev/null << EOF
{
	"pubkey": $(republicd comet show-validator),
	"amount":  "1000000arai",
	"moniker": "Your_Nodes_Name",
	"identity": "Your_Keybase",
	"website": "Your_Website",
	"details": "Your_Detail",
	"commission-rate": "0.05",
	"commission-max-rate": "0.2",
	"commission-max-change-rate": "0.05",
	"min-self-delegation": "1"
}
EOF
```

Deploy Validator From File

```bash
republicd tx staking create-validator $HOME/validator.json --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

<br>

Remove Node

```bash
sudo systemctl stop republicd
sudo systemctl disable republicd
sudo rm -rf /etc/systemd/system/republicd.service
sudo rm $(which republicd)
sudo rm -rf $HOME/.republic
```


# Key Management

Add New Wallet

```bash
republicd keys add wallet
```

Restore executing wallet

```bash
republicd keys add wallet --recover
```

List All Wallets

```bash
republicd keys list
```

Delete wallet

```bash
republicd keys delete wallet
```

Check Balance

```bash
republicd q bank balances $(republicd keys show wallet -a)
```

Export Key (save to wallet.backup)

```bash
republicd keys export wallet
```

Export Key to EVM

```bash
republicd keys export wallet --unarmored-hex --unsafe
```

Import Key (restore from wallet.backup)

```bash
republicd keys import wallet wallet.backup
```


# Services Management

Check logs

```bash
sudo journalctl -u republicd -f
```

Sync info

```bash
republicd status 2>&1 | jq .sync_info
```

Node info

```bash
republicd status 2>&1 | jq .node_info
```

Your node peer

```bash
echo $(republicd comet show-node-id)'@'$(wget -qO- eth0.me)':'$(cat $HOME/.republic/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

Restart Nodes

<pre><code><strong>sudo systemctl restart republicd &#x26;&#x26; sudo journalctl -u republicd -f
</strong></code></pre>


# Token Management

Withdraw all rewards

```bash
republicd tx distribution withdraw-all-rewards --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai
```

Withdraw rewards and commission from your validator

```bash
republicd tx distribution withdraw-rewards $(republicd keys show wallet --bech val -a) --from wallet --commission --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Check your balance

```bash
republicd query bank balances $(republicd keys show wallet -a)
```

Delegate to Yourself

```bash
republicd tx staking delegate $(republicd keys show wallet --bech val -a) 1000000arai --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Delegate to Other Validator

```bash
republicd tx staking delegate VALOPER_ADDRESS 1000000arai --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Redelegate Stake to Another Validator

```bash
republicd tx staking redelegate $(republicd keys show wallet --bech val -a) VALOPER_ADDRESS 1000000arai --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Unbond

```bash
republicd tx staking unbond $(republicd keys show wallet --bech val -a) 1000000arai --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Transfer Funds

```bash
republicd tx bank send $(republicd keys show wallet -a) WALLET_ADDRESS 1000000arai --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

<br>


# Validator Management

Edit Existing Validator

```bash
republicd tx staking edit-validator \
--commission-rate 0.1 \
--new-moniker "YOUR_NODES_NAME" \
--identity "YOUR_KEYBASE" \
--details "YOUR_DETAIL" \
--from wallet \
--chain-id raitestnet_77701-1 \
--gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai \
-y
```

Validator info

```bash
republicd status 2>&1 | jq .validator_info
```

Validator Details

```bash
republicd q staking validator $(republicd keys show wallet --bech val -a)
```

Jailing info

```bash
republicd q slashing signing-info $(republicd comet show-validator)
```

Slashing parameters

```bash
republicd q slashing params
```

Unjail validator

```bash
republicd tx slashing unjail --from wallet --chain-id raitestnet_77701-1 --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Active Validators List

```bash
republicd q staking validators -oj --limit=2000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " 	 " + .description.moniker' | sort -gr | nl
```

Check Validator key

```bash
[[ $(republicd q staking validator $(republicd keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(republicd status 2>&1 | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "Your key status is ok" || echo -e "Your key status is error"
```

Signing info

```bash
republicd q slashing signing-info $(republicd comet show-validator)
```


# Governance

Create New Text Proposal

```bash
republicd  tx gov submit-proposal \
--title "Governance" \
--description "DETAIL" \
--deposit 1000000arai \
--type Text \
--from wallet \
--gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai \
-y 
```

Proposals List

```bash
republicd query gov proposals
```

View proposal

```bash
republicd query gov proposal 1
```

Vote Yes

```bash
republicd tx gov vote 1 yes --from wallet --chain-id raitestnet_77701-1  --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Vote No

```bash
republicd tx gov vote 1 no --from wallet --chain-id raitestnet_77701-1  --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Vote No With Veto

```bash
republicd tx gov vote 1 no_with_veto --from wallet --chain-id raitestnet_77701-1  --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```

Vote Abstain

```bash
republicd tx gov vote 1 abstain --from wallet --chain-id raitestnet_77701-1  --gas auto --gas-adjustment 1.5  --gas-prices 2500000000arai -y
```


# RaiCoin

Raicoin is a groundbreaking blockchain project designed to revolutionize the way we perceive and utilize cryptocurrencies.

Built on a novel Block Lattice structure and powered by a unique Distributed Delegated Proof-of-Stake (DDPoS) consensus mechanism, Raicoin offers unparalleled performance, low latency, decentralization, and extensibility. With a strong focus on real-world applications and daily usability, Raicoin is poised to become a game-changer in the world of digital currencies.

### Officials <a href="#officials" id="officials"></a>

* Website: <https://raicoin.org>
* Github: <https://github.com/raicoincommunity/Raicoin>
* Telegram: <https://t.me/RaicoinOfficial>
* Twitter: <https://twitter.com/RaicoinC>
* Web Wallet / Bridge Services: [https://raiwallet.org](https://raiwallet.org/)

### Hardware recommendations <a href="#hardware-recommendations" id="hardware-recommendations"></a>

* 2GB RAM
* Dual-Core CPU
* 100 Mbps bandwidth (2TB or more of available monthly bandwidth)
* SSD-based hard drive with 40GB+ of free space

### OS requirements <a href="#os-requirements" id="os-requirements"></a>

* linux: Ubuntu 18.04+, Debian 9+, Centos 8+

### Recomended VPS <a href="#recomended-vps" id="recomended-vps"></a>

* Contabo VPS M -> <https://Lihat.info/contabo>
* Vultr -> <https://Lihat.info/vultr>


# Installation

### Prerequisites <a href="#prerequisites" id="prerequisites"></a>

install screen

```
sudo apt update
sudo apt install screen -y
```

UDP Tuning

```
nano /etc/sysctl.conf
```

```
// append the following lines at the end of sysctl.conf
net.core.rmem_max=33554432
net.core.rmem_default=33554432
net.core.wmem_max=33554432
net.core.wmem_default=8388608
net.core.netdev_max_backlog=100000
net.ipv4.udp_rmem_min=8388608

#make the changes effective
sysctl -p
```

### Download The Latest Build <a href="#download-the-latest-build" id="download-the-latest-build"></a>

```
wget https://github.com/raicoincommunity/Raicoin/releases/download/V1.7.0/rai_node
chmod +x rai_node
```

use a new screen for running rai nodes.

```
screen -S rai
```

then choose what running method you want to use.

### Run with Key.dat <a href="#run-with-key.dat" id="run-with-key.dat"></a>

#### 1. Create key pair <a href="#id-1.-create-key-pair" id="id-1.-create-key-pair"></a>

```
./rai_node --key_create --file=key.dat
cd ~/Raicoin
pwd #print where key.dat is stored
```

***Important===> backup the key.dat and remember the password.***

#### 2. Create Config <a href="#id-2.-create-config" id="id-2.-create-config"></a>

```
./rai_node --config_create --forward_reward_to=#REPLACE WITH YOUR RAICOIN ACCOUNT CREATED BY https://raiwallet.org#
```

#### 3. Start Node <a href="#id-3.-start-node" id="id-3.-start-node"></a>

```
screen -S node
./rai_node --daemon --key=key.dat
#input password of the key.dat
#press CTRL+a+d to leave screen and let the daemon running
#use 'screen -r node' command to resume screen
```

Record your node account shown when the node starts.

### Run with raw\_key (secret key) <a href="#run-with-raw_key-secret-key" id="run-with-raw_key-secret-key"></a>

#### 1. Create config <a href="#id-1.-create-config" id="id-1.-create-config"></a>

```
./rai_node --config_create --forward_reward_to=rai_1d5ug5e383whh5ajod83m5pdpi9boequwhjurbu4588buwi4hssxdy91guqe
```

#### 2. Run Daemon <a href="#id-2.-run-daemon" id="id-2.-run-daemon"></a>

```
./rai_node --daemon --raw_key
```

then enter your secret key.

### Maximize your revenue \[optional but recommended] <a href="#maximize-your-revenue-optional-but-recommended" id="maximize-your-revenue-optional-but-recommended"></a>

Change your wallet's representative to your node account to get extra reward. When your wallet receives first reward (typically 72 hours later), then click "Settings-->Account Settings", enter the node account(shown in step 3) in "New Representative" field and click "CHANGE REPRESENTATIVE", done!


# Node Configuration

Configuration for config-node.toml

```
[node]
# throttle bandwidth (recommended unless on a large vps)
# bandwidth_limit = 1

# only allow one person to bootstrap from you at a time (recommended unless on a large vps or a principle rep)
# bootstrap_connections_max = 1

# don't allow burst mode (recommended unless on a large vps or a principle rep)
# bandwidth_limit_burst_ratio = 1.0

[node.rocksdb]
# only enable if you are using rocksdb, by default it's false
enable = true

[node.websocket]
# WebSocket server bind address.
# type:string,ip
address = "::ffff:0.0.0.0"

# Enable or disable WebSocket server. disable unless you need it.
# type:bool
enable = false

[rpc]
# Enable or disable RPC. 
# enable to allow debugging of bootstrapping. disable if not needed after bootstrapping.
# type:bool
enable = true
```

Configuration for config-rpc.toml

```

# Bind address for the RPC server.
# type:string,ip
address = "::ffff:0.0.0.0"

# Enable or disable control-level requests.
# WARNING: Enabling this gives anyone with RPC access the ability to stop the node and access wallet funds.
# type:bool
enable_control = true

# Maximum number of levels in JSON requests.
# type:uint8
max_json_depth = 20

# Maximum number of bytes allowed in request bodies.
# type:uint64
max_request_size = 33554432

# Listening port for the RPC server.
# type:uint16
port = 6900

[logging]

# Whether to log RPC calls.
# type:bool
#log_rpc = true

[process]

# Number of threads used to serve IO.
# type:uint32
#io_threads = 4

# Address of IPC server.
# type:string,ip
#ipc_address = "::1"

# Listening port of IPC server.
# type:uint16
#ipc_port = 46000

# Number of IPC connections to establish.
# type:uint32
#num_ipc_connections = 1
```


# RPC Command

Check nodes version

```
curl -d '{"action": "version"}' localhost:6900
```

Check nodes version

```
curl -d '{"action": "block_count"}' localhost:6900
```

Create New Nodes Wallet\_ID

```
curl -g -d '{ "action": "wallet_create"}' localhost:6900
```

Import your wallet into nodes

```
curl -g -d '{ "action": "wallet_change_seed", "wallet": "YOUR_NODES_WALLET_ID", "seed": "YOUR_SEED_64char"}' localhost:6900
```

more rpc command are available on official nano pages, since raicoin are fork from nano but with some extension, it's RPC are same :) Complete list of rpc are available on <https://docs.nano.org/commands/rpc-protocol/> and <https://github.com/raicoincommunity/Raicoin/wiki/Node-RPC>


# Other

more RPC, Command and Playground are available on special site made by banano official developer on [https://nanoo.tools/](https://nanoo.tools/action_filter.txt)

for security you can also use different server to connect directly to your nodes, this will make your nodes safer. use script from <https://nanoo.tools/action_filter.txt> to filter each request you make.


# Selfchain

Selfchain Testnet v2

Self chain opens the doors to Web3 opportunities for users and AI Agents alike. With keyless wallets for effortless onboarding and AI-powered conversational interfaces, it enables anyone to execute even complex transactions instantly.

* Homepages: <https://selfchain.xyz>
* Explorer: [https://testnet.selfchain.xyz/self/](https://testnet.selfchain.xyz/self/block)
* Official Installation Manual: <https://docs.selfchain.xyz/nodes-and-validators/run-selfchain-testnet-node?ref=blog.selfchain.xyz>

**Social Media**

* X <https://twitter.com/selfchainxyz>
* Telegram <https://t.me/selfchainxyz>
* Discord <https://discord.gg/selfchainxyz>
* Blog <http://blog.selfchain.xyz/>

**Minimum Requirements**:

* **CPU**:
  * Core: 2+
* **RAM**: 4GB+
* **Storage**: 120GB+ SSD/NVME
* **Software**:
  * Golang go1.16.1 - go1.19.4 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

Selfchain Testnet v2

Installation

<pre><code>// Download binaries
wget "https://1501792788-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcIZFCZY4EPKDYaPcDZLG%2Fuploads%2FjZ2W5fQRc1EfLuI6Sbe4%2Fselfchaind-linux-amd64?alt=media&#x26;token=a3023826-ab65-405f-8112-cf696d1be00d" -O selfchaind-linux-amd64
<strong>// change permission
</strong>chmod +x selfchaind-linux-amd64
// init (change moniker to your own)
./selfchaind-linux-amd64 init moniker
// download genesis file
curl -Ls https://green.codeblocklabs.com/testnet/selfchain-v2/genesis.json > $HOME/.selfchain/config/genesis.json
// set persistent peers
PEERS="ec8f3842d43498fccbfc3d4aa10f9525789c0d26@57.129.28.171:22056,d9d2998f571ee06bf010a50b32137ca89374f946@65.109.123.185:11556,60fbaa5ad36ff188582084d6726acb914b73892d@65.109.23.55:3056,f5d922cec33bae7e4d167467e9439bc060cd88e6@212.56.40.145:11556,df7f8f5e02adcf8dc5ab160e0a43f9c175d940fb@135.181.136.105:11556,2360c4eb16334084cd9dc6110bb0782cf306ad21@185.16.38.165:11556,63a8643e7a2b983e3c2e892d51701dff8d5a3578@149.50.96.58:11556,585eaf7877beee901a55a74e50f6034229818ed9@149.50.96.91:11556,91b92e79702ffcbcdf9ea496bf62c717cf99e247@135.181.25.82:11556,103f716bb326da9360b3e66f3f02f989b804e82f@162.244.24.82:11556,4ecdbfe32616329a64fa1f3e7318f10865df4ecf@84.247.162.202:11556,df1c5ff6514e18e9395018fc422c09c3474182bf@37.187.158.148:26656,bba7c69527f778c49c7cfd86b4aff51402bea56e@95.216.69.94:11556,302dc61a32162dd899ef75c3ea3f67893e556744@65.108.234.158:56656,f58f147d52f6ea73aa753ae5d47bc9a33a3f4735@62.169.24.103:11556,291752d58f596365a043c4591e44555fd7b511b2@95.217.227.239:11556,24520be7842d541cd8ebe93818078531b1c6c2b0@95.217.37.107:11556,7f595fef5360496b2e91c331e7236054edda9ce1@37.27.133.17:11556,8a34e7465110cb0a178a7858b282c9c6b538f4b6@69.30.247.4:11556,1919edf3dd55beb5e2869568d810e0da4308f863@65.108.78.83:11556,3dda66fedf8270984626b0ba90473337d48f2e94@193.34.213.234:11556,a1d0108eefe146ac55790c82f898237e96a660f9@135.181.26.128:11556,09592c7cd7bdcc01edf15a2315db1fd702eb554a@5.189.150.236:11556,be2188a985cb4c47f0f77cbbcc738c6fc1fa4c9e@152.53.50.118:11556,1020e0624c0c1ea5252bdee08582b58a56254e72@198.7.112.56:11556,08d701d231cfacc3e6a87395dc2fcb8a89660db1@135.181.236.254:11556,b44b9fd30968b32a3c3535907118013d45d3e374@100.42.191.20:11556,06d505c499b2c99b656320b954944038794b223b@116.202.218.189:11456,981a5301e5eb232350565c6e83e05d08b73b8a80@207.180.220.118:11556,d8dbad968299bd6916eb45347a97bfc6c8c1ea18@37.27.53.88:11556,d1f39c58f6d0a251d8cdcf27126335a688999e14@149.50.116.81:11556,4d28e1b533eea60566c53a948353173856a81c5b@158.220.121.173:11556,7c7e7f85e212f1ec3b17ff74e6d9aefac5eff2b8@193.34.212.80:43656,0a73744a5b31291f0c072134425dfbef5cd2aded@142.132.156.99:3056,9feed7b20e92cc4b9094b1393cc5aff859e9aacd@148.251.51.57:11556,4faf99d5d8709c3af3cd3c8f92dacd97f136b492@95.217.230.235:11556,d6a21bb1e07ed9660a2489b34c9dba4058ba4eaf@65.108.106.168:31056,916c68cadb19e798642024a3c769d633d531ff68@100.42.178.133:13656,3f81cfbca3afba10cec63f1a9c653d005ad76887@135.181.253.102:26657,750ee06ef5af64dfc90788eb4f964f6c49337783@152.53.229.82:13656,00bf0c5363703bd24c8b221027bd149427719e3e@136.243.104.103:22056,5a042ef864a9803f8e330ffad505086f0cb0514d@152.53.84.190:19656,16f4c3adf56c32d1a91f052d14956af1518f58de@65.109.112.148:3056,0aef33af888be7b4a997bf4905fab6731be83165@84.247.177.227:26656,1b6e717a0ba71e71f7a636971763231194508c97@65.108.230.113:3056,47fbf7e4d28791fdab82a54a136360dae26b2a36@95.216.12.106:31056,68315ae044c886c15151ae2f5a7709c502e2f8d8@65.108.196.251:11356,aeb22c9cd77c51d5ffa0c0798428dbf4c4066770@135.181.114.175:3056,0b5265b87b834cac122c0d3b35fabd8f6c68e624@173.212.235.109:11556,9d33dd323bb02e1dda974f6400e809fa2b3740e9@152.53.125.167:27656,447c1f962696fcdd6c31ca1ae073c97c9cb15f58@3.138.56.49:26656,3a6608f456836bdd69d65ae2cf5854f8cd76c27b@3.147.222.52:26656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$PEERS\"|" $HOME/.selfchain/config/config.toml
// run the binary
./selfchaind-linux-amd64 start 
</code></pre>

{% hint style="warning" %}
wait until the sync process stopped and there is an upgrade information appear.
{% endhint %}

```
// Download the v2.0.0 version
wget "https://green.codeblocklabs.com/testnet/selfchain-v2/selfchaind" -O selfchaind
// change permission
chmod +x selfchaind
// open new screen
screen -S selfchain
// run the v2.0.0 binary
nohup ./selfchaind > selfchain.log 2>&1 &
```

```
// Only if you need to download the Addrbook, use command below:

curl -Ls https://green.codeblocklabs.com/testnet/selfchain-v2/addrbook.json $HOME/.selfchain/config/addrbook.json
```

When the nodes already synced and everything's good, request faucet on selfchain discord and create validator.

***

## Setting Up Services

```
// Create bin folder
mkdir ~/bin
// Copy binary
cp selfchaind ~/bin/
// Change permission
chmod +x ~/bin/selfchaind
// add to path
export PATH="$PATH:/home/username/location_to_bin_folder"
// reload shell configuration
source ~/.bashrc
// test
./selfchaind version --long
```

If test was success, you can now create the services configuration file.

```
# Set Service file
sudo tee /etc/systemd/system/selfchaind.service > /dev/null <<EOF
[Unit]
Description=selfchain mainnet node
After=network-online.target
[Service]
User=$USER
ExecStart=$(which selfchaind) start
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable selfchaind

```

```
// Start the nodes on services
sudo systemctl restart selfchaind && sudo journalctl -fu selfchaind -o cat

```


# Useful Command

Useful set of commands for node operators. From key management to chain governance.

### 🔑 Key management <a href="#key-management" id="key-management"></a>

**Add new key**

```
selfchaind keys add wallet
```

**Recover existing key**

```
selfchaind keys add wallet --recover
```

**List all keys**

```
selfchaind keys list
```

**Delete key**

```
selfchaind keys delete wallet
```

**Export key to the file**

```
selfchaind keys export wallet
```

**Import key from the file**

```
selfchaind keys import wallet wallet.backup
```

**Query wallet balance**

```
selfchaind q bank balances $(selfchaind keys show wallet -a)
```

### 👷 Validator management <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

**Create new validator**

```
selfchaind tx staking create-validator \
  --amount "1000000uslf" \
  --pubkey $(selfchaind tendermint show-validator) \
  --moniker "<MONIKER>" \
  --identity "" \
  --details "CodeBlockLabs Community" \
  --website "YOUR WEBSITE" \
  --chain-id selfchain-testnet \
  --commission-rate "0.05" \
  --commission-max-rate "0.2" \
  --commission-max-change-rate "0.01" \
  --min-self-delegation "1" \
  --gas-prices 1uslf \
  --gas "auto" \
  --gas-adjustment "1.5" \
  --from wallet \
  -y

```

**Edit existing validator**

```
selfchaind tx staking edit-validator \
--new-moniker "<MONIKER>" \
--identity "" \
--details "CodeBlockLabs Community" \
--website "YOUR WEBSITE" \
--chain-id selfchain-testnet \
--commission-rate "0.05" \
--gas-prices 1uslf \
--gas "auto" \
--gas-adjustment "1.5" \
--from wallet \
-y
```

**Unjail validator**

```
selfchaind tx slashing unjail \
--chain-id selfchain-testnet \
--gas-prices 1uslf \
--gas-adjustment 1.5 \
--gas "auto" \
--from wallet \
-y 
```

**Jail reason**

```
selfchaind query slashing signing-info $(selfchaind tendermint show-validator)
```

**List all active validators**

```
selfchaind q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " 	 " + .description.moniker' | sort -gr | nl 
```

**List all inactive validators**

```
selfchaind q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED") or .status=="BOND_STATUS_UNBONDING")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " 	 " + .description.moniker' | sort -gr | nl 
```

**View validator details**

```
selfchaind q staking validator $(selfchaind keys show wallet --bech val -a) 
```

### 💲 Token management <a href="#token-management" id="token-management"></a>

**Withdraw rewards from all validators**

```
selfchaind tx distribution withdraw-all-rewards --from wallet --chain-id selfchain-testnet --gas-prices 1uslf  --gas-adjustment 1.5 --gas "auto" -y 
```

**Withdraw commission and rewards from your validator**

```
selfchaind tx distribution withdraw-rewards $(selfchaind keys show wallet --bech val -a) --commission --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Delegate tokens to yourself**

```
selfchaind tx staking delegate $(selfchaind keys show wallet --bech val -a) 1000000uslf --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Delegate tokens to validator**

```
selfchaind tx staking delegate <TO_VALOPER_ADDRESS> 1000000uslf --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Redelegate tokens to another validator**

```
selfchaind tx staking redelegate $(selfchaind keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000uslf --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Unbond tokens from your validator**

```
selfchaind tx staking unbond $(selfchaind keys show wallet --bech val -a) 1000000uslf --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Send tokens to the wallet**

```
selfchaind tx bank send wallet <TO_WALLET_ADDRESS> 1000000uslf --from wallet --chain-id selfchain-testnet
```

### 🗳 Governance <a href="#governance" id="governance"></a>

**List all proposals**

```
selfchaind query gov proposals
```

**View proposal by id**

```
selfchaind query gov proposal 1
```

**Vote 'Yes'**

```
selfchaind tx gov vote 1 yes --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Vote 'No'**

```
selfchaind tx gov vote 1 no --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Vote 'Abstain'**

```
selfchaind tx gov vote 1 abstain --from wallet --chain-id selfchain-testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

**Vote 'NoWithVeto'**

```
selfchaind tx gov vote 1 nowithveto --from wallet --chain-id selfchain--testnet --gas-adjustment 1.4 --gas auto --fees 500uslf -y
```

### ⚡️ Utility <a href="#utility" id="utility"></a>

**Update ports**

```
CUSTOM_PORT=20
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}660\"%" $HOME/.selfchaind/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}317\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}091\"%" $HOME/.selfchaind/config/app.toml
```

## **Update Indexer**

**Disable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.selfchaind/config/config.toml
```

**Enable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "kv"|' $HOME/.selfchaind/config/config.toml
```

**Update pruning**

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.selfchaind/config/app.toml
```

## 🚨 Maintenance <a href="#maintenance" id="maintenance"></a>

**Get validator info**

```
selfchaind status 2>&1 | jq .ValidatorInfo
```

**Get sync info**

```
selfchaind status 2>&1 | jq .SyncInfo
```

**Get node peer**

```
echo $(selfchaind tendermint show-node-id)'@'$(curl -s ifconfig.me)':'$(cat $HOME/.selfchaind/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

**Check if validator key is correct**

```
[[ $(selfchaind q staking validator $(selfchaind keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(blockxd status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
```

**Get live peers**

```
curl -sS http://localhost:25657/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}'
```

**Set minimum gas price**

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0025uslf\"/" $HOME/.selfchaind/config/app.toml
```

**Enable prometheus**

```
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.selfchaind/config/config.toml
```

**Reset chain data**

```
selfchaind tendermint unsafe-reset-all --home $HOME/.selfchaind --keep-addr-book
```

**Remove node**

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```
cd $HOME
sudo systemctl stop selfchaind 
sudo systemctl disable selfchaind 
sudo rm /etc/systemd/system/selfchaind.service
sudo systemctl daemon-reload
rm -f $(which selfchaind)
rm -rf $HOME/.selfchaind

```

### ⚙️ Service Management <a href="#service-management" id="service-management"></a>

**Reload service configuration**

```
sudo systemctl daemon-reload
```

**Enable service**

```
sudo systemctl enable selfchaind
```

**Disable service**

```
sudo systemctl disable selfchaind
```

**Start service**

```
sudo systemctl start selfchaind
```

**Stop service**

```
sudo systemctl stop selfchaind
```

**Restart service**

```
sudo systemctl restart selfchaind
```

**Check service status**

```
sudo systemctl status selfchaind
```

**Check service logs**

```
sudo journalctl -u selfchaind -f --no-hostname -o cat
```


# Snapshot

Get synced faster and easy.

```bash
sudo apt update
sudo apt-get install snapd lz4 -y
```

```bash
# Stop the service and reset the data
sudo systemctl stop selfchaind
cp $HOME/.selfchain/data/priv_validator_state.json $HOME/.selfchain/priv_validator_state.json.backup
rm -rf $HOME/.selfchain/data
```

```bash
# Download Latest Snapshot
curl -L https://green.codeblocklabs.com/testnet/selfchain-v2/selfchain-latest.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.selfchain
mv $HOME/.selfchain/priv_validator_state.json.backup $HOME/.selfchain/data/priv_validator_state.json
```

```bash
# Restart chain
sudo systemctl start selfchaind && sudo journalctl -u selfchaind -f -o cat
```


# Symphony

Symphony Mainnet

Symphony is a chain built on Cosmos that provides a crypto-native solution for real-world assets not reliant on traditional banking infrastructure. It can peg to any asset, allowing global access to trade across mediums such as real-estate and gold, as well as easily accessed infrastructure to build market systems such as ForEx.

* Homepages: <https://orchestralabs.org/>
* Explorer: <https://explorer.codeblocklabs.com/symphony-testnet>

**Social Media**

* X <https://twitter.com/orchestra_labs>
* Telegram <https://t.me/+xFieHCYYyx41NGQx>
* Discord <https://discord.gg/symphony-1162823265975279636>
* Github <https://github.com/Orchestra-Labs>

**Minimum Requirements**:

* **CPU**:
  * Core: 8+ (x86\_64 architecture)
* **RAM**: 32Gb+
* **Storage**: 1Tb+ SSD NVME
* **Connection:** 1 Gbps dedicated line
* **Software**:
  * Golang go1.24.5 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

Symphony Mainnet.

Installation

```
// Install Dependencies
sudo apt-get update
sudo apt-get install curl git jq lz4 build-essential
sudo apt-get upgrade

// Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.5.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | tee -a $HOME/.profile)

// Download binaries
mkdir -p $HOME/.symphonyd/cosmovisor/genesis/bin
wget -O $HOME/.symphonyd/cosmovisor/genesis/bin/symphonyd https://green.codeblocklabs.com/mainnet/symphony/symphonyd
chmod +x $HOME/.symphonyd/cosmovisor/genesis/bin/symphonyd

// Create application symlinks
ln -s $HOME/.symphonyd/cosmovisor/genesis $HOME/.symphonyd/cosmovisor/current -f
sudo ln -s $HOME/.symphonyd/cosmovisor/current/bin/symphonyd /usr/local/bin/symphonyd -f
```

***

***

## Setting Up Services

```
# Download and install Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.6.0

# Create service
sudo tee /etc/systemd/system/symphonyd-testnet.service > /dev/null << EOF
[Unit]
Description=symphony node service
After=network-online.target

[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.symphonyd"
Environment="DAEMON_NAME=symphonyd"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:$HOME/.lumera/cosmovisor/current/bin"

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable lumera.service

```

***

## Setting Up Nodes

```
# Set node configuration
lumerad config chain-id symphony-testnet-4
lumerad config keyring-backend test
lumerad config node tcp://localhost:17769

# Initialize the node
lumerad init YourNodesName --chain-id symphony-testnet-4

# Download genesis and addrbook
curl -Ls https://green.codeblocklabs.com/testnet/symphony/genesis.json > $HOME/.symphonyd/config/genesis.json
curl -Ls https://green.codeblocklabs.com/testnet/symphony/addrbook.json > $HOME/.symphonyd/config/addrbook.json

# Add seeds
sed -i -e "s|^seeds *=.*|seeds = \"6b552c8ebdbffee1394a5d9974ab05c45cdba843@135.181.238.225:16956\"|" $HOME/.lumera/config/config.toml

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.025note\"|" $HOME/.symphonyd/config/app.toml

# Set pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.symphonyd/config/app.toml

# Set custom ports
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:16958\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:16957\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:16960\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:16956\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":16966\"%" $HOME/.symphonyd/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:16917\"%; s%^address = \":8080\"%address = \":16980\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:16990\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:16991\"%; s%:8545%:16945%; s%:8546%:16946%; s%:6065%:16965%" $HOME/.symphonyd/config/app.toml

```

## Chain Snapshots

```
curl -L https://green.codeblocklabs.com/testnet/symphony/snapshot_latest.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.lumera
[[ -f $HOME/.symphonyd/data/upgrade-info.json ]] && cp $HOME/.symphonyd/data/upgrade-info.json $HOME/.symphony/cosmovisor/genesis/upgrade-info.json
```

```
// Start the nodes on services
sudo systemctl start symphonyd-testnet.service && sudo journalctl -u symphonyd-testnet.service -f --no-hostname -o cat
```


# Useful Command

Useful set of commands for node operators. From key management to chain governance.

### 🔑 Key management <a href="#key-management" id="key-management"></a>

**Add new key**

```
symphonyd keys add wallet
```

**Recover existing key**

```
symphonyd keys add wallet --recover
```

**List all keys**

```
symphonyd keys list
```

**Delete key**

```
symphonyd keys delete wallet
```

**Export key to a file**

```
symphonyd keys export wallet
```

**Import key from a file**

```
symphonyd keys import wallet wallet.backup
```

**Query wallet balance**

```
symphonyd q bank balances $(symphonyd keys show wallet -a)
```

### 👷 Validator management <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

**Create new validator**

```
lumerad tx staking create-validator <(cat <<EOF
{
  "pubkey": $(symphonyd comet show-validator),
  "amount": "1000000note",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id symphony-testnet-4 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025note \
-y
```

**Edit existing validator**

```
symphonyd tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id symphony-testnet-4 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025note \
-y
```

**Unjail validator**

```
symphonyd tx slashing unjail --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Jail reason**

```
symphonyd query slashing signing-info $(symphonyd comet show-validator)
```

**List all active validators**

```
symphonyd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**List all inactive validators**

```
symphonyd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**View validator details**

```
symphonyd q staking validator $(symphonyd keys show wallet --bech val -a)
```

### 💲 Token management <a href="#token-management" id="token-management"></a>

**Withdraw rewards from all validators**

```
symphonyd tx distribution withdraw-all-rewards --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Withdraw commission and rewards from your validator**

```
symphonyd tx distribution withdraw-rewards $(symphonyd keys show wallet --bech val -a) --commission --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Delegate tokens to yourself**

```
symphonyd tx staking delegate $(symphonyd keys show wallet --bech val -a) 1000000note --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Delegate tokens to validator**

```
symphonyd tx staking delegate <TO_VALOPER_ADDRESS> 1000000note --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Redelegate tokens to another validator**

```
symphonyd tx staking redelegate $(symphonyd keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000note --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Unbond tokens from your validator**

```
symphonyd tx staking unbond $(symphonyd keys show wallet --bech val -a) 1000000note --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Send tokens to the wallet**

```
symphonyd tx bank send wallet <TO_WALLET_ADDRESS> 1000000note --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

### 🗳 Governance <a href="#governance" id="governance"></a>

**List all proposals**

```
symphonyd query gov proposals
```

**View proposal by id**

```
symphonyd query gov proposal 1
```

**Vote ‘Yes’**

```
symphonyd tx gov vote 1 yes --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Vote ‘No’**

```
symphonyd tx gov vote 1 no --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Vote ‘Abstain’**

```
symphonyd tx gov vote 1 abstain --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

**Vote ‘NoWithVeto’**

```
symphonyd tx gov vote 1 NoWithVeto --from wallet --chain-id symphony-testnet-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.025note -y
```

### ⚡️ Utility <a href="#utility" id="utility"></a>

**Update ports**

```
CUSTOM_PORT=110
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.symphonyd/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}90\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}91\"%" $HOME/.symphonyd/config/app.toml
```

**Update Indexer**

**Disable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.symphonyd/config/config.toml
```

**Enable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "kv"|' $HOME/.symphonyd/config/config.toml
```

**Update pruning**

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.symphonyd/config/app.toml
```

### 🚨 Maintenance <a href="#maintenance" id="maintenance"></a>

**Get validator info**

```
symphonyd status 2>&1 | jq .ValidatorInfo
```

**Get sync info**

```
symphonyd status 2>&1 | jq .SyncInfo
```

**Get node peer**

```
echo $(symphonyd comet show-node-id)'@'$(curl -4s ifconfig.me)':'$(cat $HOME/.symphonyd/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

**Check if validator key is correct**

```
[[ $(symphonyd q staking validator $(symphonyd keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(symphonyd status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
```

**Get live peers**

```
curl -sS http://localhost:PORT/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}'
```

**Set minimum gas price**

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025ulume\"/" $HOME/.symphonyd/config/app.toml
```

**Enable prometheus**

```
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.symphonyd/config/config.toml
```

**Reset chain data**

```
symphonyd comet unsafe-reset-all --keep-addr-book --home $HOME/.symphonyd --keep-addr-book
```

**Remove node**

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```
cd $HOME
sudo systemctl stop symphony-testnet.service
sudo systemctl disable symphony-testnet.service
sudo rm /etc/systemd/system/symphony-testnet.service
sudo systemctl daemon-reload
rm -f $(which symphonyd)
rm -rf $HOME/.symphonyd
rm -rf $HOME/symphonyd
```

### ⚙️ Service Management <a href="#service-management" id="service-management"></a>

**Reload service configuration**

```
sudo systemctl daemon-reload
```

**Enable service**

```
sudo systemctl enable symphony-testnet.service
```

**Disable service**

```
sudo systemctl disable symphony-testnet.service
```

**Start service**

```
sudo systemctl start symphony-testnet.service
```

**Stop service**

```
sudo systemctl stop symphony-testnet.service
```

**Restart service**

```
sudo systemctl restart symphony-testnet.service
```

**Check service status**

```
sudo systemctl status symphony-testnet.service
```

**Check service logs**

```
sudo journalctl -u symphony-testnet.service -f --no-hostname -o cat
```


# Snapshot

Get synced faster and easy.

```bash
sudo apt update
sudo apt-get install snapd lz4 -y
```

## Chain Snapshots

Create new file with "sudo nano download\_symphony.sh"

```
#!/bin/bash

# Config
BACKUP_URL="https://green.codeblocklabs.com/mainnet/symphony/"
TARGET_DIR="$HOME/.symphonyd"
LOG_FILE="$HOME/symphony_backup.log"

# Get today's and yesterday's dates in YYYY-MM-DD format
TODAY=$(date '+%Y-%m-%d')
YESTERDAY=$(date -d 'yesterday' '+%Y-%m-%d')

# Check if backup exists (today or yesterday)
check_backup() {
    local date=$1
    BACKUP_NAME="backup-${date}.tar.lz4"
    
    # Check if file exists on server
    if curl --output /dev/null --silent --head --fail "${BACKUP_URL}${BACKUP_NAME}"; then
        echo "$BACKUP_NAME"
        return 0
    else
        return 1
    fi
}

# Download and extract backup
download_and_extract() {
    local backup_name="$1"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Found backup: $backup_name" | tee -a "$LOG_FILE"
    
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⬇️ Downloading and extracting..." | tee -a "$LOG_FILE"
    mkdir -p "$TARGET_DIR"
    
    # Stream download → lz4 decompress → tar extract
    if curl -sL "${BACKUP_URL}${backup_name}" | lz4 -c -d - | tar -x -C "$TARGET_DIR"; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Successfully extracted to $TARGET_DIR" | tee -a "$LOG_FILE"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Extraction failed!" | tee -a "$LOG_FILE"
        exit 1
    fi
}

# Main execution
echo "=== Axone Backup Downloader ===" | tee -a "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔍 Checking for today's backup ($TODAY)..." | tee -a "$LOG_FILE"

# Try today's backup first
if BACKUP_NAME=$(check_backup "$TODAY"); then
    download_and_extract "$BACKUP_NAME"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⏳ Today's backup not found. Checking yesterday ($YESTERDAY)..." | tee -a "$LOG_FILE"
    if BACKUP_NAME=$(check_backup "$YESTERDAY"); then
        download_and_extract "$BACKUP_NAME"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ No backup found for today or yesterday!" | tee -a "$LOG_FILE"
        exit 1
    fi
fi
```

Make it executable

```
chmod +x download_symphony_backup.sh
```

Run the download snapshot

```
./download_symphony_backup.sh
```

After succesfully download snapshot, run the binary by starting the services

```
// Start the nodes on services
sudo systemctl start symphonyd.service && sudo journalctl -u symphonyd.service -f --no-hostname -o cat
```


# Snapshot

Get synced faster and easy.

```bash
sudo apt update
sudo apt-get install snapd lz4 -y
```

```bash
# Stop the service and reset the data
sudo systemctl stop symphonyd
cp $HOME/.symphonyd/data/priv_validator_state.json $HOME/.symphonyd/priv_validator_state.json.backup
rm -rf $HOME/.symphonyd/data
```

```bash
# Download Latest Snapshot
curl -L https://green.codeblocklabs.com/mainnet/symphony/snapshot/snapshot_latest.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.symphonyd
mv $HOME/.symphonyd/priv_validator_state.json.backup $HOME/.symphonyd/data/priv_validator_state.json
```

```bash
# Restart chain
sudo systemctl start symphonyd-testnet && sudo journalctl -u symphonyd -f -o cat
```


# Oracle

#### Install Oracle <a href="#install-oracle" id="install-oracle"></a>

```plaintext
cd $HOME
rm -rf symphony-oracle-voter
git clone https://github.com/cmancrypto/symphony-oracle-voter.git
cd symphony-oracle-voter
git checkout v0.0.4r3
```

#### If Update from v0.0.4r2, please use code below <a href="#if-update-from-v004r2" id="if-update-from-v004r2"></a>

```plaintext
cd $HOME/symphony-oracle-voter
git pull 
git checkout v0.0.4r3
```

***

#### Make File <a href="#make-file" id="make-file"></a>

```plaintext
nano $HOME/symphony-oracle-voter/.env
```

#### Edit with Ur Address and Valoper and Password <a href="#edit-with-ur-address-and-valoper-and-password" id="edit-with-ur-address-and-valoper-and-password"></a>

```plaintext
VALIDATOR_ADDRESS=symphonyvaloper************
VALIDATOR_ACC_ADDRESS=symphony***************
KEY_PASSWORD=********
SYMPHONY_LCD = https://symphony-apitest.codeblocklabs.com/
TENDERMINT_RPC= https://symphony-rpctest.codeblocklabs.com/
```

#### Install Python <a href="#install-python" id="install-python"></a>

```plaintext
sudo apt install python3.12
sudo apt install python3.12-venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
deactivate
```

#### Make System Service <a href="#make-system-service" id="make-system-service"></a>

```plaintext
sudo tee /etc/systemd/system/symphony-oracle.service > /dev/null << EOF
[Unit]
Description=Symphony Oracle
After=network.target

[Service]
# Environment variables
Environment="SYMPHONYD_PATH=/root/go/bin/symphonyd"
Environment="PYTHON_ENV=production"
Environment="LOG_LEVEL=INFO"
Environment="DEBUG=false"

# Service configuration
Type=simple
User=root
WorkingDirectory=/root/symphony-oracle-voter
ExecStart=/root/symphony-oracle-voter/venv/bin/python3 -u /root/symphony-oracle-voter/main.py
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF
```

#### Starting Services <a href="#start" id="start"></a>

```plaintext
sudo systemctl daemon-reload
sudo systemctl enable symphony-oracle.service
sudo systemctl start symphony-oracle.service
journalctl -u symphony-oracle.service -f
```


# Patch

only for those who getting error different version when upgrading to v5testnet

Non Cosmovisor

```
cd $HOME 
rm -rf symphony 
git clone https://github.com/Orchestra-Labs/symphony.git
cd symphony
git checkout fix/change-upgrade-name-to-fix-testnet-migration
make install 
sudo systemctl restart symphonyd && sudo journalctl -u symphonyd -f -o cat
```

Cosmovisor

```
cd $HOME 
rm -rf symphony 
git clone https://github.com/Orchestra-Labs/symphony.git
cd symphony
git checkout fix/change-upgrade-name-to-fix-testnet-migration
make build
mv $HOME/symphony/build/symphonyd $HOME/.symphonyd/cosmovisor/upgrades/v5testnet/bin/
```


# Tellor

Tellor is the oracle layer for secure, censorship-resistant data creation and distribution. Built to be the source of truth, not just middleware, it is unlike any other data provider in the industry.

* Homepages: <https://tellor.io/>
* Explorer: <https://explorer.codeblocklabs.com/tellor>

**Social Media**

* X <https://x.com/wearetellor>
* Youtube <https://www.youtube.com/tellor>
* Discord <https://discord.gg/tellor>
* Github <https://github.com/tellor-io>

**Minimum Requirements**:

* **CPU**:
  * Core: 8+ (x86\_64 architecture)
* **RAM**: 32Gb+
* **Storage**: 1Tb+ SSD NVME
* **Connection:** 1 Gbps dedicated line
* **Software**:
  * Golang go1.24.5 linux/amd64
  * Linux Ubuntu Version : 22.04 LTS
* Recomended VPS: [Contabo ](https://lihat.info/contabo)/ [Vultr](https://lihat.info/vultr)


# Installation

1\. System Preparation

```
# System update
sudo apt update && sudo apt upgrade -y

# Install required packages
sudo apt install -y build-essential jq sed curl wget git make gcc g++ unzip snapd lz4
```

2\. Go Installation

```
cd $HOME
wget https://go.dev/dl/go1.23.3.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
rm go1.23.3.linux-amd64.tar.gz

# PATH configuration
cat << 'EOF' >> ~/.bashrc
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
export GOPATH=$HOME/go
EOF

source ~/.bashrc
go version
```

3\. Binary Download and Installation

```
# Create binary directory
mkdir -p ~/layer/binaries/v5.1.1 && cd ~/layer/binaries/v5.1.1

# Download binary
wget https://github.com/tellor-io/layer/releases/download/v5.1.1/layer_Linux_x86_64.tar.gz
tar -xvzf layer_Linux_x86_64.tar.gz

# Copy to system-wide location
sudo cp layerd /usr/local/bin/
sudo chmod +x /usr/local/bin/layerd

# Version check
layerd version
```

4\. Node Initialization

```
# Initialize node (replace YOUR_NODE_NAME with your own name)
layerd init "YOUR_NODE_NAME" --chain-id tellor-1

# Download genesis file
curl -Ls https://ss.tellor.nodestake.org/genesis.json > $HOME/.layer/config/genesis.json
```

5\. Port Configuration

```
# Change CUSTOM_PORT value for custom port (default: 45)
CUSTOM_PORT=45

# Port settings
sed -i -e "s|tcp://127.0.0.1:26657|tcp://0.0.0.0:${CUSTOM_PORT}657|g" $HOME/.layer/config/config.toml
sed -i -e "s|:26656|:${CUSTOM_PORT}656|g" $HOME/.layer/config/config.toml
sed -i -e "s|:26658|:${CUSTOM_PORT}658|g" $HOME/.layer/config/config.toml
sed -i -e "s|proxy_app = \"tcp://127.0.0.1:26658\"|proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}658\"|g" $HOME/.layer/config/config.toml
sed -i -e "s|tcp://localhost:26657|tcp://localhost:${CUSTOM_PORT}657|g" $HOME/.layer/config/client.toml
```

6\. Configuration Filesapp.toml Settings

```
# Gas prices
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0loya\"/" $HOME/.layer/config/app.toml

# Enable API
sed -i -e "s/^enable *=.*/enable = true/" $HOME/.layer/config/app.toml
sed -i -e "s/^swagger *=.*/swagger = true/" $HOME/.layer/config/app.toml

# Pruning settings
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.layer/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.layer/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"10\"/" $HOME/.layer/config/app.toml
```

config.toml Settings

```
# Add peer list
PEERS="3037a8c239cdcdcf7fbc0ed050a11ecdc0397374@91.99.194.56:26656,17355981bc61dc3c4169158e3d73f22099a5f9c0@152.53.254.219:41767,5ef1ed1fec8700bf9ee16625db2718997ceb499d@157.180.52.245:41656,23a9da592ee6688eac45c82a256ef302a661469b@195.3.223.78:51656,95e55a6cfb850db8c23e969ddd461eac28b98702@3.91.103.4:26656,7fd4d34f3b19c41218027d3b91c90d073ab2ba66@54.221.149.61:26656,2737f23b2223ab1673ce682afdf50d34633f5f7c@69.250.123.126:26656,9358c72aa8be31ce151ef591e6ecf08d25812993@18.143.181.83:26656,2904aa32501548e127d3198c8f5181fb4d67bbe6@18.116.23.104:26656,2b8af463a1f0e84aec6e4dbf3126edf3225df85e@13.52.231.70:26656,f2644778a8a2ca3b55ec65f1b7799d32d4a7098e@54.149.160.93:26656,5a9db46eceb055c9238833aa54e15a2a32a09c9a@54.67.36.145:26656"

sed -i -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.layer/config/config.toml

# Other settings
sed -i -e "s/^cors_allowed_origins *=.*/cors_allowed_origins = [\"*\"]/" $HOME/.layer/config/config.toml
sed -i -e "s/^timeout_commit *=.*/timeout_commit = \"1s\"/" $HOME/.layer/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"kv\"/" $HOME/.layer/config/config.toml
```

client.toml Settings

```
sed -i -e "s/^chain-id *=.*/chain-id = \"tellor-1\"/" $HOME/.layer/config/client.toml
sed -i -e "s/^keyring-backend *=.*/keyring-backend = \"test\"/" $HOME/.layer/config/client.toml
```

7\. Wallet Creation

```
# Create new wallet (save your seed phrase!)
layerd keys add wallet --keyring-backend test

# Display wallet address
layerd keys show wallet -a --keyring-backend test
```

8\. Ethereum RPC Settings

```
# Get API key from Alchemy or Infura and replace
ETH_RPC_URL="wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY"

# Add environment variables
cat << EOF >> ~/.bashrc
export ETH_RPC_URL="$ETH_RPC_URL"
export ETH_RPC_URL_PRIMARY="$ETH_RPC_URL"
export ETH_RPC_URL_FALLBACK="${ETH_RPC_URL/wss/https}"
export TOKEN_BRIDGE_CONTRACT="0x5589e306b1920F009979a50B88caE32aecD471E4"
EOF

source ~/.bashrc
```

9\. Cosmovisor Installation

```
# Install Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest

# Environment variables
cat << 'EOF' >> ~/.bashrc
export DAEMON_NAME=layerd
export DAEMON_HOME=$HOME/.layer
export DAEMON_RESTART_AFTER_UPGRADE=true
export DAEMON_ALLOW_DOWNLOAD_BINARIES=false
export DAEMON_POLL_INTERVAL=300ms
export UNSAFE_SKIP_BACKUP=true
export DAEMON_PREUPGRADE_MAX_RETRIES=0
EOF

source ~/.bashrc

# Create directory structure
mkdir -p $HOME/.layer/cosmovisor/genesis/bin
cp /usr/local/bin/layerd $HOME/.layer/cosmovisor/genesis/bin/
chmod +x $HOME/.layer/cosmovisor/genesis/bin/layerd

# Test
cosmovisor version
```

10\. Snapshot Download (Fast Sync)

```
# Clean data directory
rm -rf $HOME/.layer/data
layerd tendermint unsafe-reset-all --home $HOME/.layer/ --keep-addr-book

# Download snapshot (30+ GB, be patient)
echo "Downloading snapshot..."
SNAP_NAME=$(curl -s https://ss.tellor.nodestake.org/ | egrep -o ">20.*\.tar.lz4" | tr -d ">")
curl -o - -L https://ss.tellor.nodestake.org/${SNAP_NAME} | lz4 -c -d - | tar -x -C $HOME/.layer

echo "Snapshot successfully loaded!"
```

11\. Create Systemd Service

```
sudo tee /etc/systemd/system/tellor.service > /dev/null <<EOF
[Unit]
Description=Tellor Layer Node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME
ExecStart=$HOME/go/bin/cosmovisor run start --home $HOME/.layer --keyring-backend test --key-name wallet --api.enable --api.swagger
Restart=always
RestartSec=3
LimitNOFILE=65535
Environment="DAEMON_NAME=layerd"
Environment="DAEMON_HOME=$HOME/.layer"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="ETH_RPC_URL=$ETH_RPC_URL"
Environment="ETH_RPC_URL_PRIMARY=$ETH_RPC_URL"
Environment="ETH_RPC_URL_FALLBACK=${ETH_RPC_URL/wss/https}"
Environment="TOKEN_BRIDGE_CONTRACT=0x5589e306b1920F009979a50B88caE32aecD471E4"

[Install]
WantedBy=multi-user.target
EOF

# Start service
sudo systemctl daemon-reload
sudo systemctl enable tellor
sudo systemctl start tellor
```

12\. Check Node Status

```
# Watch logs
sudo journalctl -u tellor -f

# Wait 30 seconds, then check status
sleep 30
curl -s localhost:45657/status | jq '.result.sync_info | {height: .latest_block_height, catching_up: .catching_up}'

# Check peer count
curl -s localhost:45657/net_info | jq -r '.result.n_peers'

# Check current block height
curl -s https://mainnet.tellorlayer.com/rpc/status | jq -r '.result.sync_info.latest_block_height'
```

13\. Validator CreationPrerequisites

* Node must be fully synced (catching\_up: false)
* Minimum 1 TRB token required
* Bridge your TRB tokens from <https://bridge.tellor.io>

Validator Creation Steps1. Balance Check

```
# Show wallet address
layerd keys show wallet -a --keyring-backend test

# Check balance (minimum 1 TRB = 1000000 loya required)
layerd query bank balances $(layerd keys show wallet -a --keyring-backend test)
```

2\. Create Validator JSON File

```
# Get your validator public key
VALIDATOR_PUBKEY=$(layerd tendermint show-validator)

# Create validator JSON file (edit information)
cat > tellor-validator.json << EOF
{
  "pubkey": $VALIDATOR_PUBKEY,
  "amount": "1000000loya",
  "moniker": "YOUR_VALIDATOR_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE",
  "security": "YOUR_EMAIL",
  "details": "YOUR_VALIDATOR_DESCRIPTION",
  "commission-rate": "0.1",
  "commission-max-rate": "0.2",
  "commission-max-change-rate": "0.01",
  "min-self-delegation": "1"
}
EOF
```

3\. Create Validator

```
# Create validator with JSON file (fee is mandatory!)
layerd tx staking create-validator tellor-validator.json \
  --from=wallet \
  --chain-id=tellor-1 \
  --keyring-backend=test \
  --fees="10000loya" \
  -y
```

4\. Check Validator Status

```
# Get your validator address
VALOPER=$(layerd keys show wallet --bech val -a --keyring-backend test)

# Check validator info
layerd query staking validator $VALOPER

# Check on explorer
echo "Explorer: https://tellorexplorer.com/validators/$VALOPER"
```

Useful CommandsService Management

```
sudo systemctl stop tellor      # Stop
sudo systemctl start tellor     # Start
sudo systemctl restart tellor   # Restart
sudo systemctl status tellor    # Check status
sudo journalctl -u tellor -f    # Watch logs
```

Wallet Operations

```
# Wallet list
layerd keys list --keyring-backend test

# Wallet address
layerd keys show wallet -a --keyring-backend test

# Balance check
layerd query bank balances $(layerd keys show wallet -a --keyring-backend test)
```

Node Information

```
# Sync status
layerd status 2>&1 | jq '.SyncInfo.catching_up'

# Node ID
layerd status 2>&1 | jq '.NodeInfo.id'

# Validator info
layerd query staking validator $(layerd keys show wallet --bech val -a --keyring-backend test)
```

Validator Operations

```
# Unjail
layerd tx slashing unjail \
  --from wallet \
  --chain-id tellor-1 \
  --keyring-backend test \
  --fees="10000loya" \
  -y

# Delegate (stake tokens)
layerd tx staking delegate $(layerd keys show wallet --bech val -a --keyring-backend test) 1000000loya \
  --from wallet \
  --chain-id tellor-1 \
  --keyring-backend test \
  --fees="10000loya" \
  -y
```

TroubleshootingNode not starting

```
# Check logs
sudo journalctl -u tellor -n 100

# Check port conflicts
sudo lsof -i :45657
```

Slow synchronization

```
# Check peer count (should be 10+)
curl -s localhost:45657/net_info | jq -r '.result.n_peers'

# Download new snapshot
sudo systemctl stop tellor
rm -rf $HOME/.layer/data
# Repeat snapshot download step
```

Validator not visible

```
# Check jail status
layerd query staking validator $(layerd keys show wallet --bech val -a --keyring-backend test) | jq '.jailed'

# Check if TX was successful
layerd query tx TX_HASH
```

Important Notes

* 🔴 **Always save your seed phrase in a secure location!**
* 🟡 **Ethereum RPC requires Alchemy or Infura API key**
* 🟢 **Edit CUSTOM\_PORT value to change ports**
* 🔵 **Minimum 1 TRB (1000000 loya) required for validator**
* ⚪ **Gas fee is mandatory (--fees="10000loya")**
* 🟣 **Snapshot download is 30+ GB, be patient**

<br>


# Useful Command

#### 🔑 Key management <a href="#key-management" id="key-management"></a>

**Add new key**

```
layerd keys add wallet
```

**Recover existing key**

```
layerd keys add wallet --recover
```

**List all keys**

```
layerd keys list
```

**Delete key**

```
layerd keys delete wallet
```

**Export key to a file**

```
layerd keys export wallet
```

**Import key from a file**

```
layerd keys import wallet wallet.backup
```

**Query wallet balance**

```
layerd q bank balances $(layerd keys show wallet -a)
```

#### 👷 Validator management <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

**Create new validator**

```
layerd tx staking create-validator <(cat <<EOF
{
  "pubkey": $(layerd comet show-validator),
  "amount": "1000000loya",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id tellor-1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025loya \
-y
```

**Edit existing validator**

```
layerd tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id tellor-1 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025loya \
-y
```

**Unjail validator**

```
layerd tx slashing unjail --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Jail reason**

```
layerd query slashing signing-info $(layerd comet show-validator)
```

**List all active validators**

```
layerd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**List all inactive validators**

```
layerd q staking validators -oj --limit=3000 | jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' | jq -r '(.tokens|tonumber/pow(10; 6)|floor|tostring) + " \t " + .description.moniker' | sort -gr | nl
```

**View validator details**

```
layerd q staking validator $(layerd keys show wallet --bech val -a)
```

#### 💲 Token management <a href="#token-management" id="token-management"></a>

**Withdraw rewards from all validators**

```
layerd tx distribution withdraw-all-rewards --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Withdraw commission and rewards from your validator**

```
layerd tx distribution withdraw-rewards $(layerd keys show wallet --bech val -a) --commission --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Delegate tokens to yourself**

```
layerd tx staking delegate $(layerd keys show wallet --bech val -a) 1000000loya --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Delegate tokens to validator**

```
layerd tx staking delegate <TO_VALOPER_ADDRESS> 1000000loya --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Redelegate tokens to another validator**

```
layerd tx staking redelegate $(layerd keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000loya --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Unbond tokens from your validator**

```
layerd tx staking unbond $(layerd keys show wallet --bech val -a) 1000000loya --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Send tokens to the wallet**

```
layerd tx bank send wallet <TO_WALLET_ADDRESS> 1000000loya --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

#### 🗳 Governance <a href="#governance" id="governance"></a>

**List all proposals**

```
layerd query gov proposals
```

**View proposal by id**

```
layerd query gov proposal 1
```

**Vote ‘Yes’**

```
layerd tx gov vote 1 yes --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Vote ‘No’**

```
layerd tx gov vote 1 no --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Vote ‘Abstain’**

```
layerd tx gov vote 1 abstain --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

**Vote ‘NoWithVeto’**

```
layerd tx gov vote 1 NoWithVeto --from wallet --chain-id tellor-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025loya -y
```

#### ⚡️ Utility <a href="#utility" id="utility"></a>

**Update ports**

```
CUSTOM_PORT=110
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.layer/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}90\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}91\"%" $HOME/.layer/config/app.toml
```

**Update Indexer**

**Disable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "null"|' $HOME/.layer/config/config.toml
```

**Enable indexer**

```
sed -i -e 's|^indexer *=.*|indexer = "kv"|' $HOME/.layer/config/config.toml
```

**Update pruning**

```
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.layer/config/app.toml
```

#### 🚨 Maintenance <a href="#maintenance" id="maintenance"></a>

**Get validator info**

```
layerd status 2>&1 | jq .ValidatorInfo
```

**Get sync info**

```
layerd status 2>&1 | jq .SyncInfo
```

**Get node peer**

```
echo $(layerd comet show-node-id)'@'$(curl -4s ifconfig.me)':'$(cat $HOME/.layer/config/config.toml | sed -n '/Address to listen for incoming connection/{n;p;}' | sed 's/.*://; s/".*//')
```

**Check if validator key is correct**

```
[[ $(layerd rad q staking validator $(layerd keys show wallet --bech val -a) -oj | jq -r .consensus_pubkey.key) = $(layerd status | jq -r .ValidatorInfo.PubKey.value) ]] && echo -e "\n\e[1m\e[32mTrue\e[0m\n" || echo -e "\n\e[1m\e[31mFalse\e[0m\n"
```

**Get live peers**

```
curl -sS http://localhost:16957/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}'
```

**Set minimum gas price**

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025loya\"/" $HOME/.layer/config/app.toml
```

**Enable prometheus**

```
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.layer/config/config.toml
```

**Reset chain data**

```
layerd comet unsafe-reset-all --keep-addr-book --home $HOME/.layer --keep-addr-book
```

**Remove node**

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```
cd $HOME
sudo systemctl stop layerd.service
sudo systemctl disable layerd.service
sudo rm /etc/systemd/system/layerd.service
sudo systemctl daemon-reload
rm -f $(which layerd)
rm -rf $HOME/.layerd
rm -rf $HOME/layerd
```

#### ⚙️ Service Management <a href="#service-management" id="service-management"></a>

**Reload service configuration**

```
sudo systemctl daemon-reload
```

**Enable service**

```
sudo systemctl enable layerd.service
```

**Disable service**

```
sudo systemctl disable layerd.service
```

**Start service**

```
sudo systemctl start layerd.service
```

**Stop service**

```
sudo systemctl stop layerd.service
```

**Restart service**

```
sudo systemctl restart layerd.service
```

**Check service status**

```
sudo systemctl status layerd.service
```

**Check service logs**

```
sudo journalctl -u layerd.service -f --no-hostname -o cat
```


# Snapshots

Please use NodeStake snapshots for tellor as we didn't host any tellor snapshot rn :pray:

```
# Clean data directory
rm -rf $HOME/.layer/data
layerd tendermint unsafe-reset-all --home $HOME/.layer/ --keep-addr-book

# Download snapshot (30+ GB, be patient)
echo "Downloading snapshot..."
SNAP_NAME=$(curl -s https://ss.tellor.nodestake.org/ | egrep -o ">20.*\.tar.lz4" | tr -d ">")
curl -o - -L https://ss.tellor.nodestake.org/${SNAP_NAME} | lz4 -c -d - | tar -x -C $HOME/.layer

echo "Snapshot successfully loaded!"
```


# Qie

## Qie

This is the documentation for Qie blockchain node.

**Technical Details:**

* Binary: `qied`
* Chain ID: `qie_1990-1`
* Denom: `aqie`
* Minimum Gas: `0.25aqie`
* Port Prefix: `123XX`
* Home Directory: `$HOME/.qie`


# Installation

## Installation

### Install Dependencies

```bash
sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

### Install Go

```bash
cd $HOME
sudo rm -rf /usr/local/go
VER="1.24.5"
curl -Ls https://go.dev/dl/go$VER.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
mkdir -p ~/go/bin
go version
```

### Download Binary

```bash
cd $HOME
mkdir -p ~/go/bin
wget https://github.com/qieadmin/qiev3-mainnet/releases/download/v3/qiemainnetv3.zip -O qied
chmod +x qied
mv qied ~/go/bin/
```

### Init Node

```bash
qied init "Your_Nodes_Name" --chain-id qie_1990-1 --home $HOME/.qie
```

### Download Genesis and Addrbook

```bash
wget -O $HOME/.qie/config/genesis.json https://backup.codeblocklabs.com/qie_1990-1/genesis.json
wget -O $HOME/.qie/config/addrbook.json https://backup.codeblocklabs.com/qie_1990-1/addrbook.json
```

### Set Custom Ports

```bash
# Set ports in app.toml
sed -i -e "s%:1317%:12317%; s%:8080%:12380%; s%:9090%:12390%; s%:9091%:12391%; s%:8545%:12345%; s%:8546%:12346%; s%:6065%:12365%" $HOME/.qie/config/app.toml

# Set ports in config.toml
sed -i -e "s%:26658%:12358%; s%:26657%:12357%; s%:6060%:12360%; s%:26656%:12356%; s%:26660%:12360%" $HOME/.qie/config/config.toml

# Set node in client.toml
sed -i -e "s|^node *=.*|node = \"tcp://localhost:12357\"|" $HOME/.qie/config/client.toml
```

### Config Pruning

```bash
pruning="custom"
pruning_keep_every="0"
pruning_keep_recent="100"
pruning_interval="19"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.qie/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.qie/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.qie/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.qie/config/app.toml
```

### Set Minimum Gas Price

```bash
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.25aqie\"|" $HOME/.qie/config/app.toml
```

### Set Persistent Peers

```bash
peers="YOUR_PEERS_HERE"
sed -i -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.qie/config/config.toml
```

### Disable Indexing

```bash
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.qie/config/config.toml
```

### Enable and Start Service

```bash
sudo systemctl daemon-reload
sudo systemctl enable qied
sudo systemctl restart qied && sudo journalctl -u qied -f
```




---

[Next Page](/llms-full.txt/1)

