I’d like to share an early-stage open-source project: zcash_dart, a low-level Dart library for working with the Zcash protocol.
The goal of this project is to provide a correct, protocol-faithful Dart implementation of Zcash cryptography and transaction construction, suitable for wallets, SDKs, and developer tooling.
Highlights
Full support for Sapling, Orchard, and Transparent transactions
Transaction creation, signing, serialization, and verification
PCZT (Partially Constructed Zcash Transactions) support
ZIP-32 / BIP-32 HD wallet functionality
Unified Addresses, Sapling, Sprout, and Transparent address types
Dart port of Zcash incremental Merkle tree
Zero-knowledge proof systems:
PLONK (pure Dart + Rust FFI / WASM)
Groth16 (pure Dart + Rust FFI / WASM)
Pure Dart implementations for zero-knowledge proofs are very slow; Rust FFI / WASM backends are recommended.
Project status: early release, not production-ready. APIs may change and test coverage is still evolving.
Great work! Dart/Flutter has been a gap in the ecosystem. We built ZChat on Rust SDK - Dart bindings would help mobile devs avoid full wallet sync overhead.
Any plans for memo field API exposure? Would be useful for non-payment use cases.
I’m curious about an asymmetry in this library. You’re using the orchard crate directly for Orchard transactions, but not the sapling-crypto crate? What is the reasoning behind using one but not the other? The API of sapling-crypto intentionally rhymes with that of orchard and it provides equivalent functionality for the Sapling protocol that the orchard crate does for Orchard.
This is intentional. The Rust zk packages here are only used to create Sapling/Orchard proofs, and both implemented purely in Dart.
We use the orchard crate directly because its circuit and parameters are fully public and easy to pass into the default Orchard circuit for proof generation and verification.
For Sapling, the default circuit relies on internal parameters and private constructors, so you must closely follow the Sapling circuit implementation. To avoid pulling in sapling-crypto, reduce binary size, and simplify Dart integration, Sapling proof generation is implemented internally instead.