Manual node installation
Official operator documentationProject websiteSource repository
Network: Testnet
Chain ID: ithaca-1
Recommended hardware: 4 Cores, 8GB RAM, 200GB of storage (NVME)
Go version: 1.23.4
Binary: achillesd
Node home: ~/.achilles
This BonyNode guide is populated. Live peers are discovered from deployed RPC/addrbook data, while snapshots and hosted network files become available on the infrastructure server. Reconfirm the release and chain parameters before production use.
1. Prepare the node host
sudo apt-get update
sudo apt-get install -y ca-certificates curl git jq make build-essential
# Install the exact Go version required by this network from https://go.dev/dl/,
# verify its published checksum, then confirm it before building.
go version # required by project metadata: 1.23.42. Build the pinned node binary
cd $HOME
git clone https://github.com/daodiseomoney/Achilles.git
cd Achilles/achilles
make install
# Verify which binary will be used before initialization.
command -v "achillesd"
"achillesd" versionDestructive cleanup/reset lines were omitted. Existing files must be reviewed manually.
3. Initialize a new node home
set -euo pipefail
BIN="achillesd"
CHAIN_ID="ithaca-1"
MONIKER='validator-name'
NODE_HOME="$HOME/.achilles"
command -v "$BIN"
test ! -e "$NODE_HOME" || { echo "Stop: $NODE_HOME already exists; back it up and review it first." >&2; exit 1; }
"$BIN" init "$MONIKER" --chain-id "$CHAIN_ID" --home "$NODE_HOME"
test -f "$NODE_HOME/config/genesis.json"4. Install and validate genesis
set -euo pipefail
CHAIN_ID="ithaca-1"
NODE_HOME="$HOME/.achilles"
GENESIS_URL='https://testnet-files.bonynode.online/odiseo/genesis.json'
GENESIS_DOWNLOAD="$NODE_HOME/config/genesis.json.download"
test -d "$NODE_HOME/config"
test ! -e "$GENESIS_DOWNLOAD" || { echo "Stop: review the existing $GENESIS_DOWNLOAD first." >&2; exit 1; }
curl --fail --show-error --location --proto "=https" --max-time 120 --output "$GENESIS_DOWNLOAD" "$GENESIS_URL"
jq -e --arg chain "$CHAIN_ID" '.chain_id == $chain' "$GENESIS_DOWNLOAD" >/dev/null
# No published checksum is recorded; the JSON and configured chain ID are validated before replacement.
cp --no-clobber "$NODE_HOME/config/genesis.json" "$NODE_HOME/config/genesis.json.init-backup" || true
install -m 0644 "$GENESIS_DOWNLOAD" "$NODE_HOME/config/genesis.json"
jq -r '.chain_id' "$NODE_HOME/config/genesis.json"5. Configure minimum gas prices
set -euo pipefail
APP_TOML="$HOME/.achilles/config/app.toml"
test -f "$APP_TOML"
cp --no-clobber "$APP_TOML" "$APP_TOML.bonynode-backup" || true
if grep -q '^minimum-gas-prices' "$APP_TOML"; then
sed -i 's|^minimum-gas-prices *=.*|minimum-gas-prices = "65000uodis"|' "$APP_TOML"
else
printf '
minimum-gas-prices = "65000uodis"
' >> "$APP_TOML"
fi
grep '^minimum-gas-prices' "$APP_TOML"Automatic installer
Use the manual guide above until binary provenance, paths, service settings and recovery behavior have been reviewed.
Create or restore wallet
set -euo pipefail
BIN="achillesd"
WALLET="wallet"
[[ "$WALLET" =~ ^[a-zA-Z0-9_-]{1,64}$ ]] || { echo "Invalid wallet name" >&2; exit 1; }
# Create a new key. Store the mnemonic offline; it cannot be recovered by BonyNode.
"$BIN" keys add "$WALLET"
# To restore an existing key, run this separately:
# "$BIN" keys add "$WALLET" --recover
WALLET_ADDRESS=$("$BIN" keys show "$WALLET" -a)
"$BIN" query bank balances "$WALLET_ADDRESS"Create validator
BIN="achillesd"
CHAIN_ID="ithaca-1"
WALLET="wallet"
MONIKER='validator-name'
IDENTITY=''
WEBSITE=''
DETAILS='Independent validator'
AMOUNT="1000000uodis"
COMMISSION_RATE="0.10"
COMMISSION_MAX_RATE="0.20"
COMMISSION_MAX_CHANGE="0.01"
VALIDATOR_FILE=$(mktemp)
trap 'rm -f "$VALIDATOR_FILE"' EXIT
PUBKEY_JSON=$("$BIN" comet show-validator)
jq -e 'type == "object"' <<<"$PUBKEY_JSON" >/dev/null
jq -n --argjson pubkey "$PUBKEY_JSON" --arg amount "$AMOUNT" --arg moniker "$MONIKER" --arg identity "$IDENTITY" --arg website "$WEBSITE" --arg details "$DETAILS" --arg rate "$COMMISSION_RATE" --arg maxRate "$COMMISSION_MAX_RATE" --arg maxChange "$COMMISSION_MAX_CHANGE" '{pubkey:$pubkey, amount:$amount, moniker:$moniker, identity:$identity, website:$website,
security:"", details:$details, "commission-rate":$rate,
"commission-max-rate":$maxRate, "commission-max-change-rate":$maxChange,
"min-self-delegation":"1"}' > "$VALIDATOR_FILE"
"$BIN" tx staking create-validator "$VALIDATOR_FILE" --from "$WALLET" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --fees 65000uodis -yBasic host firewall
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh/tcp
# Review and open the configured P2P port only.
sudo ufw status verboseReversible decommission
This procedure stops and disables the service but retains the node home, binary and service file. Verify the backup before any later deletion.
set -euo pipefail
SERVICE="achillesd"
NODE_HOME="$HOME/.achilles"
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
RETIRED_HOME="$NODE_HOME.retired.$STAMP"
KEY_BACKUP="$HOME/achillesd-validator-keys-$STAMP.tar.gz"
NODE_STOPPED=0
rollback() {
trap - ERR INT TERM
if [ "$NODE_STOPPED" -eq 1 ]; then sudo systemctl start "$SERVICE" || true; fi
exit 1
}
trap rollback ERR INT TERM
test -d "$NODE_HOME"
test ! -e "$RETIRED_HOME"
test -s "$NODE_HOME/config/priv_validator_key.json"
test -s "$NODE_HOME/data/priv_validator_state.json"
sudo systemctl stop "$SERVICE"
NODE_STOPPED=1
# Back up validator identity/state before moving anything.
tar -czf "$KEY_BACKUP" -C "$NODE_HOME" config/priv_validator_key.json config/node_key.json data/priv_validator_state.json
test -s "$KEY_BACKUP"
mv "$NODE_HOME" "$RETIRED_HOME"
sudo systemctl disable "$SERVICE"
NODE_STOPPED=0
trap - ERR INT TERM
echo "Node home was retained at: $RETIRED_HOME"
echo "Critical key backup: $KEY_BACKUP"
echo "No binary, service file or node data was deleted."