nova-study/src/transcript.rs
src/transcript.rsRaw
1use ark_ff::PrimeField;
2use ark_serialize::CanonicalSerialize;
3use merlin::Transcript as MerlinTranscript;
4use std::marker::PhantomData;
5
6// This Transcript approach is a modified version from https://github.com/arkworks-rs/gemini ,
7// using Merlin transcript (https://merlin.cool).
8pub struct Transcript<F: PrimeField> {
9 phantom: PhantomData<F>,
10 transcript: MerlinTranscript,
11}
12
13impl<F: PrimeField> Transcript<F> {
14 pub fn new() -> Self {
15 Self {
16 phantom: PhantomData::default(),
17 transcript: MerlinTranscript::new(b"transcript"),
18 }
19 }
20 pub fn add<S: CanonicalSerialize>(&mut self, label: &'static [u8], r: &S) {
21 let mut msg = Vec::new();
22 r.serialize_uncompressed(&mut msg).unwrap();
23 self.transcript.append_message(label, &msg);
24 }
25 pub fn get_challenge(&mut self, label: &'static [u8]) -> F {
26 let mut bytes = [0u8; 64];
27 self.transcript.challenge_bytes(label, &mut bytes);
28 let challenge = F::from_le_bytes_mod_order(bytes.as_ref());
29 self.add(b"get challenge", &challenge);
30 challenge
31 }
32 pub fn get_challenge_vec(&mut self, label: &'static [u8], n: usize) -> Vec<F> {
33 let mut c: Vec<F> = vec![F::zero(); n];
34 for i in 0..n {
35 c[i] = self.get_challenge(label);
36 }
37 c
38 }
39}