11use std:: collections:: HashMap ;
22
3+ use base64:: prelude:: * ;
34use serde:: ser:: { SerializeStruct , Serializer } ;
45use serde:: { Deserialize , Serialize } ;
56
7+ use crate :: backends:: plonky2:: mock_main:: MockMainPod ;
68use crate :: backends:: plonky2:: mock_signed:: MockSignedPod ;
79use crate :: frontend:: containers:: Dictionary ;
8- use crate :: middleware:: { PodId , F } ;
9- use crate :: middleware;
10+ use crate :: frontend:: Statement ;
11+ use crate :: middleware:: { self , HASH_SIZE , VALUE_SIZE } ;
12+ use crate :: middleware:: { Hash , PodId , F } ;
1013use plonky2:: field:: types:: Field ;
1114
12- use super :: SignedPod ;
1315use super :: Value ;
16+ use super :: { MainPod , SignedPod } ;
1417
1518impl Serialize for SignedPod {
1619 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
@@ -44,9 +47,13 @@ impl<'de> Deserialize<'de> for SignedPod {
4447 struct SignedPodHelper {
4548 entries : HashMap < String , Value > ,
4649 proof : String ,
50+ pod_type : String ,
4751 }
4852
4953 let helper = SignedPodHelper :: deserialize ( deserializer) ?;
54+ if helper. pod_type != "signed" {
55+ return Err ( serde:: de:: Error :: custom ( "pod_type is not signed" ) ) ;
56+ }
5057 let kvs = helper. entries ;
5158 let dict = Dictionary :: new ( kvs. clone ( ) ) . middleware_dict ( ) . clone ( ) ;
5259 let pod = MockSignedPod :: new ( PodId ( dict. commitment ( ) ) , helper. proof , dict) ;
@@ -57,6 +64,45 @@ impl<'de> Deserialize<'de> for SignedPod {
5764 }
5865}
5966
67+ impl Serialize for MainPod {
68+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
69+ where
70+ S : Serializer ,
71+ {
72+ let mut state = serializer. serialize_struct ( "MainPod" , 2 ) ?;
73+ state. serialize_field ( "public_statements" , & self . public_statements ) ?;
74+ state. serialize_field ( "proof" , & self . pod . serialized_proof ( ) ) ?;
75+ state. serialize_field ( "pod_type" , "main" ) ?;
76+ state. end ( )
77+ }
78+ }
79+
80+ impl < ' de > Deserialize < ' de > for MainPod {
81+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
82+ where
83+ D : serde:: Deserializer < ' de > ,
84+ {
85+ #[ derive( Deserialize ) ]
86+ struct MainPodHelper {
87+ public_statements : Vec < Statement > ,
88+ proof : String ,
89+ pod_type : String ,
90+ }
91+
92+ let helper = MainPodHelper :: deserialize ( deserializer) ?;
93+ if helper. pod_type != "main" {
94+ return Err ( serde:: de:: Error :: custom ( "pod_type is not main" ) ) ;
95+ }
96+ let proof = String :: from_utf8 ( BASE64_STANDARD . decode ( & helper. proof ) . unwrap ( ) ) . unwrap ( ) ;
97+ let pod: MockMainPod = serde_json:: from_str ( & proof) . unwrap ( ) ;
98+
99+ Ok ( MainPod {
100+ pod : Box :: new ( pod) ,
101+ public_statements : helper. public_statements ,
102+ } )
103+ }
104+ }
105+
60106pub fn serialize_i64 < S > ( value : & i64 , serializer : S ) -> Result < S :: Ok , S :: Error >
61107where
62108 S : serde:: Serializer ,
@@ -100,12 +146,70 @@ where
100146 Ok ( middleware:: Value ( v) )
101147}
102148
149+ pub fn serialize_hash_tuple < S > ( value : & [ F ; HASH_SIZE ] , serializer : S ) -> Result < S :: Ok , S :: Error >
150+ where
151+ S : serde:: Serializer ,
152+ {
153+ serializer. serialize_str ( & format ! (
154+ "{:016x}{:016x}{:016x}{:016x}" ,
155+ value[ 0 ] . 0 , value[ 1 ] . 0 , value[ 2 ] . 0 , value[ 3 ] . 0
156+ ) )
157+ }
158+
159+ pub fn deserialize_hash_tuple < ' de , D > ( deserializer : D ) -> Result < [ F ; HASH_SIZE ] , D :: Error >
160+ where
161+ D : serde:: Deserializer < ' de > ,
162+ {
163+ let hex_str = String :: deserialize ( deserializer) ?;
164+ let mut v = [ F :: ZERO ; 4 ] ;
165+ for i in 0 ..4 {
166+ let start = i * 16 ;
167+ let end = start + 16 ;
168+ let hex_part = & hex_str[ start..end] ;
169+ v[ i] = F :: from_canonical_u64 (
170+ u64:: from_str_radix ( hex_part, 16 ) . map_err ( serde:: de:: Error :: custom) ?,
171+ ) ;
172+ }
173+ Ok ( v)
174+ }
175+
176+ pub fn serialize_value_tuple < S > ( value : & [ F ; VALUE_SIZE ] , serializer : S ) -> Result < S :: Ok , S :: Error >
177+ where
178+ S : serde:: Serializer ,
179+ {
180+ serializer. serialize_str ( & format ! (
181+ "{:016x}{:016x}{:016x}{:016x}" ,
182+ value[ 0 ] . 0 , value[ 1 ] . 0 , value[ 2 ] . 0 , value[ 3 ] . 0
183+ ) )
184+ }
185+
186+ pub fn deserialize_value_tuple < ' de , D > ( deserializer : D ) -> Result < [ F ; VALUE_SIZE ] , D :: Error >
187+ where
188+ D : serde:: Deserializer < ' de > ,
189+ {
190+ let hex_str = String :: deserialize ( deserializer) ?;
191+ let mut v = [ F :: ZERO ; VALUE_SIZE ] ;
192+ for i in 0 ..VALUE_SIZE {
193+ let start = i * 16 ;
194+ let end = start + 16 ;
195+ let hex_part = & hex_str[ start..end] ;
196+ v[ i] = F :: from_canonical_u64 (
197+ u64:: from_str_radix ( hex_part, 16 ) . map_err ( serde:: de:: Error :: custom) ?,
198+ ) ;
199+ }
200+ Ok ( v)
201+ }
202+
103203#[ cfg( test) ]
104204mod tests {
105205 use crate :: {
106- backends:: plonky2:: mock_signed:: MockSigner ,
107- frontend:: { containers:: { Dictionary , Array , Set } , SignedPodBuilder } ,
108- middleware:: Params ,
206+ backends:: plonky2:: { mock_main:: MockProver , mock_signed:: MockSigner } ,
207+ examples:: { zu_kyc_pod_builder, zu_kyc_sign_pod_builders} ,
208+ frontend:: {
209+ containers:: { Array , Dictionary , Set } ,
210+ MainPodBuilder , Operation , OperationArg , SignedPodBuilder ,
211+ } ,
212+ middleware:: { NativeOperation , OperationType , Params } ,
109213 } ;
110214
111215 use super :: * ;
@@ -172,4 +276,37 @@ mod tests {
172276 assert_eq ! ( pod. verify( ) , deserialized. verify( ) ) ;
173277 assert_eq ! ( pod. id( ) , deserialized. id( ) )
174278 }
279+
280+ #[ test]
281+ fn test_main_pod_serialization ( ) {
282+ let params = middleware:: Params :: default ( ) ;
283+
284+ let ( gov_id_builder, pay_stub_builder, sanction_list_builder) =
285+ zu_kyc_sign_pod_builders ( & params) ;
286+ let mut signer = MockSigner {
287+ pk : "ZooGov" . into ( ) ,
288+ } ;
289+ let gov_id_pod = gov_id_builder. sign ( & mut signer) . unwrap ( ) ;
290+ let mut signer = MockSigner {
291+ pk : "ZooDeel" . into ( ) ,
292+ } ;
293+ let pay_stub_pod = pay_stub_builder. sign ( & mut signer) . unwrap ( ) ;
294+ let mut signer = MockSigner {
295+ pk : "ZooOFAC" . into ( ) ,
296+ } ;
297+ let sanction_list_pod = sanction_list_builder. sign ( & mut signer) . unwrap ( ) ;
298+ let kyc_builder =
299+ zu_kyc_pod_builder ( & params, & gov_id_pod, & pay_stub_pod, & sanction_list_pod) . unwrap ( ) ;
300+
301+ let mut prover = MockProver { } ;
302+ let kyc_pod = kyc_builder. prove ( & mut prover, & params) . unwrap ( ) ;
303+
304+ let serialized = serde_json:: to_string ( & kyc_pod) . unwrap ( ) ;
305+ println ! ( "serialized: {}" , serialized) ;
306+ let deserialized: MainPod = serde_json:: from_str ( & serialized) . unwrap ( ) ;
307+
308+ assert_eq ! ( kyc_pod. public_statements, deserialized. public_statements) ;
309+ assert_eq ! ( kyc_pod. pod. id( ) , deserialized. pod. id( ) ) ;
310+ assert_eq ! ( kyc_pod. pod. verify( ) , deserialized. pod. verify( ) ) ;
311+ }
175312}
0 commit comments