GitHub Issue: https://github.com/ZcashCommunityGrants/zcashcommunitygrants/issues/490
Requested: $16,500, two milestones, each paid only once accepted, no startup payment
Applicant: Khadim, solo developer of OpenPGP Wallet (open source, MIT)
Why this, and why now
FROST 2-of-3 with a second device the user owns, such as their phone, removes the weak spot of every software wallet: the moment the full spending key sits in RAM on one machine, and a confirmation screen drawn by that same machine.
This week, three wallets turned out to be building it for shielded ZEC: Zkool already ships FROST accounts, NoirWallet published its Secure Vault design, and I published mine the day before (design thread linked below). The architectures converge almost step by step, but each wallet is defining its own coordinator-to-signer messages and its own share backups. Without a common spec:
- a co-signer from one wallet can’t co-sign for another, so every signer of an account tends to come from one publisher, and one compromised release pipeline or store account can reach the 2-of-3 threshold on its own;
- a FROST backup only restores in the app that made it. Hanh put it plainly earlier: there is no standard for FROST account backups yet;
- every team works out the same subtle points alone (randomizers derived from the signers’ commitments, the confidential channel ZIP 312 requires, the ZIP 374 signer checks).
What the grant funds
An open, versioned specification with test vectors, a standalone Rust crate that implements it, and a working reference implementation, tested on testnet and mainnet:
- Milestone 1, $9,000, 6 weeks. A FROST 2-of-3 account in the OpenPGP Wallet desktop app (frost-core DKG, re-randomized signing over PCZT with the Ironwood bundle), a test co-signer speaking the QR protocol, reproducible 2-of-3 Ironwood spends on testnet and mainnet, and spec draft v0.1 posted here for review.
- Milestone 2, $7,500, 5 weeks. The standalone crate on crates.io; the share backup format with a profile that needs no recovery phrase and a mnemonic profile; the recovery flow (sweep to a fresh FROST account); spec v1.0 after review; and an audit scope for the independent audit.
Testing happens on both testnet and mainnet, with small amounts. A public mainnet release for all users waits for the Ironwood viewing-key standard (zcash/zips#895, ZIP 2005) and an independent audit. An Android co-signer built on the same crate would be a follow-up request. Nothing in this grant pays for the other networks my wallet supports.
Where things stand
The wallet is live (17 releases since September, shielded ZEC on librustzcash, Ironwood since NU6.3). FROST is not implemented yet: I’m building the desktop testnet proof now and will post the transaction ID here before the committee votes. Three beta testers from my circle will try the builds, and I’ll post their results here. Anyone here who wants to reproduce the spend is very welcome too.
Links
- Design thread: FROST 2-of-3 between a user's own devices for shielded ZEC (Ironwood)
- Common spec proposal in NoirWallet’s thread: NoirWallet: FROST Multi-Device Signing Design - #4 by Khadim
- White paper v0.1: FROST white paper — OpenPGP Wallet
- Code (MIT): https://github.com/OpenPGP-Wallet/openpgp-wallet
Questions, objections and reviews are all welcome, especially from other wallet teams: @noir_wallet @hanh @conradoplg