Skip to main content

Decision

Clients pay nodes per MB over off-chain payment channels settled on-chain. On a cache miss, nodes pay peers per MB for initial content pulls, then amortize that cost across many client deliveries. Origin-backed nodes set the effective price ceiling (their backend egress costs). Rates are fully market-driven within governance-set bounds.

Channel lifecycle

Voucher format

Voucher {
    channel_id: H256,
    amount: U256,           // cumulative, not delta
    nonce: u64,
    token: Address,
    signature: Eip712Sig,
}
Cumulative amount means any voucher supersedes all lower-amount vouchers for the same channel. A node can safely discard old vouchers — only the highest-amount voucher matters at settlement.

Voucher cadence

Default 1 MB per voucher. Negotiable per-stream for large blob transfers — a 10 GiB file over 1 MB cadence produces 10,240 signatures; 10 MB cadence reduces that to ~1,024 with negligible risk increase (worst-case loss if the node cheats is 10 MB of unpaid delivery). Cadence is set by the client in StreamRequest.

Rate discovery and bounds

  • Per-node rate advertised in NodeAnnounce and ProbeResponse.
  • Governance-set bounds per token. A node advertising a rate outside [MIN_RATE, MAX_RATE] is clamped locally; gossip-propagated reports penalize the node’s reputation.
  • Rate changes are gossip-announced via RateChange messages. RateChange carries a slash_sig so the message can serve as on-chain counter-evidence in rate-manipulation disputes (slashing).

Node bindings

Nodes join via StakingRegistry.registerNode() (network), which atomically establishes:
  • EIP-712 NodeId ↔ Ethereum address binding — for slashability and payment attribution
  • ed25519 ownership proof — to prevent NodeId squatting
bindNodeId() remains available for post-registration key rotation. Client bindings are ephemeral (per-session). Clients register no on-chain identity for payments; each channel-open carries the client’s Ethereum address, and closes return unspent deposit to that same address.

Dispute window

Default: 48 hours (within the governance-bounded range of 12h–72h). Chosen to provide ≥24 h of effective response time even if Arbitrum’s sequencer censors the dispute transaction — Arbitrum’s forced-inclusion path has a ~24 h upper bound.

Token semantics

The PaymentChannel contract maintains a governance-managed ERC-20 allowlist with per-token rate bounds — see multi-token. Source ADR: 003-payments.md