Skip to main content

Introduction

This guide walks you through setting up a non-validator full node for Fenine Network. A full node maintains a complete copy of the blockchain and can serve RPC requests for dApps.
Setup time: ~2-3 hours (including sync time)

Prerequisites

Before you begin, ensure you have:
✅ Server meeting hardware requirements
✅ Ubuntu 22.04 LTS (or compatible Linux distribution)
✅ Root or sudo access
✅ Stable internet connection (100 Mbps+)
✅ Static IP address (recommended)

Installation Steps

1

Update System

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git curl wget
2

Download Fene-Geth

Download the latest Fenine node binary:
# Create directory
mkdir -p ~/fenine
cd ~/fenine

# Download latest release
LATEST_VERSION=$(curl -s https://api.github.com/repos/fenines-network/fene-geth/releases/latest | grep tag_name | cut -d '"' -f 4)
wget "https://github.com/fenines-network/fene-geth/releases/download/${LATEST_VERSION}/fene-geth-linux-amd64.tar.gz"

# Extract
tar -xzf fene-geth-linux-amd64.tar.gz

# Move to PATH
sudo mv fene-geth /usr/local/bin/

# Verify installation
fene-geth version
Expected output:
Fene-Geth
Version: 1.x.x
Architecture: amd64
Protocol Versions: [65]
Network Id: 89
3

Create Data Directory

# Create data directory
sudo mkdir -p /var/lib/fenine

# Set permissions
sudo chown -R $USER:$USER /var/lib/fenine
4

Download Genesis File

# Download mainnet genesis
wget https://raw.githubusercontent.com/fenines-network/genesis/main/mainnet.json \
  -O /var/lib/fenine/genesis.json

# Verify checksum
sha256sum /var/lib/fenine/genesis.json
# Should match: [GENESIS_CHECKSUM_HERE]
5

Initialize Node

# Initialize with genesis
fene-geth init /var/lib/fenine/genesis.json \
  --datadir /var/lib/fenine

# Expected output:
# INFO [MM-DD|HH:MM:SS.mmm] Successfully wrote genesis state
6

Configure Node

Create configuration file:
nano /var/lib/fenine/config.toml
Add the following configuration:
[Eth]
NetworkId = 89
SyncMode = "full"
NoPruning = false

[Node]
DataDir = "/var/lib/fenine"
HTTPHost = "0.0.0.0"
HTTPPort = 8545
HTTPVirtualHosts = ["*"]
HTTPModules = ["eth", "net", "web3", "fenine"]

WSHost = "0.0.0.0"
WSPort = 8546
WSOrigins = ["*"]
WSModules = ["eth", "net", "web3", "fenine"]

[Node.P2P]
MaxPeers = 50
NoDiscovery = false
ListenAddr = ":30303"

BootstrapNodes = [
  "enode://[BOOTNODE_1]@bootnode1.fene.app:30303",
  "enode://[BOOTNODE_2]@bootnode2.fene.app:30303",
  "enode://[BOOTNODE_3]@bootnode3.fene.app:30303"
]
Contact support@fene.network for official bootnode addresses.
7

Create Systemd Service

Create a systemd service for auto-start:
sudo nano /etc/systemd/system/fenine.service
Add:
[Unit]
Description=Fenine Full Node
After=network.target

[Service]
Type=simple
User=$USER
ExecStart=/usr/local/bin/fene-geth \
  --config /var/lib/fenine/config.toml \
  --cache 4096 \
  --maxpeers 50
Restart=on-failure
RestartSec=10
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
Enable and start:
sudo systemctl daemon-reload
sudo systemctl enable fenine
sudo systemctl start fenine
8

Verify Node is Running

Check node status:
# Check service status
sudo systemctl status fenine

# View logs
sudo journalctl -u fenine -f

# Check sync status
curl -X POST http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "eth_syncing",
    "params": [],
    "id": 1
  }'
If syncing, you’ll see:
{
  "result": {
    "currentBlock": "0x1234",
    "highestBlock": "0x5678",
    "startingBlock": "0x0"
  }
}
If synced:
{
  "result": false
}

Post-Installation

Configure Firewall

# Allow SSH
sudo ufw allow 22/tcp

# Allow P2P
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp

# Allow RPC (optional - only if serving public traffic)
# sudo ufw allow 8545/tcp
# sudo ufw allow 8546/tcp

# Enable firewall
sudo ufw enable
Security: Only expose RPC ports (8545, 8546) if you need to serve public traffic. For production, use a reverse proxy (nginx) with authentication.

Test RPC Endpoint

# Get current block number
curl -X POST http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "eth_blockNumber",
    "params": [],
    "id": 1
  }'

# Get network ID
curl -X POST http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "net_version",
    "params": [],
    "id": 1
  }'

Connect from Web3

Test with ethers.js:
import { ethers } from "ethers";

const provider = new ethers.JsonRpcProvider("http://YOUR_NODE_IP:8545");

// Test connection
const blockNumber = await provider.getBlockNumber();
console.log("Current block:", blockNumber);

const network = await provider.getNetwork();
console.log("Chain ID:", network.chainId); // Should be 89

Archive Mode (Optional)

For blockchain explorers or analytics, enable archive mode:
Archive mode requires significantly more disk space (4TB+ recommended).
Update config.toml:
[Eth]
SyncMode = "full"
NoPruning = true  # Keep all historical states
Restart node:
sudo systemctl restart fenine

Useful Commands

Node Management

# Start node
sudo systemctl start fenine

# Stop node
sudo systemctl stop fenine

# Restart node
sudo systemctl restart fenine

# View logs (real-time)
sudo journalctl -u fenine -f

# View logs (last 100 lines)
sudo journalctl -u fenine -n 100

Blockchain Operations

# Attach to console
fene-geth attach /var/lib/fenine/geth.ipc

# Inside console:
> eth.blockNumber
> net.peerCount
> admin.peers
> exit

Next Steps

Monitoring

Set up monitoring and alerts

Backup & Recovery

Backup strategies

Troubleshooting

Common issues and solutions

Upgrade Guide

How to upgrade your node