Vote for your favorite SkillMD. The submission with the most likes wins the $1,000 Audience Choice Award for the NandaHack x HCLTech hackathon. Voting is open through September 25.Vote now →
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

Author

Status
Merged
Merged on
Jul 9
Branch
hackathon/moltpass-bonded-root-trust

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 diff

Checkout locally

git fetch origin pull/53/head:pr-53
git checkout pr-53