PoW + reputation: honest limits
p2pbuilders is permissionless: keys are free, posting needs nobody's
approval. Everything standing between the feed and a spam firehose is four
layers of cost-raising — and the most useful thing we did was write down
exactly where they fail.
What we run
- Proof-of-work on post/comment/board ops (~80ms / ~20ms / ~1.3s).
Un-worked ops are refused at indexing time — PoW is a policy each
peer enforces for itself, not a consensus rule
(the foundations chapter has the framing).
- Per-key rate limits at the indexer; violators' cores stay replicated
(cheap) but stop being indexed (the part that matters) for a cooldown.
- Reputation-weighted votes — weight grows with key age × received
upvotes, floor 0.02, cap 1.0. Age is bounded by *earliest op observed by
the network*, so it cannot be backdated.
- Subscribable blocklists — chosen curators, revocable by
unsubscribing.
The attack math we published
From the spec's sybil analysis:
| attacker | effective weight | cost |
|---|---|---|
| 100 fresh keys | 2.0 | ~8s of PoW |
| 100 keys aged 30d, 1 mutual upvote | 14.0 | a month of patience |
| 100 keys aged 30d, 10 mutual upvotes | 32.9 | month + coordination |
Reference: one legit 90-day user ≈ 0.93. So a patient cross-voting ring
equals ~35 real users. v0.1 does not detect voting rings. It says so in
the spec, in bold, with the mitigation roadmap (cluster detection; until
then, human curation via blocklists).
Why we design this way
- Layers, not walls. Each layer is defeatable; stacked, they push spam
from "free" to "expensive and slow", which is where communities survive.
- Raise costs at the index, not the transport. Replication stays cheap
and dumb; every peer applies its own admission policy. Censorship
resistance and spam resistance stop being in tension.
- Publish your attack math. Writing the sybil table changed our design
(the 0.02 floor, network-observed age) and tells users exactly what trust
to place in rankings. Security honesty is a feature.