Efficient Zero-Knowledge Proofs: Theory And Practice