Off-chain attestation model: GPG-signed predicates for spending conditions
Blinded xpubs: stop server from seeing users balance + entire transaction historyby giving them their own 'blast-radius' key
"Fake it till you make it" predicate blind signing - build the UX first and gather real world feedback from users before trying to build the hard parts
What We Got Right
✓Predicate signing policy concept validated
✓Give the user an xpub, accept a PSBT for signing, all in browser - meet the user where they are, let them use their own wallet + signing flow
✓"Sign after given date" policy by far most popular - users know Bitcoin supports timelocks, no one wants to switch to a new wallet
What We Got Wrong: Technical Limitations
Fundamental Design Flaws
✗Privacy degrades as soon as signing request is submitted
✗Most predicates were external conditions, e.g. asset prices (focused on traders)
- lots of feature requests for conditions, little real world usage
✗ECDSA only (Taproot and MuSig2 offer the potential for greatly improved privacy)
What We Got Wrong
Complete Server Visibility At Signing Time
✗ Server sees predicate, transaction, and signing key (complete visibility)
✗ GPG attestations never checked → security theater
Privacy Gaps Still Remain
We fixed the biggest problem with multisignature privacy (xpub leaks balance + history)
Bad actors (ChainAnalysis / Lazarus Group) can still track/denanonymize users
Threat model was academic instead of real-world
What We've Built with v2
Entire stack transitioned to WebAssembly - pushing as much logic away from the server as possible
Client-side MuSig2 generation - server never sees the signing key
New data structure + DSL for describing complex signing policies and reducing to a single privacy-preserving hash
Server only ever sees a single policy hash and zero knowledge proofs showing a transaction matches the predefined policy - total end to end privacy
Inside a POET: Policy Operand Expression Trees
Complex signing policies encoded as a single 32-byte hash — all logic, zero leakage
How It Works
At Key Registration
Client defines policy, we encode it into a policy operand expression tree
Client requests key from server, derives child key, aggregates with own key
Server only sees: POET 32 byte hash + hash of child key (not the signing key)
At Signing Time
Client submits transaction
WebAssembly generates proofs:
Transaction matches policy clause
Merkle proof clause is in policy tree
Schnorr proof of knowledge binding proofs to transaction
If proofs check out - server provides signature share, client combines signatures and signs transaction
The Future of Bitcoin Signing
✓Arbitrarily complex signing policies with zero-knowledge proofs - POETs support all boolean logic operators as well as all transaction properties
✓Outstanding performance, near infinite flexibility, demonstrably superior privacy
✓Keep your existing wallet and signing flows
✓No software to download - works entirely in browser
✓Perfect privacy, end to end
The HTTPS Moment for Bitcoin Signing
1992: HTTP invented
1995: HTTPS invented - secure HTTP making eavesdropping impossible
1995-2015: HTTPS climbs a decades long wall of worry from "nobody really needs this" to "absolutely essential for every website"
Oblivious Signing is HTTPS for Bitcoin
We now know how to sign transactions withoutl leaking any privacy. Climbing the wall of worry starts now.