Inspiration
I built this because I was tired of the routine privacy violations we face daily. Simple tasks, like verifying your age or a professional status, constantly force us to expose far too much personal information. The inspiration was to finally create a platform based on Self-Sovereign Identity (SSI), giving people complete control over their data, rather than letting it be scattered across centralized servers vulnerable to breaches.
What it does
The is a Decentralized identity wallet with an identity parachain that provides decentralized identity management for everyone. It issues Verifiable Credentials and, critically, uses Zero-Knowledge Proofs (ZK-SNARKs) to enable selective disclosure. This means a user can prove a specific claim, such as being a verified professional or meeting an age requirement, without ever revealing the underlying sensitive data. It also features on-chain governance to democratically approve trusted credential issuers and Cross-Chain Messaging (XCM) to allow identity verification across the entire Polkadot ecosystem.
How we built it
I built this project entirely solo using the Polkadot SDK (FRAME). The core logic of the parachain is split into five custom Rust pallets that handle DIDs, credential management, governance, and ZK verification. I integrated the Arkworks cryptography library to handle the Groth16 proofs on the chain's runtime. For the user interface, I created an Expo mobile wallet.I also created a web interface for the issuers to register and issue a membership status to a DID. Crucially, I had to develop a custom native proof generator, a Rust proving engine compiled into native modules (.so for Android, .xcframework for iOS) and exposed via an Expo Config Plugin. This architecture ensures all sensitive proof generation happens securely and efficiently on the user's device, not in a server or a vulnerable JavaScript environment.
Challenges i ran into
The two primary challenges were the ZK verification speed on-chain and the ZK generation on the frontend.
On-Chain Verification: I initially struggled with the immense computational cost of running Groth16 verification within the blockchain's block time limits. I overcame this by implementing batch proof verification logic, which significantly amortized the overhead, making the parachain scalable.
Frontend Proof Generation: The biggest hurdle was the inability to run real zkSNARK generation (like Groth16) inside the standard Expo JavaScript runtime. I solved this by developing a custom, native mobile prover. This involved writing the prover engine in Rust and using native modules and an Expo Config Plugin to compile it directly into the mobile application's native code for both iOS and Android.
Accomplishments that I am proud of
I am most proud of successfully integrating and deploying the end-to-end Zero-Knowledge Proof workflow. This includes the custom Native Mobile Prover on the frontend and the highly optimized Batch Verification system on the parachain. The fact that the entire architecture from DID creation to cross-chain ZK verification was built and secured by one person is a huge source of accomplishment.
What i learned
I gained deep expertise in several complex fields: the practical constraints of ZK-SNARKs in a blockchain environment, advanced Substrate/FRAME development, and the intricacies of building high-performance native modules for React Native/Expo. Specifically, I learned that security and performance for ZK workflows require abandoning WASM or JavaScript for proving and going deep into Rust and native code integration to protect user privacy.
What's next for PortableID
The immediate next steps are focused on ecosystem adoption and refinement. I plan to enable deeper XCM integration with key Polkadot parachains to facilitate easy cross-chain credential verification. I also plan on working on developer SDKs so developers can easily integrate this into their platforms. Furthermore, I will be adding support for more advanced and efficient ZK circuit types (like Plonk) to improve proof generation speed and reduce gas costs, aiming to make PortableID the default and most private identity layer for the entire Polkadot and Kusama network.
Log in or sign up for Devpost to join the conversation.