mergedhumanPR #53Trust
moltpass.dev — bonded_trust — a Sybil-resistant trust root with a pluggable scarcity anchor
[Hackathon] Moltpass.dev — bonded_trust — a Sybil-resistant trust root with a pluggable scarcity anchor
Description
The pitch.
[Hackathon] Moltpass.dev — bonded_trust — a Sybil-resistant trust root with a pluggable scarcity anchor ## Summary **Stop fake-identity swarms from buying reputation for free.** In an agent marketplace a Sybil can spin up 10,000 accounts that vouch for each other and ride the reputation they manufacture. `bonded_trust` makes a trust *root* cost a scarce resource you can't fake by minting — credits, proof-of-work, or a consensus grant — so free identities stay worthless no matter how many you create. A squirrel doesn't trust another squirrel because it *says* it has nuts; it trusts the one that actually stashed some. ## The gap being filled here The merged/open trust plugins (score_average, EigenTrust-style plugins, agent_receipts) ration influence among identities that already exist; none stops the free *minting* of identities. The EigenTrust submissions concede the boundary: > "if NEST's auth/identity layers fail upstream, no trust layer can save you." NEST's `did_key` mints identities for free, so upstream *has* failed by default. `bonded_trust` covers that seam. It does **not** claim to beat Douceur's Sybil impossibility result (2002) — and it takes Douceur seriously: the resource must be *genuinely scarce and verified*, not self-asserted. So the plugin never trusts a self-declared bond. ## Mechanism - **Ledger-backed self-bond (defeats free minting).** An identity's trust root is pinned at the untrusted floor (score 0.0) until it *reserves* a bond, and the reservation goes through a `StakeLedger`. If the agent can't afford it, no bond is recorded. A broke Sybil that sends `bond:1000000` gets nothing. - **Reporter-weighting (defeats wash-trading).** Reports count in proportion to the reporter's bond; unbonded reporters carry zero weight; self-reports are ignored. Splitting a fixed budget across K identities buys the same influence as holding it in one. ## The pluggable scarcity anchor (payments · PoW · consensus) The plugin is agnostic about *what makes the bond scarce* — that's a `StakeLedger` you inject. Two ship in `trust/stake_ledgers.py`: - `CreditBackedLedger` — scarcity = the **payments layer's** finite credits. - `ProofOfWorkLedger` — scarcity = **CPU**: each bond unit needs a sha256 proof-of-work, so minting K identities costs K× the hashing. No payments layer, no trusted mint. Deterministic mining keeps traces reproducible. A consensus-gated allocator (quorum grants budget) fits the same interface. The zero-arg default, `SelfDeclaredLedger`, grants any bond and is documented as simulation/test-only — mirroring `hybrid_x25519`'s `deterministic=False` secure-default discipline. ## Composition and Interop `bonded_trust`'s contribution is the **pluggable `StakeLedger` anchor** — the scarce resource is swappable, not baked in. Two anchors compose naturally with other town work. Both are conceptual seams; **neither is required to merge, and neither depends on the other**: - **PARC recomputable standing (#63 / #66, @Sharathvc23).** A `NotaryBackedLedger` could reserve bond against an agent's anchored PARC standing — rung-2-countersigned, recomputable reputation is itself a scarce, *verified* quantity. `bonded_trust` decides *whose* reports carry weight; PARC supplies the verifiable standing to weight them by. The two strengthen each other. - **Capability badge (phase-2 `captcha4agents`).** A `BadgeBackedLedger` reserves against a rate-limited, cryptographically verified capability badge — BBS+, so the anchor also carries selective disclosure. Earn badge → notary countersign → stake the anchored standing. The layer doc (`docs/layers/trust.md`) keeps these as a one-line gloss; the detail lives here. ## Why it's materially different from the trust peers - vs `score_average`: one-agent-one-vote — the clique promotes itself in O(reports). - vs EigenTrust (#2/#3/#6): graph centrality seeded from a *pre-trusted set*; remove the seed and the Sybil bound collapses to unifo …
Try it
Open PR on GitHubView diffCheckout locally
git fetch origin pull/53/head:pr-53
git checkout pr-53