← Back to Home

Node Setup Guide for ICP

Version 1.0.0 — February 14, 2026

Prepare your Nano node to handle requests from the Internet Computer.

Key Requirements

Idempotency-Key Format

Every request includes this header:

Idempotency-Key: icmware-{timestamp_ns}-{counter}-{hash12}

Example: icmware-1699876543210987654-42-a1b2c3d4e5f6

Implementation with Redis

For example, use Redis to deduplicate requests from all replicas:

Step 1 is an optimization — if all replicas arrive simultaneously, the cache will always be empty on first check. The critical path is SET NX → BLPOP.

Critical order when storing result:

redis.setex(cache_key, 60, result)  # 1. Cache FIRST
# 2. Notify ALL waiting replicas (one LPUSH per potential waiter)
for _ in range(num_replicas + buffer):
    redis.lpush(notify_key, "ready")
redis.delete(pending_key)           # 3. Release lock LAST

Wrong order causes race conditions. For state-modifying operations like process, reject requests if Redis is unavailable (return 503).

On node failure, push "error" to notify_key and delete pending_key — otherwise waiters hang until timeout.

Set expire on notify_key (e.g. 60s) to auto-cleanup stale lists in Redis.

In practice, ~91% of duplicates are served from cache (step 1). Only ~1% need BLPOP. The cache check handles the bulk of deduplication.

Register Your Node

Input Limits

FieldMinMaxNotes
url8130Must start with https://
api_key20130Optional
auth_header_name150Optional (default: X-API-Key)
auth_header_prefix20Optional (e.g. Bearer )
# Register as private node (url, opt api_key, opt auth_header_name, opt auth_header_prefix)
dfx canister call 7jsss-6qaaa-aaaad-aegpq-cai register_private_node \
  '("https://your-node.com/rpc", opt "your-api-key")' --network ic

# With custom auth header (e.g. Bearer token instead of X-API-Key)
# register_private_node '("https://your-node.com/rpc", opt "your-token", opt "Authorization", opt "Bearer ")'

# Enable force mode: ALL your requests go through your private node
dfx canister call 7jsss-6qaaa-aaaad-aegpq-cai set_force_node '(true)' --network ic

# Enable force PoW: PoW requests also go through your private node
dfx canister call 7jsss-6qaaa-aaaad-aegpq-cai set_force_pow '(true)' --network ic

# Test it
dfx canister call 7jsss-6qaaa-aaaad-aegpq-cai get_account_info_for_signing \
  '("nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est")' --network ic

Allowed RPC Commands

Public nodes must support these Nano RPC actions:

Accounts:

account_balance account_info account_history account_block_count account_representative account_weight account_key account_get accounts_balances accounts_frontiers accounts_representatives

Receivable:

receivable receivable_exists accounts_receivable

Blocks:

block_info blocks_info blocks block_account block_count

Network:

representatives_online confirmation_quorum confirmation_active confirmation_info frontier_count frontiers version uptime

Transactions:

process republish block_confirm work_generate (optional)

Become a Public Node

Once your node is stable, contact us at info@nanogate.run to register it as a public node. Public nodes serve all NANOGATE users and earn credits instantly for every request they handle.

Note: The same URL cannot be used for both private and public nodes. Use different endpoints if you want to run both.

← Back to Home