Skip to content

Commit 59af39a

Browse files
Merge pull request #431 from filecoin-project/proof-serde
Proof serde
2 parents c11c595 + 071efb8 commit 59af39a

File tree

18 files changed

+162
-19
lines changed

18 files changed

+162
-19
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ Cargo.lock
55
**/*.h
66
heaptrack*
77
.bencher
8+
logging-toolkit

storage-proofs/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ tempfile = "3"
3333
fs2 = "0.4"
3434
rayon = "1.0.0"
3535
slog = { version = "2.4.1", features = ["max_level_trace", "release_max_level_trace"] }
36+
serde = "1.0"
37+
serde_derive = "1.0"
38+
base64 = "0.10.0"
3639

3740
[dependencies.pairing]
3841
version = "0.14.2"
@@ -48,6 +51,7 @@ asm = ["sha2/sha2-asm", "blake2/simd_asm"]
4851
proptest = "0.7"
4952
criterion = "0.2"
5053
sector-base = { path = "../sector-base" }
54+
serde_json = "1.0"
5155

5256
[[bench]]
5357
name = "pedersen"

storage-proofs/src/batchpost.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use std::marker::PhantomData;
33
use byteorder::{LittleEndian, WriteBytesExt};
44
use num_bigint::BigUint;
55
use num_traits::cast::ToPrimitive;
6+
use serde::de::Deserialize;
7+
use serde::ser::Serialize;
68

79
use crate::crypto::blake2s::blake2s;
810
use crate::error::Result;
@@ -23,8 +25,12 @@ pub struct PublicParams {
2325
#[derive(Debug)]
2426
pub struct SetupParams {}
2527

26-
#[derive(Debug, Clone)]
28+
#[derive(Debug, Clone, Serialize, Deserialize)]
2729
pub struct Proof<H: Hasher> {
30+
#[serde(bound(
31+
serialize = "merklepor::Proof<H>: Serialize",
32+
deserialize = "merklepor::Proof<H>: Deserialize<'de>"
33+
))]
2834
pub proofs: Vec<merklepor::Proof<H>>,
2935
pub challenges: Vec<usize>,
3036
}

storage-proofs/src/beacon_post.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use std::marker::PhantomData;
22
use std::{thread, time};
33

44
use byteorder::{ByteOrder, LittleEndian};
5+
use serde::de::Deserialize;
6+
use serde::ser::Serialize;
57

68
use crate::error::{Error, Result};
79
use crate::hasher::{Domain, HashFunction, Hasher};
@@ -62,8 +64,14 @@ impl<'a, H: 'a + Hasher> PrivateInputs<'a, H> {
6264
/// Beacon-PoSt
6365
/// This is one construction of a Proof-of-Spacetime.
6466
/// It currently only supports proving over a single sector.
65-
#[derive(Clone, Debug)]
66-
pub struct Proof<'a, H: Hasher + 'a, V: Vdf<H::Domain>>(Vec<hvh_post::Proof<'a, H, V>>);
67+
#[derive(Clone, Debug, Serialize, Deserialize)]
68+
pub struct Proof<'a, H: Hasher + 'a, V: Vdf<H::Domain>>(
69+
#[serde(bound(
70+
serialize = "hvh_post::Proof<'a, H, V>: Serialize",
71+
deserialize = "hvh_post::Proof<'a, H, V>: Deserialize<'de>"
72+
))]
73+
Vec<hvh_post::Proof<'a, H, V>>,
74+
);
6775

6876
impl<'a, H: Hasher + 'a, V: Vdf<H::Domain>> Proof<'a, H, V> {
6977
pub fn proofs(&self) -> &[hvh_post::Proof<'a, H, V>] {

storage-proofs/src/circuit/hvh_post.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use sapling_crypto::circuit::num;
44
use sapling_crypto::jubjub::JubjubEngine;
55

66
use crate::circuit::constraint;
7-
use crate::circuit::porc::{self, PoRCCompound};
7+
use crate::circuit::porc;
88
use crate::circuit::sloth;
99
use crate::compound_proof::{CircuitComponent, CompoundProof};
1010
use crate::hasher::Hasher;

storage-proofs/src/drgporep.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::marker::PhantomData;
22

33
use byteorder::{LittleEndian, WriteBytesExt};
4+
use serde::de::Deserialize;
5+
use serde::ser::Serialize;
46

57
use crate::drgraph::Graph;
68
use crate::error::Result;
@@ -83,8 +85,12 @@ where
8385
}
8486
}
8587

86-
#[derive(Debug, Clone)]
88+
#[derive(Debug, Clone, Serialize, Deserialize)]
8789
pub struct DataProof<H: Hasher> {
90+
#[serde(bound(
91+
serialize = "MerkleProof<H>: Serialize",
92+
deserialize = "MerkleProof<H>: Deserialize<'de>"
93+
))]
8894
pub proof: MerkleProof<H>,
8995
pub data: H::Domain,
9096
}
@@ -122,12 +128,32 @@ impl<H: Hasher> DataProof<H> {
122128

123129
pub type ReplicaParents<H> = Vec<(usize, DataProof<H>)>;
124130

125-
#[derive(Default, Debug, Clone)]
131+
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
126132
pub struct Proof<H: Hasher> {
133+
#[serde(bound(
134+
serialize = "H::Domain: Serialize",
135+
deserialize = "H::Domain: Deserialize<'de>"
136+
))]
127137
pub data_root: H::Domain,
138+
#[serde(bound(
139+
serialize = "H::Domain: Serialize",
140+
deserialize = "H::Domain: Deserialize<'de>"
141+
))]
128142
pub replica_root: H::Domain,
143+
#[serde(bound(
144+
serialize = "DataProof<H>: Serialize",
145+
deserialize = "DataProof<H>: Deserialize<'de>"
146+
))]
129147
pub replica_nodes: Vec<DataProof<H>>,
148+
#[serde(bound(
149+
serialize = "H::Domain: Serialize",
150+
deserialize = "H::Domain: Deserialize<'de>"
151+
))]
130152
pub replica_parents: Vec<ReplicaParents<H>>,
153+
#[serde(bound(
154+
serialize = "H::Domain: Serialize",
155+
deserialize = "H::Domain: Deserialize<'de>"
156+
))]
131157
pub nodes: Vec<DataProof<H>>,
132158
}
133159

storage-proofs/src/hasher/digest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ impl<D: Digester> StdHasher for DigestFunction<D> {
8686
}
8787
}
8888

89-
#[derive(Copy, Clone, PartialEq, Eq, Debug, PartialOrd, Ord, Default)]
89+
#[derive(Copy, Clone, PartialEq, Eq, Debug, PartialOrd, Ord, Default, Serialize, Deserialize)]
9090
pub struct DigestDomain(pub [u8; 32]);
9191

9292
impl DigestDomain {

storage-proofs/src/hasher/pedersen.rs

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
use std::hash::Hasher as StdHasher;
22

33
use bitvec::{self, BitVec};
4+
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
45
use merkle_light::hash::{Algorithm as LightAlgorithm, Hashable};
56
use pairing::bls12_381::{Bls12, Fr, FrRepr};
67
use pairing::{PrimeField, PrimeFieldRepr};
78
use rand::{Rand, Rng};
89
use sapling_crypto::pedersen_hash::{pedersen_hash, Personalization};
10+
use serde::de::{Deserialize, Deserializer};
11+
use serde::ser::Serializer;
912

1013
use super::{Domain, HashFunction, Hasher};
1114
use crate::crypto::{kdf, pedersen, sloth};
@@ -61,8 +64,52 @@ impl Hashable<PedersenFunction> for PedersenDomain {
6164
}
6265
}
6366

64-
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
65-
pub struct PedersenDomain(pub FrRepr);
67+
#[derive(Copy, Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
68+
pub struct PedersenDomain(#[serde(with = "FrReprDef")] pub FrRepr);
69+
70+
pub struct FrReprDef(pub [u64; 4]);
71+
72+
impl FrReprDef {
73+
fn serialize<S>(__self: &FrRepr, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
74+
where
75+
S: Serializer,
76+
{
77+
let mut writer = Vec::with_capacity(32);
78+
79+
for digit in __self.0.as_ref().iter() {
80+
writer.write_u64::<LittleEndian>(*digit).unwrap();
81+
}
82+
83+
if serializer.is_human_readable() {
84+
serializer.collect_str(&base64::display::Base64Display::with_config(
85+
&writer,
86+
base64::STANDARD,
87+
))
88+
} else {
89+
serializer.serialize_bytes(&writer)
90+
}
91+
}
92+
93+
fn deserialize<'de, D>(deserializer: D) -> ::std::result::Result<FrRepr, D::Error>
94+
where
95+
D: Deserializer<'de>,
96+
{
97+
let arr: Vec<u8> = if deserializer.is_human_readable() {
98+
let raw = String::deserialize(deserializer)?;
99+
base64::decode(&raw).unwrap()
100+
} else {
101+
Vec::deserialize(deserializer)?
102+
};
103+
104+
let mut digits = [0u64; 4];
105+
let mut source = ::std::io::Cursor::new(arr);
106+
for digit in digits.iter_mut() {
107+
*digit = source.read_u64::<LittleEndian>().unwrap();
108+
}
109+
110+
Ok(FrRepr(digits))
111+
}
112+
}
66113

67114
impl Default for PedersenDomain {
68115
fn default() -> PedersenDomain {
@@ -324,4 +371,15 @@ mod tests {
324371
}
325372
}
326373
}
374+
375+
#[test]
376+
fn test_serialize() {
377+
let repr = FrRepr([1, 2, 3, 4]);
378+
let val = PedersenDomain(repr);
379+
380+
let ser = serde_json::to_string(&val).unwrap();
381+
let val_back = serde_json::from_str(&ser).unwrap();
382+
383+
assert_eq!(val, val_back);
384+
}
327385
}

storage-proofs/src/hasher/types.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use crate::error::Result;
22
use merkle_light::hash::{Algorithm as LightAlgorithm, Hashable as LightHashable};
33
use pairing::bls12_381::Fr;
44
use rand::Rand;
5+
use serde::de::DeserializeOwned;
6+
use serde::ser::Serialize;
57

68
pub trait Domain:
79
Ord
@@ -16,6 +18,8 @@ pub trait Domain:
1618
+ From<Fr>
1719
+ Into<Fr>
1820
+ Rand
21+
+ Serialize
22+
+ DeserializeOwned
1923
{
2024
fn serialize(&self) -> Vec<u8>;
2125
fn into_bytes(&self) -> Vec<u8>;

storage-proofs/src/hvh_post.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::marker::PhantomData;
22

33
use byteorder::{ByteOrder, LittleEndian};
4+
use serde::de::Deserialize;
5+
use serde::ser::Serialize;
46

57
use crate::error::{Error, Result};
68
use crate::hasher::{Domain, HashFunction, Hasher};
@@ -80,12 +82,24 @@ impl<'a, H: 'a + Hasher> PrivateInputs<'a, H> {
8082
/// HVH-PoSt
8183
/// This is one construction of a Proof-of-Spacetime.
8284
/// It currently only supports proving over a single sector.
83-
#[derive(Clone, Debug)]
85+
#[derive(Clone, Debug, Serialize, Deserialize)]
8486
pub struct Proof<'a, H: Hasher + 'a, V: Vdf<H::Domain>> {
8587
/// `post_iteration` online Proof-of-Replication proofs.
88+
#[serde(bound(
89+
serialize = "V::Proof: Serialize",
90+
deserialize = "V::Proof: Deserialize<'de>"
91+
))]
8692
pub porep_proofs: Vec<<PoRC<'a, H> as ProofScheme<'a>>::Proof>,
8793
/// `post_epochs - 1` VDF proofs
94+
#[serde(bound(
95+
serialize = "V::Proof: Serialize",
96+
deserialize = "V::Proof: Deserialize<'de>"
97+
))]
8898
pub vdf_proofs: Vec<V::Proof>,
99+
#[serde(bound(
100+
serialize = "H::Domain: Serialize",
101+
deserialize = "H::Domain: Deserialize<'de>"
102+
))]
89103
pub ys: Vec<H::Domain>,
90104
}
91105

0 commit comments

Comments
 (0)