Troubleshooting
Common errors people hit when first running an Exfer node, and what to do.
"Address already in use"
ERROR exfer: FATAL: P2P listener failed on 0.0.0.0:9333: Address already in use (os error 98)
Something else is on port 9333. Either:
- Another
exferinstance is already running. Stop it:sudo systemctl stop exfer pgrep -af exfer - Another program owns the port. Identify it:
sudo ss -ltnp | grep 9333 - Pick a different port for this instance:
Note that peers reach you on whatever port you bind. For inbound P2P connections you'll need to map your firewall / NAT to the same port.exfer node --bind 0.0.0.0:19333
"Permissions on node_identity.key are too open"
ERROR exfer: node_identity.key has insecure permissions (0644). Refusing to start.
The file must be owner-readable only (0600). Either fix it manually:
chmod 0600 ~/.exfer/node_identity.key
Or let exfer repair it on startup:
exfer node --datadir ~/.exfer --repair-perms
The latter is the right choice for filesystems that strip permissions (WSL on a Windows drive, certain NAS mounts).
Sync stuck at one height
If get_block_height doesn't move for minutes despite a working network:
- Are the peers healthy? Look at the log for
peer N: ...lines. The sync manager rotates to a different peer after a timeout if one stalls. - Are you still in IBD? During cold-bootstrap, header sync runs first; bodies follow. The tip height only advances once bodies start validating.
- Check disk space. A full disk silently breaks RocksDB writes.
df -h ~/.exfer - Restart cleanly. Some peer-state issues clear on restart.
"Failed to decrypt wallet"
You typed the passphrase wrong, or the file is corrupted. The CLI cannot tell the two apart from outside — both produce a generic decryption failure.
- Try a backup copy of the wallet first.
- If the backup decrypts, the original file is corrupted (probably truncated by a bad copy). Replace with the backup.
- If no backup decrypts, the passphrase is wrong. There is no recovery path.
"Address must be 32 bytes"
You passed an address that isn't 64 hex chars. Check:
- No surrounding whitespace.
- No
0xprefix (Exfer addresses are bare hex). - Length is exactly 64 chars.
echo -n "$ADDRESS" | wc -c # must print 64
"Insufficient funds"
exfer wallet send reports balance is too low to cover amount + fee.
- Check actual balance:
exfer wallet balance --wallet ... --rpc ... - Check
amount: did you mean exfers or EXFER?--amount 10is 10 exfers (0.0000001 EXFER).--amount "10 EXFER"is 10 EXFER. The CLI accepts both forms, but they mean different things. - Mature coinbases only: outputs younger than 360 blocks are excluded.
- Dust outputs (below 200 exfers) are skipped.
RPC returns HTTP 429
You hit a rate limit on the RPC endpoint (typically a community node).
- For
send_raw_transaction: 60 / min / IP. - For UTXO scans (
get_balance,get_address_utxos,get_script_utxos): 30 / min / IP.
Back off and retry with jitter. For sustained workloads, run your own node so you control the rate limits.
Log noise: "rate-limited peer X"
Demoted from WARN to DEBUG in v1.8.1. If you're on an older binary
and the log is dominated by these lines, upgrade to the latest release.
"Failed to deserialize transaction"
You called send_raw_transaction with bytes that aren't a valid Exfer
transaction:
- Wrong serialization format (e.g. used Bitcoin's, not Exfer's — see Protocol specification §5).
- Hex string has odd length or non-hex characters.
- Trailing garbage after the canonical end of the transaction.
Reconstruct with exfer wallet send (which signs correctly), or follow
Wallet developer guide for the byte-level
construction.
When to ask for help
Open an issue at https://github.com/ahuman-exfer/exfer/issues with:
- Exact
exfer --versionoutput. - The complete command you ran.
- The full error message and the previous few lines of log.
- OS, distro version, filesystem (ext4 / btrfs / NTFS-on-WSL / etc.).
The more reproducible the report, the faster it gets fixed.