← Back to blog
Technical10 min read

The Anatomy of Slashing in Cosmos SDK Chains

"Zero slashing incidents" is the single most quoted line on any validator's website, ours included. But few delegators know what slashing actually is at the protocol level, which makes it hard to judge whether a validator's zero is the product of engineering or of luck. This post explains the machine, then shows how we removed luck from the equation.

Two crimes, two punishments

The x/slashing module in the Cosmos SDK punishes exactly two behaviors, and they are wildly different in severity:

OffenseTypical penaltyJailRecoverable?
Downtime (liveness fault)0.01% of stake~10 minutesYes, unjail and continue
Double-signing (equivocation)5% of stakeForeverNo, tombstoned

The asymmetry is deliberate. Downtime hurts only the network's liveness margin; the protocol treats it as an operational mistake. Equivocation, meaning signing two different blocks at the same height and round, is an attack on safety itself, the raw material of double-spend attempts. The protocol treats it as unforgivable: the validator is tombstoned, permanently banned from ever validating with that consensus key again. Every delegator loses 5%, and their only path forward is to redelegate elsewhere.

How downtime is actually measured

Downtime slashing is governed by a sliding window, not a stopwatch. The parameters on a typical chain:

# x/slashing params (values vary per chain)
signed_blocks_window   = 10000     # the sliding window, in blocks
min_signed_per_window  = 0.05      # must sign at least 5% of the window
downtime_jail_duration = 600s
slash_fraction_downtime = 0.0001   # 0.01%

Read that carefully: with a 10,000-block window and a 5% floor, you are jailed only after missing 9,500 consecutive-ish blocks. At a 5-second block time, that's over 13 hours of continuous failure. Downtime slashing is not something that happens to you in a bad five minutes. It happens when nobody is watching the pager for half a day. This is why our alerting fires on a 100-block missed-precommit window: we want to know about a problem 13 hours before the protocol cares.

How double-signing actually happens

No one double-signs on purpose. In practice, every tombstoning in Cosmos history traces back to one operational pattern: two processes holding the same consensus key at the same time. The classic sequences:

  1. The failover that wasn't. Primary node appears dead; operator starts the backup with a copy of priv_validator_key.json; primary was actually alive behind a network partition. Both sign the next height. Tombstoned.
  2. The migration leftover. Validator moves to a new server; old server still has the key and a systemd unit with Restart=always. Weeks later the old machine reboots. Tombstoned.
  3. The snapshot restore. A VM restored from a disk snapshot comes back with a stale priv_validator_state.json, and re-signs a height it already signed. Tombstoned.

The uncomfortable truth: high availability and double-sign safety pull in opposite directions. A "hot standby with a key copy" is not redundancy. It is a tombstoning waiting for a network partition. Any HA design must make simultaneous signing physically impossible, not just unlikely.

Engineering the risk to zero

Our production stack attacks each failure mode at its root:

What this means for delegators

When you evaluate a validator, "0 slashing incidents" is table stakes. The better questions are structural:

Ask these three questions and you'll learn more than any uptime dashboard will tell you. Our answers are: yes, connection-moving, and 100 blocks.

Downtime costs you 0.01% and ten minutes. Double-signing costs your delegators 5% and costs you the validator, permanently. Engineer for the second; the first takes care of itself.

Ready to put this to work? See the networks we validate or read how we hide validators behind sentries.

slashingcosmos-sdktombstoningconsensusstaking
← All posts Next: Sentry architecture →