Skip to content

v2.3.0

Choose a tag to compare

@jesuspirate jesuspirate released this 06 Jun 02:37
v2.3.0
83d510b

v2.3.0 — Close the arbiter door

Compatibility: SOFT — no wire breakage, no lockstep. Provenance is a
client-side display check (no protocol change). The committed substitution
grace is an additive, optional LOCK field, consensus-safe exactly like the
trade expiry: old clients ignore it and keep working, and a trade without it
behaves byte-identically to v2.1/v2.2. Every flow works across v2.0.x / v2.1 /
v2.2 / v2.3 in any mix.

The door we just closed

  • A trade's community arbiters ride in on the listing, set by the creator's own
    app. Until now Chama only checked that the chosen arbiter belonged to THAT
    pool — never that the pool was the community's real one. A hostile creator
    could stuff the pool with sock-puppet keys they control; in a dispute "the
    neutral arbiter" would be theirs, and a creator who is also a party could
    effectively seat two of the three escrow shares. (Healing was never exposed —
    it's refund-only to the rightful locker. The hole was normal dispute
    arbitration.)
  • This is the direct answer to "what stops someone adding an arbiter to cheat
    everyone?"

Arbiter provenance (informed consent, not a blunt block)

  • Every trade now classifies its arbiter pool against the set your device
    recognizes for that community. The trade room shows a quiet green
    "Community-verified arbiters" tick when every name checks out — and an amber
    "⚠ Unrecognized arbiter(s)" card, naming the exact keys, the instant the pool
    contains arbiters Chama doesn't know for that community.
  • It's visible to everyone, including the person about to lock sats — the
    moment money goes at risk. Deliberately a warning, not a hard reject:
    rejecting at the protocol level would turn a stale registry into a
    funds-stranding bug. The threat here is trust, so the close is consent.
  • The official community pool is the shared baseline, so two honest sides on it
    always agree (green); a stuffed pool outs its foreign keys the instant the
    counterparty looks.

Substitution grace, now consensus-safe and tunable

  • The window an absent arbiter keeps a dispute to itself before a backup may
    step in is now committed into the LOCK (like the trade expiry), so every
    client computes the identical step-in moment. Absent ⇒ the same 4h default as
    before.
  • It can only ever make backups eligible SOONER, never later (a longer window
    would just delay rescue of the locker's own funds, and a trade refunds at
    expiry regardless). Still adaptively floored by half the trade's remaining
    life, so short trades stay sane.
  • Me › Advanced (power-user): TEST SUBSTITUTION GRACE — set a short floor (e.g.
    60s) to exercise backup step-in on demand instead of waiting hours. Sits next
    to TEST TRADE EXPIRY; clear it after testing.

Design groundwork

  • docs/DESIGN-arbiter-economy.md captures the longer arc this opens: signed
    community rosters, consensus admission (you can't add yourself — the
    community admits you), duty-pays-not-power arbiter fees, response-window
    rotation, bonds, and reputation as the real collateral. Four invariants are
    written down and load-bearing — chief among them, still: no vote-flip
    backdoor, ever; high-stakes change goes to community consensus, not a
    maintainer.

Numbers

  • 2,211 tests green (+24), including the provenance classifier (verified /
    stuffed / hostile / empty / case-dupe / operator-trusted) and the committed
    grace (clamp bounds, half-life interplay, and a full LOCK→dispute round-trip).