[Consultation] zk-SNARKs Module in Cosmos SDK

introduction and purpose

I am a student of Information Engineering in Japan.

For my one of graduation research, I am planning to implement a secrecy module using zk-SNARKs on Cosmos SDK.


As a new module for Cosmos SDK, I am thinking of using zk-SNARKs as a secret proof-verification scheme. This is becauseI believe that there is a need for hiding and proving the existence of information in the Cosmos multi-chain space, just like Ethereum, ZCash and Filecoin. We believe that this module will create more use cases and help to expand the Cosmos ecosystem.

For example

・Confidentiality and transmission of highly sensitive information
・Proof of existence of data via IBC

Use cases

・We believe that it is possible to verify whether the data and physical information associated with NFT actually exists or not via IBC.


  1. Is this kind of functionality already implemented in the existing Module, Cosmos and Tendermint specifications?

  2. If you want to integrate a secrecy module into Cosmos SDK, you can use TEE like SecretNetwork or minblewimble, but when you compare these technology with zk-SNARKs, which technology would you choose?

If you have any comments on the utility or reproducibility of this module, please let us know!

AFAIK there aren’t any actively maintained modules that use zkp tech and focus on secrecy,
but I found that there was some research done (i.e. penumbra.zone )

Are you specifically thinking about proof of existence for NFTs (or digital assets) ?

Thanks for the info on the other projects.
I don’t Precisely know what is penumbra, but this project’s overview is close to my idea.

You’re right, I’m thinking in terms of achieving proof of existence of NFTs and distributed data (like IPFS and Filecoin). The ideology may be different from penumbra for such functions.

Previously, we created a simple module related to zk.

The go package is required to integrate with tendermint.

gnark provides go-zk.

I implemented the zk app using gnark.

I benchmarked zk-sync.


TEE requires more engineering but it’s easier to have private general computation. TEE has trust assumption: you need to trust your vendor. And there are regular patches - so it’s not that safe if you forget to monitor the updates.

However, zk-stark is more future proof and for PoC will be easier than TEE (no need to play with hardware). Moreover there is a good library in Go which provides all you need: gnark

Thanks fo answer!
I’ll look into ganrk.

This library could be used, but If I had to pick one concern, it would be the need to design the circuit from scratch.
It would be nice if we could output the circuit as it is when we specify a smart contract.
(I am aware that Zokrates is capable of that)

I was able to clone your repository and experiment with it. It’s very unique!

Did you design the circuit you are using here yourself?

I did few circuits with gnark. It’s fairly straightforward.

I think Zokrates doesn’t support upgradeable zk circuits. Blockchain / Cosmos module should be a verifier. So you don’t want to recompile and redeploy it each time there is a new circuit.

Hmmm, different users want to use different functions and smart contracts, don’t they?
So, zk developers will prepare circuits for them and provide services with privacy and low fees, right?

zk libraries have circuits / gadgets for common constructions. But developers will need to assembly them by their own. Look at zokrates. It’s not hard and have good examples.

Yes, I have been in contact with the Ethereum Foundation’s development team, and we were able to conclude that gnark is effective compared to ZoKrates. I’ve been thinking negatively about writing circuits, but it looks like most of the barriers have already been removed in that regard.

Thank you for sharing so much of your knowledge with us so far!