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
- Reweight to 11, or substitute a capability? (Not a removal-time decision.)
- Does anything outside the pool read
l2_checkpoints before it is dropped?
- Confirm the Ghost Wallet path covers what ghost-pay users have today before the endpoints go.
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.
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_hashto 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 reverseCapabilityTypeis a plain serde enum with no unknown-variant fallback. #729 hit this addingAddress: 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
capabilitycolumn value in the convergence ledger and the keyChallengeConvergencereconciles on — a stored format, not a label. Historical rows will still carry"ghostpay".3. What it reclaims
l2_checkpointsis 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:
shares_archiveDROPafter v1 — already planned (migrations.rs:2731)verification_ledgerl2_checkpointssbc_batchesTwo of the four now have a named exit, which leaves
verification_ledgeras the genuine long-term storage problem.4. Also removed by this
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_challengestable and the GhostPay arm of the verification rotation./resolveand bond endpoints on ghost-pay, subject to thewraith_bondscheck (confirmed empty on all 8 and dropped by v57).Open questions for whoever picks this up
l2_checkpointsbefore it is dropped?