Merlin is a STROBE-based transcript construction for zero-knowledge proofs. It automates the Fiat-Shamir transform, so that by using Merlin, non-interactive protocols can be implemented as if they were interactive.
This is a Go port of the Rust implementation of the Merlin protocol.
The goal is to provide a Go implementation of the Merlin protocol that is compatible with the Rust implementation. This will allow for the use of Merlin in Go projects that need to interact with Rust projects that use Merlin.
The implementation tries to be close to the original Rust one, with some minor changes to make it more idiomatic and performant in Go.
This library is on par with the reference implementation. It has been tested against test vectors generated from the reference implementation and it passes all of them.
This code hasn't been audited, so it should be used with caution.
Merlin is authored by Henry de Valence, with design input from Isis Lovecruft and Oleg Andreev. The construction grew out of work with Oleg Andreev and Cathie Yun on a Bulletproofs implementation. Thanks also to Trevor Perrin and Mike Hamburg for helpful discussions. Merlin is named in reference to Arthur-Merlin protocols which introduced the notion of public coin arguments.
The header image was created by Oleg Andreev as a composite of Arthur Pyle's The Enchanter Merlin and the Keccak Team's θ-step diagram.
MIT