feat(ghostkey): extend the donation ladder to $500 / $2,500 / $10,000 - #100
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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)readsnotary_certificate_{amount}.pemandnotary_signing_key_{amount}.pemfrom$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
infoJSON (including thedelegate-key-createdfield that must never be renamed), per-amount rename, 0600, and it refuses to overwrite existing tiers so the current five cannot be clobbered:Then the six new files need to reach
$NOTARY_DIRon 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
rust/integration_testselects the$20radio, which is untouched.[AI-assisted - Claude]