3
3
use risc0_zkvm:: { default_prover, ExecutorEnv , Receipt } ;
4
4
use serde:: { Deserialize , Serialize } ;
5
5
use std:: fs;
6
+ use std:: str:: FromStr ;
6
7
7
- use methods:: { JWT_VERIFY_ELF , JWT_VERIFY_ID } ;
8
+ use methods:: { BID_VERIFIER_ELF , BID_VERIFIER_ID , PREDICATE_VERIFIER_ELF , PREDICATE_VERIFIER_ID } ;
9
+ use crate :: Condition :: { GT , LT } ;
8
10
9
11
#[ derive( Serialize , Deserialize , Debug ) ]
10
12
struct PublicKeyHolder {
@@ -47,13 +49,48 @@ struct Root {
47
49
house_loan_credential : Credential ,
48
50
}
49
51
52
+ #[ derive( Serialize , Deserialize , Debug , PartialEq ) ]
53
+ enum Condition {
54
+ LT ,
55
+ GT ,
56
+ EQ ,
57
+ }
58
+
59
+ #[ derive( Serialize , Deserialize , Debug , PartialEq ) ]
60
+ struct Predicate {
61
+ field : String ,
62
+ condition : Condition ,
63
+ value : u32
64
+ }
65
+
66
+
67
+ fn prove_predicate (
68
+ jwt : & str ,
69
+ public_key_issuer : & str ,
70
+ predicate : Predicate
71
+ ) -> Receipt {
72
+
73
+ let input = ( jwt, public_key_issuer, predicate) ;
74
+ let env = ExecutorEnv :: builder ( )
75
+ . write ( & input)
76
+ . unwrap ( )
77
+ . build ( )
78
+ . unwrap ( ) ;
79
+
80
+ let prover = default_prover ( ) ;
81
+
82
+ // Produce a receipt by proving the specified ELF binary.
83
+ prover. prove_elf ( env, PREDICATE_VERIFIER_ELF ) . unwrap ( )
84
+ }
85
+
50
86
fn prove_valid_bid (
51
87
bid_size : u32 ,
52
88
person_credential_jwt : & str ,
53
89
house_loan_credential_jwt : & str ,
54
90
eid_issuer_public_key : & str ,
55
91
bank_public_key : & str ,
56
92
) -> Receipt {
93
+
57
94
let input = ( bid_size, person_credential_jwt, house_loan_credential_jwt, eid_issuer_public_key, bank_public_key) ;
58
95
let env = ExecutorEnv :: builder ( )
59
96
. write ( & input)
@@ -65,7 +102,7 @@ fn prove_valid_bid(
65
102
let prover = default_prover ( ) ;
66
103
67
104
// Produce a receipt by proving the specified ELF binary.
68
- prover. prove_elf ( env, JWT_VERIFY_ELF ) . unwrap ( )
105
+ prover. prove_elf ( env, BID_VERIFIER_ELF ) . unwrap ( )
69
106
}
70
107
71
108
fn main ( ) {
@@ -74,6 +111,36 @@ fn main() {
74
111
75
112
// read json file from current directory
76
113
let data = fs:: read_to_string ( "./data.json" ) . expect ( "Unable to read file" ) ;
114
+ // verify_bid_program(&data);
115
+ verify_predicate_program ( & data) ;
116
+ }
117
+
118
+ fn verify_predicate_program ( data : & String ) {
119
+ let root: Root = serde_json:: from_str ( & data) . expect ( "JSON was not well-formatted" ) ;
120
+
121
+ let person_credential = root. person_credential ;
122
+
123
+ let predicate = Predicate {
124
+ field : String :: from_str ( "date_of_birth" ) . unwrap ( ) ,
125
+ condition : GT ,
126
+ value : 19791001
127
+ } ;
128
+
129
+ let public_key_eid = root. eid_issuer . public_key ;
130
+
131
+ let receipt = prove_predicate ( & person_credential. proof . jwt , & public_key_eid, predicate) ;
132
+
133
+ let valid: bool = receipt. journal . decode ( ) . unwrap ( ) ;
134
+ receipt. verify ( PREDICATE_VERIFIER_ID ) . unwrap ( ) ;
135
+
136
+ println ! ( "\n " ) ;
137
+ println ! ( "Verification results:" ) ;
138
+ println ! ( "\n " ) ;
139
+ println ! ( "{:<30} {}" , "Verification status:" , if valid { "Verified ✅" } else { "Failed ❌" } ) ;
140
+
141
+ }
142
+
143
+ fn verify_bid_program ( data : & String ) {
77
144
78
145
let root: Root = serde_json:: from_str ( & data) . expect ( "JSON was not well-formatted" ) ;
79
146
@@ -85,9 +152,15 @@ fn main() {
85
152
let person_credential = root. person_credential ;
86
153
let house_loan_credential = root. house_loan_credential ;
87
154
88
- let receipt = prove_valid_bid ( bid_size, & person_credential. proof . jwt , & house_loan_credential. proof . jwt , & public_key_eid, & public_key_bank) ;
155
+ let receipt = prove_valid_bid (
156
+ bid_size,
157
+ & person_credential. proof . jwt ,
158
+ & house_loan_credential. proof . jwt ,
159
+ & public_key_eid,
160
+ & public_key_bank
161
+ ) ;
89
162
let ( is_valid_bid, bidder_did, bid_size) : ( u32 , String , u32 ) = receipt. journal . decode ( ) . unwrap ( ) ;
90
- receipt. verify ( JWT_VERIFY_ID ) . unwrap ( ) ;
163
+ receipt. verify ( BID_VERIFIER_ID ) . unwrap ( ) ;
91
164
92
165
// print two empty lines
93
166
println ! ( "\n " ) ;
@@ -99,5 +172,4 @@ fn main() {
99
172
println ! ( "{:<30} {}" , "Bid status:" , if is_valid_bid != 0 { "Valid ✅" } else { "Invalid ❌" } ) ;
100
173
println ! ( "{:<30} {}" , "Bidder DID:" , bidder_did) ;
101
174
println ! ( "\n " ) ;
102
-
103
175
}
0 commit comments