# Circom-MPC Summary
Circom-MPC - a project, that allows to port Circom zk-circuits to MPC circuits and to run it with a picked backend.
This topic covers two tools:
1. [circom-2-arithc](https://github.com/namnc/circom-2-arithc) - Fork of Circom; compiles circuits to Bristol Fashion format
2. [circom-mp-spdz](https://github.com/namnc/circom-mp-spdz) - transpiler from Bristol format to .mpc files to run with MP-SPDZ backend; might be changed for other backends (s.a. mpz) too
---
## circom-2-arithc
*Most up to date info can be found in [README.md](https://github.com/namnc/circom-2-arithc/blob/main/README.md)*
**Aim of the project** - to have a DSL that developers are familiar with - for MPC, + to port currently available circuits/protocols with no need to change the code.
**Current state** - supports Circom 2.1.0; has some minor bugs & not optimized (for big circuits, esp. with many loops, takes much time to compile).
Circom-2-arithc can compile circuits to both Arithmetic circuits & Boolean circuits (specified by the flag); also it has minimal support of types (e.g. MP-SPDZ's `sint` | `sfloat`) - the info is added to output file and e.g. can be used on a .mpc file generation stage.
## circom-mp-spdz
Set of scripts to transpile (from Bristol to .mpc), run (with MP-SPDZ), benchmark (including remote machines benchmarking) and check accuracy of the output (used for ML circuits).
ML circuits are used as a main use-case and example for the project.
The circuits were taken from [socathie/circomlib-ml])(https://github.com/socathie/circomlib-ml), they can be ported to MPC with no changes.
As a result we executed, benchmarked and checked the accuracy for all circuits. More info on results can be found in [BENCHMARK.md](https://github.com/namnc/circom-mp-spdz/blob/main/BENCHMARK.md) and [ACCURACY.md](https://github.com/namnc/circom-mp-spdz/blob/main/ACCURACY.md).
An in-depth review of circomlib-ml-mpc can be found [here](https://hackmd.io/Lv6OuKNgQLqA6YGTGWG4DQ). This file also contains the instruction on how we can benchmark/test the circuits.
#### Short overview for Keras2Circom-MPC
As a part of Circom-MPC project we also were able to run synthetic and real-world ML model in MPC.
For that we used [Keras2Circom](https://github.com/namnc/keras2circom/). Keras2Circom allows to compile Keras model to Circom circuit - thus, having the compiler we can run Keras2Circom generated circuit in MPC.
We generated two circuits with Keras2Circom:
* [Synthetic model](https://github.com/namnc/circom-mp-spdz/blob/main/ml_tests/Keras2Circom/circuit.circom) - a model that does nothing useful: it only combines many layers; it's created for testing purposes
* [Real-World model](https://github.com/namnc/circom-mp-spdz/blob/main/ml_tests/Keras2Circom/bigCircuit.circom) - real-world (useful) ML model, taken from keras2circom example. We were able to compile it, and it's possible to run it, but it takes ~30 minutes to compile on M3 Max (due to non optimized compiler) and many hours to run (more than 107000 gates and wires)
---
## Open questions
* ***Should we continue working on Circom-MPC? Is it really useful for devs? Is there a demand for MPC apps creation?***
* What features should we add to the compiler and how can we optimize it?
* What other applications should we explore and build with the given tooling?