Skip to content

Commit 22acb98

Browse files
Remove serde implementation for GroupElement
1 parent 0181340 commit 22acb98

File tree

5 files changed

+50
-34
lines changed

5 files changed

+50
-34
lines changed

rust/catalyst-contest/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ serde = { version = "1.0.228", features = ["derive"] }
2525
serde_json = "1.0.145"
2626
strum = { version = "0.27", features = ["derive"] }
2727
chrono = { version = "0.4.42", features = ["serde"] }
28+
hex = "0.4.3"
2829

2930
[dev-dependencies]
3031
proptest = { version = "1.6.0", features = ["attr-macro"] }

rust/catalyst-contest/src/contest_parameters/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
pub mod rule;
88

9+
mod serde_group_element;
910
#[cfg(test)]
1011
mod tests;
1112

@@ -45,6 +46,7 @@ pub(crate) struct ContestParametersPayload {
4546
/// Contest end date
4647
pub(crate) end: DateTime<Utc>,
4748
/// An election public key.
49+
#[serde(with = "serde_group_element")]
4850
pub(crate) election_public_key: GroupElement,
4951
}
5052

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//! A serialize/deserialize implementation for `GroupElement`.
2+
3+
use catalyst_voting::crypto::group::GroupElement;
4+
use serde::{Deserialize, Deserializer, Serializer};
5+
6+
pub fn serialize<S>(
7+
val: &GroupElement,
8+
serializer: S,
9+
) -> Result<S::Ok, S::Error>
10+
where
11+
S: Serializer,
12+
{
13+
let hex = hex::encode(val.to_bytes());
14+
serializer.serialize_str(&hex)
15+
}
16+
17+
pub fn deserialize<'de, D>(deserializer: D) -> Result<GroupElement, D::Error>
18+
where D: Deserializer<'de> {
19+
let hex = String::deserialize(deserializer)?;
20+
let bytes = hex::decode(hex).map_err(serde::de::Error::custom)?;
21+
let array = <[u8; GroupElement::BYTES_SIZE]>::try_from(bytes.as_slice())
22+
.map_err(serde::de::Error::custom)?;
23+
GroupElement::from_bytes(&array).map_err(serde::de::Error::custom)
24+
}
25+
26+
#[cfg(test)]
27+
mod tests {
28+
use serde::Serialize;
29+
30+
use super::*;
31+
32+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
33+
struct Wrapper {
34+
#[serde(with = "super")]
35+
value: GroupElement,
36+
}
37+
38+
#[test]
39+
fn group_element_json_roundtrip() {
40+
let original = Wrapper {
41+
value: GroupElement::zero(),
42+
};
43+
let json = serde_json::to_string(&original).unwrap();
44+
let decoded = serde_json::from_str(&json).unwrap();
45+
assert_eq!(original, decoded);
46+
}
47+
}

rust/catalyst-voting/Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ ed25519-dalek = { version = "2.1.1", features = ["rand_core"] }
2525
blake2b_simd = "1.0.2"
2626
rayon = "1.10.0"
2727
minicbor = { version = "0.25.1", features = ["alloc", "derive", "half"] }
28-
serde = { version = "1.0.228", features = ["derive"] }
29-
hex = "0.4.3"
3028

3129
cbork-utils = { version = "0.0.2", git = "https://github.com/input-output-hk/catalyst-libs.git", tag = "cbork-utils-v0.0.2" }
3230

@@ -36,4 +34,3 @@ proptest = { version = "1.6.0", features = ["attr-macro"] }
3634
# Potentially it could be replaced with using `proptest::property_test` attribute macro,
3735
# after this PR will be merged https://github.com/proptest-rs/proptest/pull/523
3836
test-strategy = "0.4.0"
39-
serde_json = "1.0.145"

rust/catalyst-voting/src/crypto/group/ristretto255/decoding.rs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -91,30 +91,6 @@ impl Decode<'_, ()> for GroupElement {
9191
}
9292
}
9393

94-
impl serde::Serialize for GroupElement {
95-
fn serialize<S>(
96-
&self,
97-
serializer: S,
98-
) -> Result<S::Ok, S::Error>
99-
where
100-
S: serde::Serializer,
101-
{
102-
let hex = hex::encode(self.to_bytes());
103-
serializer.serialize_str(&hex)
104-
}
105-
}
106-
107-
impl<'de> serde::Deserialize<'de> for GroupElement {
108-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
109-
where D: serde::Deserializer<'de> {
110-
let hex = String::deserialize(deserializer)?;
111-
let bytes = hex::decode(hex).map_err(serde::de::Error::custom)?;
112-
let array = <[u8; GroupElement::BYTES_SIZE]>::try_from(bytes.as_slice())
113-
.map_err(serde::de::Error::custom)?;
114-
Self::from_bytes(&array).map_err(serde::de::Error::custom)
115-
}
116-
}
117-
11894
#[cfg(test)]
11995
mod tests {
12096
use test_strategy::proptest;
@@ -154,11 +130,4 @@ mod tests {
154130
let decoded = GroupElement::decode(&mut Decoder::new(&buffer), &mut ()).unwrap();
155131
assert_eq!(original, decoded);
156132
}
157-
158-
#[proptest]
159-
fn group_element_json_roundtrip(original: GroupElement) {
160-
let json = serde_json::to_string(&original).unwrap();
161-
let decoded = serde_json::from_str(&json).unwrap();
162-
assert_eq!(original, decoded);
163-
}
164133
}

0 commit comments

Comments
 (0)