Skip to content

L2 removal: capability reweight, the CapabilityType wire hazard, and what it reclaims #736

Description

@defenwycke

Ghost Pay / L2 is being removed once Stage 6 completes. Ghost Wallet replaces it — existing Bitcoin infrastructure for self-custody, payments via Wraith protocol with Ghost locks.

Scoping the consequences now, while the code is still in front of us, rather than discovering them during the removal.

This is a follow-on to Stage 6, not part of it. It changes payout weighting, so it cannot ride the Stage 6 deletion release — that one is already carrying the BFT payout cutover, and stacking a weighting change on a money-path cutover loses the rollback position.

Stage 6 (BFT payout + sweep + gate collapse)
   -> L2 removal + capability reweight
      -> Ghost Wallet

1. GhostPay is +4 of the 15 capability shares

The 5-4-3-2-1 system weights node rewards: Archive +5, GhostPay +4, Public Mining +3, Reaper +2, Elder +1.

Removing ghost-pay means either the maximum drops to 11, or something takes those 4. Either way node reward weighting changes, so it needs a height gate and fleet uniformity like every other weighting change.

⚠ Deciding how to reweight is the real question and it is not obvious. Dropping to 11 silently re-scales every node's relative share; substituting a new capability means defining and verifying one. Neither should be picked during the removal.

It also makes part of #605 moot rather than fixed

#605 asks for GhostPay's epoch_state_hash to be anchored in a fleet-visible commitment, because today a node with no L2 at all passes with a random hex string. If the capability is being deleted, that work should not be done. Close that item as superseded rather than building it.

2. CapabilityType::GhostPay — the same wire hazard as H-7, in reverse

CapabilityType is a plain serde enum with no unknown-variant fallback. #729 hit this adding Address: a peer on an older binary does not ignore an unknown variant, it fails to deserialise the whole message and drops the verdict silently.

Removal is the worse direction. A node still on the old binary emitting "ghostpay" to an upgraded peer makes that peer drop the entire message — so during any mixed-version window, upgraded nodes discard verdicts from un-upgraded ones, including verdicts about capabilities that are not being removed.

So the removal needs the same treatment the addition got: ship the tolerance first, roll the whole fleet, then remove the emitter. Not one release.

Also to check before removing the variant: it is the capability column value in the convergence ledger and the key ChallengeConvergence reconciles on — a stored format, not a label. Historical rows will still carry "ghostpay".

3. What it reclaims

l2_checkpoints is 443 MB of the 5.3 GB pool DB (measured on vm1, 2026-08-22).

That matters because #690 is a working-set problem — the DB does not fit in RAM on 7 of 8 nodes (20-27% iowait against vm8's 0.9% on identical work). Revised outlook for the four big consumers:

table size fate
shares_archive 2.6 GB DROP after v1 — already planned (migrations.rs:2731)
verification_ledger 1.0 GB #585 retention — the one with no exit yet
l2_checkpoints 443 MB goes with this removal
sbc_batches 133 MB kept deliberately; migrations must stay replayable

Two of the four now have a named exit, which leaves verification_ledger as the genuine long-term storage problem.

4. Also removed by this

  • The L2 nullifier checkpoint tree and its sync (nullifier_route_handler.rs). Nodes currently run a continuous catch-up on it — measured closing at 86 heights/min on 2026-08-22 — which is real I/O on the small nodes. Deliberately not fixed, since it is going.
  • ghostpay_challenges table and the GhostPay arm of the verification rotation.
  • The /resolve and bond endpoints on ghost-pay, subject to the wraith_bonds check (confirmed empty on all 8 and dropped by v57).

Open questions for whoever picks this up

  1. Reweight to 11, or substitute a capability? (Not a removal-time decision.)
  2. Does anything outside the pool read l2_checkpoints before it is dropped?
  3. Confirm the Ghost Wallet path covers what ghost-pay users have today before the endpoints go.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions