From a38b72723492d4a3b9c2a0a626868ad7dadcb622 Mon Sep 17 00:00:00 2001 From: Thibaut Schaeffer Date: Sun, 26 Nov 2017 00:37:53 +0100 Subject: [PATCH] add private field to params. WIP --- examples/factorization.code | 2 +- examples/private.code | 13 ++++++++ out | Bin 0 -> 130 bytes out.code | 3 ++ proving.key | Bin 0 -> 2299 bytes src/absy.rs | 1 + src/flatten.rs | 3 ++ src/parser.rs | 59 +++++++++++++++++++++++++++++++++++- src/r1cs.rs | 6 +++- variables.inf | 4 +++ verification.key | 13 ++++++++ witness | 5 +++ 12 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 examples/private.code create mode 100644 out create mode 100644 out.code create mode 100644 proving.key create mode 100644 variables.inf create mode 100644 verification.key create mode 100644 witness diff --git a/examples/factorization.code b/examples/factorization.code index e5da5267..4984ace0 100644 --- a/examples/factorization.code +++ b/examples/factorization.code @@ -1,4 +1,4 @@ // a and b are factorization of c -def main(c): +def main(c, private a, private b): c == a * b return 1 diff --git a/examples/private.code b/examples/private.code new file mode 100644 index 00000000..6c8a6af0 --- /dev/null +++ b/examples/private.code @@ -0,0 +1,13 @@ +// only using sub, no need to flatten +def main(x, private y): + a = 5 + b = 7 + c = if a == b then 4 else 3 fi + c == 3 + d = if a == 5 then 1 else 2 fi + d == 1 + e = if a < b then 5 else 6 fi + e == 5 + f = if b < a then 7 else 8 fi + f == 8 + return x diff --git a/out b/out new file mode 100644 index 0000000000000000000000000000000000000000..0f6635bfd706bb6a559f0098b3627a097470aaf4 GIT binary patch literal 130 zcmZQ%fB+UKotv1M#|&jNLg{1%7%Pzx#!6yjg35wukSI(h8Dtc)Kq4|H391XOoDl#= Cdjt;v literal 0 HcmV?d00001 diff --git a/out.code b/out.code new file mode 100644 index 00000000..49c4e0a8 --- /dev/null +++ b/out.code @@ -0,0 +1,3 @@ +def main(c,a,b): + c == (a * b) + return 1 diff --git a/proving.key b/proving.key new file mode 100644 index 0000000000000000000000000000000000000000..c4bbdda777295f7a11886dc100375c5ac46cb58f GIT binary patch literal 2299 zcmVw3NZ>b3NZ>WOTF|2RVQ#_v8KB7_JqXlhs&~)NbLp^=U4>bTZ?!rJF=@^ zPsx$Q?_V=5f_Zei0bEr!R?je&_`GEZ6Xee>ATTkp#x<-D@-|X@Iy^}4Y`_}``abH> zVZsQ>2%ToZUoiDCs*6fwEniS}UayY=T|8llW7ecbmk?2VL7Xfey%Y*I3Ns2Y3N#8e z3Ns2YKt<7*@?>1YB;W9{TCeQS%Ppg9BhwBj4_~9&0yfPC_8XC6bi0U>3xf7}`chSe zno4~jxIAvsw$OrlJO5lPe&i8JgR$*)@%OYvMGa`2wMDv9kO-TN{P9++&#veJb`)bb z1-t|G3%W@Ih5%~jY|^sePBUY9bX2Al(cAX~ATSa;?gVYMV|160tEp+h`YSZIiG%wk z)o6G_EN#nAMIQYAT&>Zr>xQf04o1SF`$Yf_j2Af0C?XJm{uM7=S{e#458ygE8C2YI z00v`>w-;ZuhGPYuwF>zh_hz&Ve7t%H0C#3O_dMtC2o3c5@)-p_v&Bz^%T&)UM#`L1 zGZcRiHvfT$wM5iX7IMgO_QT;t7eMq~Rt4{bU}*=UpwLPx!gz&zr5@sxGSces&|P## z4xQ@3CZEaC-_Rg!c5kT)ATW$l>)$jnga@BumxsT#;XVWpi-Aelv3aEhXtG1MMg|wW zM(1wxxpJzRqq;kjt|{S?9T?;m6AXJ4Fvk6%`6CK2TP-8GNaB+~|DvHWKsDHU<4<>%GxQic9Xj_b);2@>Xi0#q{&4HW;K3|Qymfe<*GfqphQD`^ zWuq+_ATVDfkeliYZUCTKVA7!6b1vt5%&g0ExU+|Yu!BonC>*$zz9F&TeuFUX4ZkP) zF>vR*M~`eOQ}u-U97C{hbtnop3Ns2Z3Ni{c3Ns2YM8D!4y`{ufoU<)H(gdVi-@mdH zcx&#iin>H7CXWsV+*oBnQI^KPpYJze#5~Xsse1DW=}p68aq&Aa!789DATYY@_qj#7 z^=r^@)XgJZ7W4N3($i4tD)|SGvLFCnejet}--lB>;m25QklPJ_LN<(ZuY3tG4+IcE zWiGYEw*?9?YhMt~oBl=1{WHePSnxVRZaWq2b{+C3XC9b6f>!Agd2;*eQ-v8AgZ*e? zQ#6%JxJF^VRo4Ld6KgB5AXr@uATU$~YV_0X+r-x>2TRS(*_{SoHG_?ZVXeJ@pjBYhf|=}C1GDZOJH_3#YbXQ5>|@hkGq~jhNUA^|ATXD8 zWdDD_r{?t6TuXU*M>6551%t_TcDR&ZG%M1Nf+zaP8cEneorK?C@CBr#gg|3(=|9$e z*X?ggwLQ6Sc?AkN3NW1wkHw8cUDG`a$Mq=dcnT~=d3bN5Ze}mv2b#fm3Jy9O9*Y}? zx~6*;j_Xm@@f28$^6=h9-OOIT4>W`C6dW*7-r!5;uV$tpd|BC%b>2B!+gP-=gpoF3 zQ{lFGSTQa7*t{_hPlrs7h=sUYgl>}0pgw_0?8>SlUho&lhe-o4q17lHEh?!4fhZnF z%Q#N7xvT6=ntL2C=ulM#5t}q30a0MO%edV-#-1NdswZrvrMALwWsl*XcJ&IFjkMe% zF#k4@Wqq5&M!jBxv$=x?eXaX31T<(_E8O~?wDU$$B?^X6}0 zqvDQcnFOX_8-MpY5it24D4MU#oILun!;pb8}%FUl-t*-q57SHzeq2SJ<=QR>O#G{^{COix<8$20#A<&j}E*xkJ zv4;U)V?PJohezE6X9NOYOHq$2io*0!nXV7^PKzOYlP)0Cg!xrCe*$htVaTEAlDXX^ zFs}JrG_ljTr*lXgWl3NVMMuZa=!mvNA(K#(yp{cWy$#;an$l%`c~PLIddQVI+|PEF-e)f!V#*puP?SAoDy4?NO=cL{>yDlp7j60zt3vKejT zP!dM&i*{X=WG0WR*G{mhtF-*oDk_#ZS~ia4@!E>^I|%5WMl@cSW8{#U_k3H*TJwe< zV=XYuk0>I{M>Kt;Hc(B!e&i%s1b=MQi7+FJ@f-L{h0iYq=IHY!)oqie@!WGQv4c$@ z8s+Xej{&~!SaFw6m~|2`oe>aR5Bmwdh=%nbsA~XoVOo|0Mn#Af$56CRcwyBq>a%EJ z2o*dANo!goT2!!iFa7wOOqSqj=t&1|IgmbjrIpu7w1)4=|<`0;a1)CB@yZ z`=gFEx+T;3R{?(W_)G@9QEN%xy$!B#d(hWwYs{)wMOjUU8BYWx3M*r1FnlfR&0^~W zKq@e8eJOY3^+Lz97;}+_Q!a&si4|Bs6RXyXCWasbk4qE3CUWzT)D$2p%d1za)qUQv zR=%2@2}CTQY+tH;Ak-o-w=Jr|AVwyU-0)(I6(X=R`rW>3u{Fa7ME*=L6V3Y}wY=}Y z&MFd=4hT)3%C2|E6NqK6NaXEvBvK4SjIoL(Gzu^ZG72#YGYT;ZF$y#aF$ysXF$ysX VF$ypWF$ysXFbXjWF$yvYF$(PSEcgHb literal 0 HcmV?d00001 diff --git a/src/absy.rs b/src/absy.rs index a53573de..e1408f72 100644 --- a/src/absy.rs +++ b/src/absy.rs @@ -195,6 +195,7 @@ impl fmt::Debug for Statement { #[derive(Clone, PartialEq, Serialize, Deserialize)] pub struct Parameter { pub id: String, + pub private: bool, } impl fmt::Display for Parameter { diff --git a/src/flatten.rs b/src/flatten.rs index 37f7e33f..5b74813d 100644 --- a/src/flatten.rs +++ b/src/flatten.rs @@ -424,6 +424,7 @@ impl Flattener { match param_expr.apply_substitution(&self.substitution) { Expression::Identifier(ref x) => params_flattened.push(Parameter { id: x.clone().to_string(), + private: false }), _ => { let expr_subbed = param_expr.apply_substitution(&self.substitution); @@ -439,6 +440,7 @@ impl Flattener { .push(Statement::Definition(intermediate_var.clone(), rhs)); params_flattened.push(Parameter { id: intermediate_var.clone().to_string(), + private: false }); } } @@ -626,6 +628,7 @@ impl Flattener { for arg in funct.arguments { arguments_flattened.push(Parameter { id: arg.id.to_string(), + private: arg.private }); } // flatten statements in functions and apply substitution diff --git a/src/parser.rs b/src/parser.rs index c3c133f3..f747e3f7 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -150,6 +150,7 @@ enum Token { Mult, Div, Pow, + Private, Ide(String), Num(T), Unknown(String), @@ -188,6 +189,7 @@ impl fmt::Display for Token { Token::Mult => write!(f, "*"), Token::Div => write!(f, "/"), Token::Pow => write!(f, "**"), + Token::Private => write!(f, "private"), Token::Ide(ref x) => write!(f, "{}", x), Token::Num(ref x) => write!(f, "{}", x), Token::Unknown(ref x) => write!(f, "{}", x), @@ -502,6 +504,14 @@ fn next_token(input: &String, pos: &Position) -> (Token, String, Po }, ) } + Some(_) if input[offset..].starts_with("private ") => ( + Token::Private, + input[offset + 8..].to_string(), + Position { + line: pos.line, + col: pos.col + offset + 8, + }, + ), Some(x) => match x { '0'...'9' => parse_num( &input[offset..].to_string(), @@ -1132,8 +1142,55 @@ fn parse_function( let mut p = p3; loop { match next_token(&s, &p) { + (Token::Private, s4, p4) => { + match next_token(&s4, &p4) { + (Token::Ide(x), s5, p5) => { + args.push(Parameter { id: x, private: true }); + match next_token(&s5, &p5) { + (Token::Comma, s6, p6) => { + s = s6; + p = p6; + } + (Token::Close, s5, p5) => match next_token(&s5, &p5) { + (Token::Colon, s6, p6) => match next_token(&s6, &p6) { + (Token::InlineComment(_), _, _) => break, + (Token::Unknown(ref x6), ..) if x6 == "" => break, + (t6, _, p6) => { + return Err(Error { + expected: vec![Token::Unknown("".to_string())], + got: t6, + pos: p6, + }) + } + }, + (t6, _, p6) => { + return Err(Error { + expected: vec![Token::Colon], + got: t6, + pos: p6, + }) + } + }, + (t5, _, p5) => { + return Err(Error { + expected: vec![Token::Comma, Token::Close], + got: t5, + pos: p5, + }) + } + } + } + (t5, _, p5) => { + return Err(Error { + expected: vec![Token::Comma, Token::Close], + got: t5, + pos: p5, + }) + } + } + } (Token::Ide(x), s4, p4) => { - args.push(Parameter { id: x }); + args.push(Parameter { id: x, private: false }); match next_token(&s4, &p4) { (Token::Comma, s5, p5) => { s = s5; diff --git a/src/r1cs.rs b/src/r1cs.rs index 80c0ff49..1e5b92f0 100644 --- a/src/r1cs.rs +++ b/src/r1cs.rs @@ -290,7 +290,8 @@ pub fn r1cs_program( .iter() .find(|x: &&Function| x.id == "main".to_string()) .unwrap(); - variables.extend(main.arguments.iter().map(|x| format!("{}", x))); + variables.extend(main.arguments.iter().filter(|x| x.private == false).map(|x| format!("{}", x))); + // ~out is added after main's arguments as we want variables (columns) // in the r1cs to be aligned like "public inputs | private inputs" variables.push("~out".to_string()); @@ -298,6 +299,9 @@ pub fn r1cs_program( // position where private part of witness starts let private_inputs_offset = variables.len(); + variables.extend(main.arguments.iter().filter(|x| x.private == true).map(|x| format!("{}", x))); + + for def in &main.statements { let mut a_row: Vec<(usize, T)> = Vec::new(); let mut b_row: Vec<(usize, T)> = Vec::new(); diff --git a/variables.inf b/variables.inf new file mode 100644 index 00000000..50241d18 --- /dev/null +++ b/variables.inf @@ -0,0 +1,4 @@ +Private inputs offset: +3 +R1CS variable order: +~one c ~out a b diff --git a/verification.key b/verification.key new file mode 100644 index 00000000..dfbf4750 --- /dev/null +++ b/verification.key @@ -0,0 +1,13 @@ + vk.A = [0x31794eb3a1691cc21bc9c964ee68db7ae28106b82787eef92fcae4a9c0e483, 0x2852286171b3eb1fff063874ef396d5c87d28b156a46a6ced7679780a681925e], [0x23a5d861d726720339f2861a861ee210604638ee1ead2af2c6f625d56cfda2d1, 0x16e92a3994f5a1d5809dcf62cf954fa9ae908a31b3080da065330850e9dfc543] + vk.B = 0x2b943f88d3bf0f6e2a822c6403c2c65a1d15450140b3f16a88f57e341c803b9f, 0x1c2dfce4287fb58ffe48044b396f9a988af57f58b778bbe395d73b3ebd40ac52 + vk.C = [0x17d0522fa7e63bbdbefac9977e8787dbca5493f4d5b8001478944ab0be9474d2, 0x234356e7b44810bda6a4bb5ff7a17f01cd2be0356d1477912a9b97557e428341], [0x14893eb4d934af54b57b983239d5dc3b4074d809a87399f40626d685579d41c, 0x257802281a9aa9825bc886e6d9a0251a82fa50758bcd2677019ef6612e581819] + vk.gamma = [0x2ab2532debf0b5223ec3212b4e7b0afd66a3e10b6bc24282ea9780b40b06427b, 0x68d5b8e053f64c547a4363171733e75ca6cb692eaed3fd062bb810b42731e43], [0x15b3a5a27e97d8850ccb7a8f7be16835fd069c8982852ba0a19ca6699fed1f65, 0x3f7228f46f64d11bcba6540de41036d25dcad2b05b3f7066557c0b675692cb7] + vk.gammaBeta1 = 0x27602b76a313ceecf3afd6417563cb03de4e74799dd16fef8c28171313679571, 0x10ac0cd595cfdaf433efc2d4464271c62f7dc0f4e3c6b137f11ead282f03f76c + vk.gammaBeta2 = [0x12ffa58b224c0656664d1dd439cbb6b339e4f2d28a8efd3592cb418b0bb71e7f, 0x1431c785fb238f1c42f96aed8118b3abb575dc75335435b33f3266eb796ff26c], [0x55e2b2ba927eee3bc8aecbab1a72e1702f692f66b3cfa3c41069dde61ba0649, 0x9fff9db01e86a749b3a7e47767e11fbf10c16dbc8f74379f67af61eeb3c1bba] + vk.Z = [0x11b12fe6a6dcd649d8c634e506a4aa176ca70fde632fdfda06b9b28073732517, 0x2646ea2adcd0c0726548ecaa03dae29070f95c286985c8e07c2e18863be619c1], [0x256579f8d1321a4ca8e6a807e103c2e8d08d9b88b930e9b17d4c3313a7454851, 0x225eca3599e7f392017bb5dde4df4c974422e2377828ed91a1a6b56e2f278184] + vk.IC.len() = 5 + vk.IC[0] = 0x1bb9cf704f62808123097642c9fc34dfa360451e8f8dcb6ea438793d45fa082d, 0x11729b4322acb068e76e0db12bf08825c77271879b241908d70ee7597efa4460 + vk.IC[1] = 0x2644885e567a696deb2169d46cde807af0344e5d29fd86bd2a2fd94ce07fe4a3, 0xde1853871c61add0694c4f0c86575fde5b53e504c9ae799f54726c096f5496e + vk.IC[2] = 0x1abeee45d3bb30bc7f335e4e118ce7c50252e7f5998efafe1d68b1582fd0bdeb, 0x267ff3cc655bdf4aa2eb413fd64d6782af4d763670ec3c984e36a1c10bad7064 + vk.IC[3] = 0x28f8d04e1314fff7541495e1798bd3d9e16e59c6744e42747cd71032979f6fb9, 0x2f696b7f7a693e24461c733af0252bbb55ad38af1341d98bc1e5fe1470acd13b + vk.IC[4] = 0x100dfc176ee1c80cb185857765fe74db10cf2b967ea9cf09e75955a9d3d72475, 0x2d391ecaaefbb947add78ed0ad7f2d9efec162aef33779027016018ba8c799f6 diff --git a/witness b/witness new file mode 100644 index 00000000..45e75d8c --- /dev/null +++ b/witness @@ -0,0 +1,5 @@ +~out 1 +a 2 +~one 1 +c 8 +b 4