Zuma is a ZK-powered Luma app.
This project is inspired by Luma and Zupass. We aim to combine the seamless user experience of native apps like Luma with the strong privacy guarantees of zero-knowledge proofs, as seen in Zupass. To achieve this, we developed Zuma.
Zuma works just like Luma, but with enhanced privacy. Users don’t need to share their email or name with the verifier. Even better, anyone—not just the host—can verify the QR code presented by the user!
- Mopro: Mopro generates Rust bindings for iOS and Android, making ZK development seamless for mobile native apps. We use Mopro to generate bindings for Semaphore, enabling proof generation, proof verification, and identity commitment creation. Without Mopro, developers would need to manually define all fields, pairings, and functions in Flutter or other native mobile languages, making the process significantly more complex.
- semaphore-rs:
semaphore-rs
integrates seamlessly with native platforms and outperforms the TypeScript implementation in terms of performance. Users can generate a membership proof for an event using a Semaphore proof, ensuring eligibility without revealing their identity, email, or any personal information—only a zero-knowledge proof. - flutter: Flutter is a cross-platform framework for building native mobile apps, offering a rich ecosystem of libraries that simplify access to mobile hardware features like the camera, gallery, and more.
Google account authentication allows us to verify that a user owns a given email address.
Event hosts can effortlessly create an event on mobile, choose images from the gallery, or capture a photo on the spot.
Users can browse their upcoming events and discover new ones.
Users can present a QR code to attend the event, and others can scan the code to verify the ZK proof.
- Refer to the getting started section in Mopro documentation: https://zkmopro.org/docs/getting-started/
- Update function exporting to Rust bindings. Go to
src/lib.rs
and export functions with#[uniffi::export]
. Check the built-in types that can be exported.- e.g.
#[uniffi::export] fn semaphore_prove( id_secret: String, leaves: Vec<String>, signal: String, external_nullifier: String, ) -> ProofResult { ... }
- e.g.
- Update the mopro bindings with the CLI
mopro build
- Update the mopro bindings in the flutter plugin
- iOS:
- Replace
mopro.swift
atzuma/mopro_flutter_plugin/ios/Classes/mopro.swift
with the file generated during the Setup. - Replace the directory
zuma/mopro_flutter_plugin/ios/MoproBindings.xcframework
with the one generated during the Setup.
- Replace
- Android:
- Replace the directory
zuma/mopro_flutter_plugin/android/src/main/jniLibs
with the one generated during the Setup. - Replace
mopro.kt
atzuma/mopro_flutter_plugin/android/src/main/kotlin/uniffi/mopro/mopro.kt
with the file generated during the Setup.
- Replace the directory
- Update function interfaces in
zuma/mopro_flutter_plugin/lib
zuma/mopro_flutter_plugin/ios/Classes/MoproFlutterPlugin.swift
zuma/mopro_flutter_plugin/android/src/main/kotlin/com/example/mopro_flutter/MoproFlutterPlugin.kt
- iOS:
- Go to the App Directory
cd zuma
- Check Flutter Environment
flutter doctor
- Install Flutter Dependencies
flutter pub get
- Running the App via Console
flutter run