You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

32 lines
1.1 KiB

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