# 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