ZkSafe ownership ofuscation

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.

ZkSafe ownership ofuscation

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 running

    noir-cli key --input ./contract/hello_world/plonk_vk.sol --output ./target/vk.bin


    I get error

    Error: CLI Error: Failed to parse Solidity file: CliError("Failed to parse verification key: InvalidCommitmentKey { offset: 20 }")


    ---> It seems it was a bug at

    ultraplonk_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

We verify a proof using the zkVerify blockchain successfully after running on some issues. The proof is solving zkSafe c...Read More

zkVerify

Modify zkSafe to hide Safe owners

We fork the given repository and add the functionality as described We make the owners private, we were'nt able to proof...Read More

1k(x)

Recursive Proving

We begin to implement the recursion, but we didin't finish it since we had a lot of issues with noir and the harhdat int...Read More

1k(x)

Discussion