narodnik 5 лет назад
Родитель
Сommit
5989b9ef1c
3 измененных файлов с 87 добавлено и 35 удалено
  1. 12 0
      proofs/simple.pism
  2. 20 14
      proofs/working.pism
  3. 55 21
      scripts/pism.py

+ 12 - 0
proofs/simple.pism

@@ -0,0 +1,12 @@
+# :set syntax=pism
+# :source ../scripts/pism.vim
+constant G_SPEND FixedGenerator
+
+contract input_spend
+    param secret Fr
+start
+    fr_as_binary_le secret param:secret
+    ec_mul_const public secret G_SPEND
+    emit_ec public
+end
+

+ 20 - 14
proofs/working.pism

@@ -17,22 +17,28 @@ constant PRF_NF BlakePersonalization
 constant JUBJUB_FR_CAPACITY ByteSize
 constant JUBJUB_FR_CAPACITY ByteSize
 
 
 contract input_spend
 contract input_spend
-param value U64
-param randomness Fr
-param ak Point
-param ar Fr
-param nsk Fr
-param g_d Point
-param commitment_randomness Fr
-param auth_path_0_0 Scalar
-param auth_path_0_1 Bool
-param auth_path_1_0 Scalar
-param auth_path_1_1 Bool
-# ...
-param anchor Scalar
+param secret Fr
+
+#param value U64
+#param randomness Fr
+#param ak Point
+#param ar Fr
+#param nsk Fr
+#param g_d Point
+#param commitment_randomness Fr
+#param auth_path_0_0 Scalar
+#param auth_path_0_1 Bool
+#param auth_path_1_0 Scalar
+#param auth_path_1_1 Bool
+## ...
+#param anchor Scalar
 start
 start
+fr_as_binary_le secret param:secret
+ec_mul_const public secret G_SPEND
+emit_ec public
+
 # let rk: Point = ak + ar * G_SPEND
 # let rk: Point = ak + ar * G_SPEND
-witness ak param:ak
+#witness ak param:ak
 #assert_not_small_order ak
 #assert_not_small_order ak
 #fr_as_binary_le ar param:ar
 #fr_as_binary_le ar param:ar
 #ec_mul_const ar ar G_SPEND
 #ec_mul_const ar ar G_SPEND

+ 55 - 21
scripts/pism.py

@@ -1,5 +1,44 @@
 import sys
 import sys
 
 
+symbol_table = {
+    "contract": 1,
+    "param": 2,
+    "start": 0,
+    "end": 0,
+
+    "witness": 2,
+    "fr_as_binary_le": 2,
+    "ec_mul_const": 3,
+    "emit_ec": 1
+}
+
+types_map = {
+    "U64": "u64",
+    "Fr": "jubjub::Fr",
+    "Point": "jubjub::SubgroupPoint",
+    "Scalar": "bls12_381::Scalar",
+    "Bool": "bool"
+}
+
+command_desc = {
+    "witness": (
+        ("EdwardsPoint",    True),
+        ("Point",           False)
+    ),
+    "fr_as_binary_le": (
+        ("Vec<Boolean>",    True),
+        ("Fr",              False)
+    ),
+    "ec_mul_const": (
+        ("EdwardsPoint",    True),
+        ("Vec<Boolean>",    False),
+        ("FixedGenerator",  False)
+    ),
+    "emit_ec": (
+        ("EdwardsPoint",    False),
+    )
+}
+
 def eprint(*args):
 def eprint(*args):
     print(*args, file=sys.stderr)
     print(*args, file=sys.stderr)
 
 
@@ -71,15 +110,6 @@ def build_constants_table(constants):
         table[name] = type
         table[name] = type
     return table
     return table
 
 
-symbol_table = {
-    "contract": 1,
-    "param": 2,
-    "start": 0,
-    "end": 0,
-
-    "witness": 2,
-}
-
 def extract(segment):
 def extract(segment):
     assert segment
     assert segment
     # Does it have a declaration?
     # Does it have a declaration?
@@ -140,18 +170,6 @@ def to_initial_caps(snake_str):
     components = snake_str.split("_")
     components = snake_str.split("_")
     return "".join(x.title() for x in components)
     return "".join(x.title() for x in components)
 
 
-types_map = {
-    "U64": "u64",
-    "Fr": "jubjub::Fr",
-    "Point": "jubjub::SubgroupPoint",
-    "Scalar": "bls12_381::Scalar",
-    "Bool": "bool"
-}
-
-command_desc = {
-    "witness": (("EdwardsPoint", True), ("Point", False))
-}
-
 class Contract:
 class Contract:
 
 
     def __init__(self, name, params, program):
     def __init__(self, name, params, program):
@@ -238,6 +256,22 @@ class Contract:
 r"""let %s = ecc::EdwardsPoint::witness(
 r"""let %s = ecc::EdwardsPoint::witness(
     cs.namespace(|| "%s"),
     cs.namespace(|| "%s"),
     %s.map(jubjub::ExtendedPoint::from))?;""" % (out, line, point)
     %s.map(jubjub::ExtendedPoint::from))?;""" % (out, line, point)
+        elif command == "fr_as_binary_le":
+            out, fr = args
+            return \
+r"""let %s = boolean::field_into_boolean_vec_le(
+    cs.namespace(|| "%s"), %s)?;""" % (out, line, fr)
+        elif command == "ec_mul_const":
+            out, fr, base = args
+            return \
+r"""let %s = ecc::fixed_base_multiplication(
+    cs.namespace(|| "%s"),
+    &%s,
+    &%s,
+)?;""" % (out, line, fr, base)
+        elif command == "emit_ec":
+            point = args[0]
+            return '%s.inputize(cs.namespace(|| "%s"))?;' % (point, line)
 
 
     def carg(self, arg):
     def carg(self, arg):
         argname, is_param = arg
         argname, is_param = arg