Skip to content

Commit 3f9936f

Browse files
committed
[vrf] derive bincode/serde with spaghetti bounds
1 parent e3364d0 commit 3f9936f

File tree

2 files changed

+46
-55
lines changed

2 files changed

+46
-55
lines changed

vrf_fun/src/vrf.rs

Lines changed: 15 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! Generic VRF implementation that can work with different transcript types
22
3-
use core::marker::PhantomData;
43
use secp256kfun::{KeyPair, Scalar, prelude::*};
54
use sigma_fun::{
65
CompactProof, FiatShamir, ProverTranscript, Transcript,
@@ -15,12 +14,23 @@ use sigma_fun::{
1514
#[cfg_attr(
1615
feature = "serde",
1716
derive(serde::Serialize, serde::Deserialize),
18-
serde(bound(serialize = "", deserialize = ""))
17+
serde(bound(
18+
deserialize = "L: ArrayLength<u8>, CompactProof<Scalar<Public, Zero>, L>: serde::Deserialize<'de>",
19+
serialize = "L: ArrayLength<u8>, CompactProof<Scalar<Public, Zero>, L>: serde::Serialize",
20+
))
21+
)]
22+
#[cfg_attr(
23+
feature = "bincode",
24+
derive(bincode::Encode, bincode::Decode),
25+
bincode(
26+
encode_bounds = "L: ArrayLength<u8>, CompactProof<Scalar<Public, Zero>, L>: bincode::Encode",
27+
decode_bounds = "L: ArrayLength<u8>, CompactProof<Scalar<Public, Zero>, L>: bincode::Decode<__Context>",
28+
borrow_decode_bounds = "L: ArrayLength<u8>, CompactProof<Scalar<Public, Zero>, L>: bincode::BorrowDecode<'__de, __Context>"
29+
)
1930
)]
2031
pub struct VrfProof<L = U16>
2132
where
22-
L: ArrayLength<u8> + IsLessOrEqual<U32>,
23-
<L as IsLessOrEqual<U32>>::Output: NonZero,
33+
L: ArrayLength<u8>,
2434
{
2535
/// The VRF output point.
2636
///
@@ -30,65 +40,16 @@ where
3040
pub proof: CompactProof<Scalar<Public, Zero>, L>,
3141
}
3242

33-
#[cfg(feature = "bincode")]
34-
impl<L> bincode::Encode for VrfProof<L>
35-
where
36-
L: ArrayLength<u8> + IsLessOrEqual<U32>,
37-
<L as IsLessOrEqual<U32>>::Output: NonZero,
38-
{
39-
fn encode<E: bincode::enc::Encoder>(
40-
&self,
41-
encoder: &mut E,
42-
) -> Result<(), bincode::error::EncodeError> {
43-
self.gamma.encode(encoder)?;
44-
self.proof.encode(encoder)?;
45-
Ok(())
46-
}
47-
}
48-
49-
#[cfg(feature = "bincode")]
50-
impl<L, Context> bincode::Decode<Context> for VrfProof<L>
51-
where
52-
L: ArrayLength<u8> + IsLessOrEqual<U32>,
53-
<L as IsLessOrEqual<U32>>::Output: NonZero,
54-
{
55-
fn decode<D: bincode::de::Decoder<Context = Context>>(
56-
decoder: &mut D,
57-
) -> Result<Self, bincode::error::DecodeError> {
58-
let gamma = Point::decode(decoder)?;
59-
let proof = CompactProof::<Scalar<Public, Zero>, L>::decode(decoder)?;
60-
Ok(VrfProof { gamma, proof })
61-
}
62-
}
63-
64-
#[cfg(feature = "bincode")]
65-
impl<'a, L, Context> bincode::BorrowDecode<'a, Context> for VrfProof<L>
66-
where
67-
L: ArrayLength<u8> + IsLessOrEqual<U32>,
68-
<L as IsLessOrEqual<U32>>::Output: NonZero,
69-
{
70-
fn borrow_decode<D: bincode::de::BorrowDecoder<'a, Context = Context>>(
71-
decoder: &mut D,
72-
) -> Result<Self, bincode::error::DecodeError> {
73-
<Self as bincode::Decode<Context>>::decode(decoder)
74-
}
75-
}
76-
7743
/// Verified random output that ensures gamma has been verified
7844
#[derive(Debug, Clone)]
7945
pub struct VerifiedRandomOutput {
8046
pub gamma: Point,
8147
}
8248

8349
/// Generic VRF implementation
84-
pub struct Vrf<T, ChallengeLength = U16>
85-
where
86-
ChallengeLength: ArrayLength<u8> + IsLessOrEqual<U32>,
87-
<ChallengeLength as IsLessOrEqual<U32>>::Output: NonZero,
88-
{
50+
pub struct Vrf<T, ChallengeLength = U16> {
8951
dleq: crate::VrfDleq<ChallengeLength>,
9052
pub transcript: T,
91-
_phantom: PhantomData<ChallengeLength>,
9253
}
9354

9455
impl<T: Clone, ChallengeLength> Vrf<T, ChallengeLength>
@@ -103,7 +64,6 @@ where
10364
Self {
10465
dleq: Eq::new(DLG::default(), DL::default()),
10566
transcript,
106-
_phantom: PhantomData,
10767
}
10868
}
10969
}

vrf_fun/tests/codec.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use secp256kfun::{KeyPair, prelude::*};
2+
use vrf_fun::VrfProof;
3+
4+
#[cfg(feature = "bincode")]
5+
#[test]
6+
fn test_vrf_proof_bincode_roundtrip() {
7+
let keypair = KeyPair::new(Scalar::random(&mut rand::thread_rng()));
8+
let proof = vrf_fun::rfc9381::sswu::prove::<sha2::Sha256>(&keypair, b"test message");
9+
10+
let encoded = bincode::encode_to_vec(&proof, bincode::config::standard()).unwrap();
11+
let (decoded, _): (VrfProof, _) =
12+
bincode::decode_from_slice(&encoded, bincode::config::standard()).unwrap();
13+
14+
assert_eq!(proof, decoded);
15+
}
16+
17+
#[cfg(all(feature = "bincode", feature = "serde"))]
18+
#[test]
19+
fn test_vrf_proof_serde_roundtrip() {
20+
use bincode::serde::Compat;
21+
22+
let keypair = KeyPair::new(Scalar::random(&mut rand::thread_rng()));
23+
let proof = vrf_fun::rfc9381::sswu::prove::<sha2::Sha256>(&keypair, b"test message");
24+
25+
let compat_proof = Compat(&proof);
26+
let encoded = bincode::encode_to_vec(compat_proof, bincode::config::standard()).unwrap();
27+
let (decoded, _): (Compat<VrfProof>, _) =
28+
bincode::decode_from_slice(&encoded, bincode::config::standard()).unwrap();
29+
30+
assert_eq!(proof, decoded.0);
31+
}

0 commit comments

Comments
 (0)