Skip to content

feat(ghostkey): extend the donation ladder to $500 / $2,500 / $10,000 - #100

Merged
sanity merged 1 commit into
mainfrom
ghostkey-tiers
Aug 3, 2026
Merged

feat(ghostkey): extend the donation ladder to $500 / $2,500 / $10,000#100
sanity merged 1 commit into
mainfrom
ghostkey-tiers

Conversation

@sanity

@sanity sanity commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Draft on purpose. Merging this before the notary keypairs exist on the API host will charge donors and give them nothing.

The maximum was $100, which is low for anyone who wants to give substantially — and the amount is the only thing an app can condition on. Adds three tiers keeping the exponential shape: $1 / $5 / $20 / $50 / $100 / $500 / $2,500 / $10,000.

The blocking step

get_notary(amount) reads notary_certificate_{amount}.pem and notary_signing_key_{amount}.pem from $NOTARY_DIR. There is no server-side allowlist of amounts — the only thing making a tier work is that its keypair is on disk. Ship a button first and the card is charged, then certificate signing fails, and the donor is paid up with no key. That is the worst failure available in this flow.

The existing script does it correctly — right info JSON (including the delegate-key-created field that must never be renamed), per-amount rename, 0600, and it refuses to overwrite existing tiers so the current five cannot be clobbered:

rust/cli/generate_notary_keys.sh --master-key <master_signing_key.pem> \
    --amounts 500 2500 10000

Then the six new files need to reach $NOTARY_DIR on the API host. Merge only after that is confirmed — ideally after a live $500 purchase end to end, since that is the cheapest of the three to test with real money.

The anonymity cost, stated rather than buried

Larger tiers will have fewer holders, so a certificate at the top of the range narrows its holder to a smaller group than one at the bottom. That group cannot be turned into a name without the payment records, which only the Freenet Project holds and which are never linked to a certificate — so it is a record-retention property, not a weakness in the design.

The page now says this plainly, and points anyone who wants the largest crowd to hide in at the lower tiers. It seemed wrong to add tiers that carry a privacy cost without telling people it exists.

The top two will often decline

$2,500 and $10,000 exceed what many consumer cards authorise. That is a clean decline with no charge — not a charged-without-a-key failure — and the page says so, so it is safe to try one and fall back.

Not changed

  • No custom-amount field. Free-form amounts are near-unique in a certificate and would give away most of what blind signing protects.
  • rust/integration_test selects the $20 radio, which is untouched.

[AI-assisted - Claude]

The maximum was $100, which is low for anyone who wants to give
substantially, and the amount is the only thing an app can condition on.
Adds three tiers, keeping the exponential shape.

## DO NOT MERGE until the notary keypairs exist on the API host

`get_notary(amount)` reads `notary_certificate_{amount}.pem` and
`notary_signing_key_{amount}.pem` from `$NOTARY_DIR`. There is no
server-side allowlist of amounts -- the only thing that makes a tier work
is that its keypair is on disk. If a button ships first, the donor's card
is charged and certificate signing *then* fails, leaving them paid up
with no key.

Generate them with the existing script, which writes the correct `info`
JSON (including the `delegate-key-created` field that must never be
renamed), does the per-amount rename, sets 0600, and refuses to overwrite
existing tiers:

    rust/cli/generate_notary_keys.sh --master-key <master_signing_key.pem> \
        --amounts 500 2500 10000

## On the anonymity cost

Larger tiers will have fewer holders, so a certificate at the top of the
range narrows its holder to a smaller group than one at the bottom. That
group cannot be turned into a name without the payment records, which
only the Freenet Project holds and which are never linked to a
certificate -- so this is a record-retention property rather than a
weakness in the design. The page now says so plainly rather than leaving
a reader to work it out.

## On the top two tiers declining

$2,500 and $10,000 exceed what many consumer cards will authorise. That
is a clean decline with no charge, not a charged-without-a-key failure,
and the page says a decline costs nothing so it is safe to try one.
@sanity
sanity marked this pull request as ready for review August 3, 2026 17:01
@sanity
sanity merged commit b48c70f into main Aug 3, 2026
3 checks passed
@sanity
sanity deleted the ghostkey-tiers branch August 3, 2026 17:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant