# Ramping Up on SNARKs
**Ramping Up on zkSNARKs / circuits**
In the background, it's probably good to ramp up on zkSNARKs and circuit stuff because we'll be doing a lot of that and it's fun :D Here are a few resources I've found helpful (by no means necesary to do all of them)
* Intro series to SNARKs (very similar to the talk I gave), read in the following order
* https://vitalik.ca/general/2016/12/10/qap.html
* https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html
* https://vitalik.ca/general/2017/01/14/exploring_ecp.html (goes over Dankrad's post, but I find Dankrad's post more clear)
* https://vitalik.ca/general/2017/02/01/zk_snarks.html
* https://www.youtube.com/watch?v=NqrVcDuQ8hM (a video on PLONK by the creator, PLONK is a more advanced version of groth16. This video is a bit confusing, but if you have watched it, then I can give another talk about PLONK where this will serve as a good starting point.)
* Go through circuits in Tornado Cash repo (RIP) and explain how they work
* https://github.com/tornado-repositories/tornado-core/tree/master/circuits
* Study circom-ecdsa: https://github.com/0xPARC/circom-ecdsa
* This is a circom library to implement ECDSA verification inside a SNARK. It's helpful to get an idea of what big int arithmetic and elliptic curve operations look like. Although we won't be using circom, I think this is still helpful intuition to understand what is going on.
* Write a Circom starter task for something simple
* Given 3 pairs of (secret, public_key) pairs where public_key=hash(secret), write a circuit that takes as public input the list of 3 public keys, private input a secret and checks that the secret belongs to one of the public_keys, without revealing which one
* Solution (I worked on this a while ago): https://github.com/0xPARC/zkmessage.xyz