Skip to main content

Decision

Nodes are ranked by a reputation score in [0.0, 1.0] derived from:
  • 70% local observations — what this node has seen about its counterparty in direct interaction
  • 30% gossip-propagated reports — weighted by the reporter’s effective settled value
Only staked nodes may submit gossip reports. Clients contribute via local scores only.

Score semantics

Reputation enters the unified selection score as an inverse-square factor (network):
score = rate_per_mb × rtt_ms × (1 / max(reputation, 0.1)²)
The 0.1 floor prevents new or just-slashed nodes from being unreachable; they pay a 100× handicap but can still earn some traffic and rebuild reputation.

Reporter weighting

A report’s weight is a function of the reporter’s effective settled value:
  • Total settled value through the reporter’s channels (on-chain verifiable).
  • Counterparty diversity — minimum 5 distinct counterparties for full credit. A node that only settles with itself and two Sybils gets a reduced weight.
  • Time decay — half-life ~7 weeks. Historical settlement matters less than recent.
  • Normalization across tokens — production normalizes multi-token settlement volumes to a common unit.
  • 3× cap on any individual reporter’s weight — keeps manipulation expensive while allowing some incumbency advantage.

Clamping and cold-start

  • Per-report clamp — a single report can move the target’s score by at most a bounded amount. Prevents flash-crashes from coordinated negatives.
  • Decay toward neutral — in the absence of fresh data, scores drift toward a neutral value. A node that stops participating loses reputation eventually but not instantly.
  • Cold-start bootstrap — new nodes get initial traffic via a small reputation bonus. One-time per operator Ethereum address to prevent re-staking abuse (drop stake, restake, get the bonus again).

What triggers reports

Interaction outcomes generate reports. Examples:
EventLocal score changeGossip report?
Clean delivery, valid voucher acceptedSmall positiveOptional
BLAKE3 mismatch mid-streamLarge negativeYes
Probe has_blob=true but stream failedNegativeYes (candidate for phantom-announcement slashing)
Rate advertised ≠ rate chargedNegativeYes (candidate for rate-manipulation slashing)
Reports are signed by the reporter and propagated on the cdn/reputation/v1 gossip topic.

Why not purely on-chain?

On-chain reputation scales poorly — thousands of report transactions per hour on mainnet would be cost-prohibitive. The design keeps reports in gossip (cheap) and only escalates to on-chain slashing when the report crosses an evidentiary bar. Reporter-weight verification uses on-chain settlement as its anchor, so the weighting is auditable without all reports going on-chain. Source ADR: 008-reputation.md