
The crypto market is down bad right now 📉. But honestly? The bear market is my favourite time to learn. No FOMO, no Twitter noise. Just me, my laptop, and a very long reading list.
I have been talking about zero-knowledge proofs for a while now (see my earlier posts on the STARK prover). This time I actually wrote one from scratch instead of just reading about it.
Why Circom?
I started with Circom because it targets Solidity developers and the tooling around it (snarkjs) is well-documented. There are other options like Noir or Halo2, but Circom felt the most approachable as a starting point.
The mental model that finally clicked for me: a ZK circuit is like a function where you prove you know the inputs that produce a given output, without revealing those inputs. The verifier learns nothing about your private inputs — only that they satisfy the constraints.
My First Circuit
I started with the classic example: prove that you know two numbers a and b that multiply together to give a public value c. Sounds simple, but seeing it work end-to-end made everything concrete.
pragma circom 2.0.0;
template Multiply() {
signal input a;
signal input b;
signal output c;
c <== a * b;
}
component main = Multiply();
After compiling with Circom, running through snarkjs to generate the proving and verification keys, and finally deploying the Solidity verifier contract on a testnet — it worked. The verifier confirmed my proof without knowing what a and b were.
It’s honestly a bit magical the first time you see it. 🤯
What Tripped Me Up
The hardest part was understanding the difference between signals and variables in Circom. Signals are constrained (they form part of your circuit), variables are not. If you mix them up, you get subtle bugs that compile fine but produce incorrect proofs.
Also, the trusted setup phase with snarkjs requires downloading some relatively large files (the Powers of Tau ceremony output). The documentation does warn you but I still sat there wondering why my internet was being hammered.
What’s Next
I want to build something actually useful with this — probably a simple private voting circuit. Also planning to explore Noir from Aztec, which has a Rust-like syntax and might feel more natural given my background with Rust.
ZK is hard, but it’s the kind of hard that feels worth it.
References

There are so much going on this October. I have two Bootcamps going on at the
same time, a two-week-long project, the ETHOnline hackathon and a new start in
my career! I am also trying to sell my iPad Pro and a brunch of scammers
approached me… gave me a headache.
Btw, let’s get into today’s topic. The half-finished hackathon solo project that
I had recently submitted lol!
The original project idea is to build a casual personality test and map some
NFTs to the personality results. These NFTs will be minted on a
first-in-first-mint basis at a limited quota.
However, I was stuck on the personality test side for a very long time because I
am not a psychologist and I don’t know how to design a personality test… After
that, I kind of randomly assigned personalities to those Pokemon cards. Then,
the NFT part is relatively easy. With the help of the NFTPort, minting to
Polygon or the testnet is completely free. Free minting is one of the reasons
why I picked NFTPort in the first place. It also supports OpenSea’s metadata
configuration and essential features such as NFT storage, which is pretty handy.
However, using third-party services like NFTPort is not a common practice.
Especially if you want to design another set of smart contracts to interact with
the NFT.
In the following months, I will redesign and add extra features on top of the
current project, such as:
- NFT staking
- Better personality test
- One-click NFT listing
- Minting monitor
- and happy hacking!
Source code is on GitHub.


Karl and Vitalik talked about retroactive public goods funding on the recent
EthOnline click-off ceremony.
This idea was raised as we learnt there are lot of coin voting failures, such as
the one with EOS and the Hive fork.
The idea of retroactive public goods funding is fund only goes to the public
good that showing to have an actual impact. Instead of funding public goods
ahead of time, and hope that it’s going to do some good over time.
Project Token
- Before the project hit the market, the project team can pre-mined project
tokens and sell it on Defi platform like Uniswap, to exchange for tokens for
some fundings.
- After the project started providing public good value, someone can just buy up
these project tokens thereby everyone who holds these tokens will also be
benefited from the increase in value.
- Legitimacy
- Creating value at the same time provide incentive motivation
The Retroactive Public Goods Funding Oracle
Reference
reference #1:
Moving beyond coin voting governance
reference #2:
ETHOnline 2021 | Kick off Talk Retroactive Public Goods Funding excerpt
reference #3:
Retroactive Public Goods Funding