ZkSafe ownership ofuscation
Our project makes the user of a safe multisig wallet (safe signers/owners) completely private: no one sees the actual owners of the Safe.
Created on 11th August 2024
•
ZkSafe ownership ofuscation
Our project makes the user of a safe multisig wallet (safe signers/owners) completely private: no one sees the actual owners of the Safe.
The problem ZkSafe ownership ofuscation solves
This project is an in-depth exploration of sugin zk technologies linke to a zkSafe modules. We create a Poseidon merkle tree to minimize the contrainst of the circuit and aims to be able to be executed easily from the browser from a usual computer, making very easy to plug-in and use this module to add privacy to any gnosis Safe
Multisignature setups present challenges. Not only can individuals be exposed during voting, but they may also face physical threats or theft, potentially compromising an entire DAO or even a Layer 2 network. This is not without precedent; the largest theft in history occurred due to a breach of a 5-out-of-9 multisig.
Our project ensures complete user privacy, as the actual owners of the Safe remain undisclosed.
Our project makes the user (safe signers/owners) completely private: no one sees the actual owners of the Safe.
The following application uses zkVerify to verify a proof generated by UltraPlonk verifier. The proof is done with zkSafe. zkSafe uses gnosis safe multisig wallet but with some additional features, it can hide who signed a particular transaction, but doesn't hide who are the Safe owners. With our approach we have implemented a feature to hide those owners.
Challenges we ran into
The main challenges have been integrating the following technollgies.
Noir:
- We cannot compile a circuit bigger tha 2^18 inside the Js as stated in this issue, https://github.com/AztecProtocol/aztec-packages/issues/7554, so even if we were able to compile the circuit and generate a proof we were'nt be abel to do it inside the hardhat test
- We had to upgrade the noir version of the give example due an incompatibiltiy with the Js library
- We had problems with the circomlibjs compatibility, since internally it has montgomery conversions, and until we realize it we lost a lot of time comparing hashes
- We make a kecckack implementation first, but since we had a lot of issues regarding dumb memories since it required a lot of contraints we remake our approahc using Poseidon
zkVerify:
-
With the proof, we followed the the instructions at
https://docs.zkverify.io/tutorials/submit-proofs/noir-ultraplonk-example
We got stuck with an issue, when runningnoir-cli key --input ./contract/hello_world/plonk_vk.sol --output ./target/vk.bin
I get errorError: CLI Error: Failed to parse Solidity file: CliError("Failed to parse verification key: InvalidCommitmentKey { offset: 20 }")
---> It seems it was a bug atultraplonk_verifier
repo, it was fixed at branch `fix/noir-cli-key`` -
When running
nargo prove
its taking a lot of time, we think is because the usage of keccak is generating too many constrains. For the scope of this hackathon and with our laptop hardware has been impossible for us to generate the proof so we will use a simple proof got from noir's hello world to continue with the verification process of zkVerify and for the sake of simplicity. We added all the necessary files at/circuits/helloWorld
Tracks Applied (3)
Best application that uses zkVerify to verify ZK proofs
zkVerify
Modify zkSafe to hide Safe owners
1k(x)
Recursive Proving
1k(x)