Non interactive zero knowledge proof with common reference string I would like to have some explanations about Non Interactive Zero Knowledge Proof. I saw with an example how to use the Fiat-Shamir transformation on Schnorr identification scheme to get a NIZK and I understood how it works in the random oracle model.
What I don't understand is how does a NIKZ work in the common reference string model (CRS). If I understand it right, the principe is that the CRS is generated in a trusted way and is used by the prover and the verifier to establish the truth of a statement.
Without worrying about the generation of this CRS, I would like to know how an algorithm works with a concrete example. I found lots of examples in the random oracle model but I didn't find any with a CRS. Can someone explain to me or give me some links that illustrate this concept in a more practical way, for example with a demo implemented in some language or from a library ?
A NIZK in the CRS model consists of algorithms $(\operatorname{Setup}, \operatorname{Prove}, \operatorname{Verify})$ where
$$\operatorname{Setup}(1^\lambda)\rightarrow (\sigma, \tau)$$
generates a public CRS $\sigma$ and a verification state $\tau$. The proving algorithm $$\operatorname{Prove}(\sigma, x, w)\rightarrow \pi$$ uses the CRS, a statement and a witness to produce a proof $\pi$, which the verifier can check using the verification state
$$\operatorname{Verify}(\tau, x, \pi) \rightarrow 0/1.$$

Such NIZK systems exist for virtually any statement you could be interested in, namely for any $\textbf{NP}$ relation. You can find an implementation of a NIZK for Boolean circuit satisfiability here: https://github.com/scipr-lab/libsnark