Challenge: c = H(g, y, a) (Fiat-Shamir heuristic)
Commitment: a = g^k (k is random nonce)
Proves knowledge of x where y = g^x mod p
Public value: y = g^x
Response: z = k - c·x mod p
Verification: g^z · y^c == a
Challenge: c = H(g, y, a) (Fiat-Shamir heuristic)