Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.blindference.xyz/llms.txt

Use this file to discover all available pages before exploring further.

Running a Node

Prerequisites

Before starting the daemon, you must have:
  1. Initialized your nodeblindference-node init completed
  2. Attested with the ICLblindference-node attest --mock (or interactive flow)
Without attestation, the daemon will exit with:
Error: No attestation found. Run `blindference-node attest` first.

Start the Daemon

# Interactive — prompts for keystore password
blindference-node run

# Non-interactive — uses environment variable
export BLF_KEY_PASSWORD=secure_password
blindference-node run
The daemon starts three concurrent loops:
LoopFrequencyPurpose
ICL HeartbeatEvery 60sProves liveness to ICL (free REST call)
On-Chain HeartbeatEvery 10 daysProves liveness to NodeRegistry (gas tx)
Attestation WatchdogEvery 10minAuto-re-attests if certificate expires within 6h
Assignment PollerEvery 5sPolls ICL for pending inference jobs

Daemon Lifecycle

Job Execution Flow

When an assignment is received, the worker executes:

Monitoring the Daemon

Console Output

The daemon logs to stdout with structured log lines:
[2026-05-18T10:25:00] [INFO   ] [0xdDef3Cf5] Daemon starting ...
[2026-05-18T10:25:00] [INFO   ] [0xdDef3Cf5]   Address : 0xdDef3Cf5A4d0A6404Bc084D74de3E2c0d6147dA5
[2026-05-18T10:25:00] [INFO   ] [0xdDef3Cf5]   Tier    : 0
[2026-05-18T10:25:00] [INFO   ] [0xdDef3Cf5]   Models  : qwen2.5-7b
[2026-05-18T10:25:00] [INFO   ] [0xdDef3Cf5]   Cert    : expires in 604663s
[2026-05-18T10:25:00] [INFO   ] [0xdDef3Cf5] Heartbeat sent to ICL
[2026-05-18T10:25:00] [INFO   ] [0xdDef3Cf5] No assignments for last 60s
[2026-05-18T10:35:00] [INFO   ] [0xdDef3Cf5] Received 1 assignment(s)
[2026-05-18T10:35:00] [INFO   ] [0xdDef3Cf5] Spawning leader job 0xabc123...
[2026-05-18T10:35:00] [INFO   ] [0xdDef3Cf5] Job 0xabc123: starting as leader
[2026-05-18T10:35:00] [INFO   ] [0xdDef3Cf5] Job 0xabc123: claimed

Log Levels

LevelUse
DEBUGFull request/response bodies, CoFHE operations, model prompts
INFOHeartbeats, job starts/completions, attestation events
WARNINGClaim failures, heartbeat failures, CoFHE errors (non-fatal)
ERRORJob aborts, attestation failures, IPFS failures
Set log level via environment:
BLF_LOG_LEVEL=DEBUG blindference-node run

Stopping the Daemon

Press Ctrl+C (SIGINT) or send SIGTERM:
kill -SIGTERM <pid>
The daemon handles shutdown gracefully:
  1. Stops accepting new assignments
  2. Waits for running jobs to complete (or timeout)
  3. Sends final heartbeat
  4. Exits

Running Multiple Nodes

You can run multiple nodes on the same machine (for testing) by using different config directories:
# Node 1
export BLF_CONFIG_PATH=/tmp/node1/config.json
blindference-node init
blindference-node run

# Node 2 (in another terminal)
export BLF_CONFIG_PATH=/tmp/node2/config.json
blindference-node init
blindference-node run
Each node needs a unique wallet and should use a unique ICL operator key.

Background Operation

Using systemd (Linux)

Create /etc/systemd/system/blindference-node.service:
[Unit]
Description=Blindference Node Daemon
After=network.target

[Service]
Type=simple
User=blindference
Environment=BLF_KEY_PASSWORD=secure_password
Environment=BLF_LOG_LEVEL=INFO
WorkingDirectory=/home/blindference
ExecStart=/usr/local/bin/blindference-node run
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl enable blindference-node
sudo systemctl start blindference-node
sudo systemctl status blindference-node

Using Docker

docker run -d \
  --name blindference-node \
  -e BLF_KEY_PASSWORD=secure_password \
  -e BLF_ICL_ENDPOINT=https://icl.blindference.xyz \
  -v /host/config:/root/.blindference \
  blindference-node

Using nohup / screen / tmux

# Simple background
nohup blindference-node run > node.log 2>&1 &

# Or with screen
screen -S blindference
blindference-node run
# Detach: Ctrl+A, D
# Reattach: screen -r blindference