Hi all.
I’m an independent dev with an applied-cryptography background (ZK and lattice work, mostly), and I’ve been circling the shielded-custody gap on Zcash for a while. Before I write a ZCG application around it, I want to sanity-check the scope with this community, mostly because I’d rather find out now if I’m missing something or stepping on work that’s already in flight.
The thing that bugs me: an org that wants to hold shielded ZEC today basically can’t do it without either a single key or a single custodian. Even the dev-fund lockbox (ZIP-271) sits in a transparent 2-of-3 P2SH, and the largest corporate holder keeps ~290k ZEC with one custodian. Meanwhile the pieces to fix this have quietly come together: FROST 3.0 shipped, frost-rerandomized handles Orchard-style spend auth, PCZT gives you multi-party tx assembly, and the Hackmas work wired zcash-devtool and frost-client together for a signing session. ZF’s own “State of FROST” post said the missing piece is wallet adoption, and “easy multi-sig tools for shielded addresses” is on the ZCG wishlist. So the primitives exist. What’s missing is someone assembling them into something an org would actually trust.
Before writing any of this up I wanted to be sure the primitives hold together on the current network and not just in the demo. So this past week I reproduced the FROST-over-PCZT flow end to end on testnet, and then pushed it onto the Ironwood pool. Short version: I have a 2-of-3 rerandomized-FROST signature authorizing a real Ironwood shielded spend, mined on testnet (txid a5533fe7...487d, height 4164791). I’m happy to share the full reproduction. The public testnet explorers are lagging badly right now (the one I checked is a month behind the tip), so the repro is honestly more useful than the txid if anyone wants to verify.
Getting there surfaced two things I think matter for scoping:
-
zcash-devtool (pczt 0.7 / orchard 0.15) and frost-tools’ zcash-sign (pczt 0.5/orchard 0.11) don’t interoperate anymore. zcash-sign can’t even parse a devtool PCZT. The two ZF tools have drifted apart since Hackmas.
-
On post-NU6.3 testnet everything lands in Ironwood, and the FROST tooling only knows Orchard. zcash-sign injects into the Orchard bundle, and devtool’s own
pczt update-with-signaturehas the shielded path stubbed with a literalTODO: Maybe support thisfor both Orchard and Ironwood. Ironwood spend auth is still RedPallas and
rerandomizable (devtool’s source even calls Ironwood spends “Orchard-shaped”), so FROST
is clearly the right primitive. But as far as I can tell nothing ships that actually
signs an Ironwood spend. I bridged it with two throwaway tools (an Ironwood-aware
external-sig injector and a small non-interactive rerandomized signer) purely to prove
the point. They’re demo glue, not a product. But they made the gap concrete: this works
on the pool that becomes mainnet default on July 28, and nothing assembles it.
Roughly what I’d want to build, three milestones:
- A real DKG ceremony (not trusted-dealer, which rather defeats the purpose) plus rerandomized signing over PCZTs, targeting Ironwood, and a DKG interoperability spec
drafted together with ZF.
2. A coordinator service and hardware-signer integration. Keystone first, since its
shielded PCZT signing actually shipped; Ledger’s Orchard path is merged to their dev
branch but not in a release yet.
3. A viewing-key audit layer: UFVK read access to balances, memos, an exportable ledger.
The boring middle that no org-grade tool covers.
Desktop/CLI first, and honest about the trust model: no party moves funds, everything auditable through viewing keys.
Two things I want to get ahead of:
- There have been a couple of multisig-for-shielded proposals before that didn’t ship. I don’t want to relitigate those. I think the difference this time is that I’m showing up with working code on the current pool and a concrete spec contribution rather than a plan, but if people think those earlier attempts stalled for some other reason (scope, trust model, long-term maintenance), I’d genuinely rather hear it now than after I apply.
- Also, @mahmudsudo recently posted a FROST shielded multi-sig SDK proposal. I don’t see that as competing. A clean SDK over the ZF stack is useful, and I’d rather build on top of it than reinvent that layer. My scope is the product and service around it (the ceremony, coordinator, hardware, audit), plus the Ironwood and interop work that layer would need too. Glad to coordinate so we’re not duplicating effort.
Where I’d most like input, especially from @conradoplg and anyone at ZF:
-
The DKG interop spec. “State of FROST” flagged the missing key-generation standard as
the thing limiting interoperability, and ZIP-312’s non-requirements explicitly leave DKG
out of scope. Is anyone already drafting this? Would ZF be open to co-authoring, and is
ZIP-312 the right home or is this a new ZIP? -
Ironwood. Is there work in flight to bring frost-tools / zcash-sign up to v6 and the
Ironwood pool that I should build on instead of my throwaway injector? I’d much rather
the real signing path live upstream than in my code. -
Trusted-dealer vs DKG for the ceremony. ZIP-312 notes DKG precludes seed-phrase
recovery. For org custody I lean toward DKG with a documented recovery story, but I’d
like a reality check. -
Anything here that overlaps with ZODL / ECC / ZF roadmap work I’m not seeing.
If this is broadly the right shape I’ll turn it into a proper ZCG application with milestones and a budget. Mostly I want to make sure I’m scoping something the protocol folks actually want. Thanks for reading, and I’ll happily post the reproduction steps if there’s interest.
P.S. The application GitHub link as per Alex’s request: Grant Application - Threshold (FROST) custody for shielded ZEC · Issue #358 · ZcashCommunityGrants/zcashcommunitygrants · GitHub