bevis (be- + vis) meaning "proof" in the Scandinavian languages, aims to make implementing public-coin arguments in the Rust substantially easier by eliminating repetitive and error prone implementation details of Fiat-Shamir. Bevis aims to have minimal dependencies (serde and rand_core) and no/very minimal run-time overhead, consisting primarily of a collection of types, traits and procedural macros.
Here is a simplified example of implementing Schnorr using Bevis and curve25519-dalek.
```rust use serde::{Serialize, Deserialize};
struct Comm { v: RistrettoPoint, }
struct Resp { z: Scalar }
struct Pf {
a: Msg
fn verify
// receive first round msg
let a = ts.recv(pf.a);
// get a challenge (transcript impl. RngCore and CryptoRng)
let c = Scalar::random(ts);
// check
c * pk + pf.a == pf.z *
} ```