narodnik 5 лет назад
Родитель
Сommit
2d6beacaac
2 измененных файлов с 34 добавлено и 5 удалено
  1. 20 1
      proofs/spend.pism
  2. 14 4
      src/spend.rs

+ 20 - 1
proofs/spend.pism

@@ -3,6 +3,7 @@ constant G_VCR FixedGenerator
 constant G_SPEND FixedGenerator
 constant G_SPEND FixedGenerator
 constant PRF_NF BlakePersonalization
 constant PRF_NF BlakePersonalization
 constant CRH_IVK BlakePersonalization
 constant CRH_IVK BlakePersonalization
+constant NOTE_COMMIT PedersenPersonalization
 
 
 contract spend_contract
 contract spend_contract
     # Value commitment
     # Value commitment
@@ -89,6 +90,24 @@ start
     # TOTAL: 832 bits for preimage
     # TOTAL: 832 bits for preimage
     static_assert_binary_size preimage 832
     static_assert_binary_size preimage 832
     blake2s coin preimage CRH_IVK
     blake2s coin preimage CRH_IVK
-    emit_binary coin
+    binary_clone coin2 coin
+    emit_binary coin2
+
+    # coin_commit = PedersenHash(coin)
+    pedersen_hash cm coin NOTE_COMMIT
+    # left = coin_commit.u
+    ec_get_u left cm
+    emit_scalar left
+
+    # Our merkle tree has a height of 4
+{% for i in range(4) %}
+    # right = branch[{{ i }}]
+    # is_right = is_right[{{ i }}]
+    # if is_right:
+    #     left, right = right, left
+    # coin_commit = PedersenHash(left || right)
+    # left = coin_commit.u
+{% endfor %}
+    # Reveal the merkle root
 end
 end
 
 

+ 14 - 4
src/spend.rs

@@ -3,7 +3,7 @@ use bellman::groth16;
 use blake2s_simd::Params as Blake2sParams;
 use blake2s_simd::Params as Blake2sParams;
 use bls12_381::Bls12;
 use bls12_381::Bls12;
 use ff::Field;
 use ff::Field;
-use group::{Curve, Group, GroupEncoding};
+use group::{Curve, GroupEncoding};
 
 
 mod spend_contract;
 mod spend_contract;
 use spend_contract::SpendContract;
 use spend_contract::SpendContract;
@@ -12,6 +12,7 @@ struct SpendRevealedValues {
     value_commit: jubjub::SubgroupPoint,
     value_commit: jubjub::SubgroupPoint,
     nullifier: [u8; 32],
     nullifier: [u8; 32],
     coin: [u8; 32],
     coin: [u8; 32],
+    merkle_root: bls12_381::Scalar,
 }
 }
 
 
 impl SpendRevealedValues {
 impl SpendRevealedValues {
@@ -55,11 +56,18 @@ impl SpendRevealedValues {
                 .as_bytes(),
                 .as_bytes(),
         );
         );
 
 
-        SpendRevealedValues { value_commit, nullifier, coin }
+        let merkle_root = jubjub::ExtendedPoint::from(zcash_primitives::pedersen_hash::pedersen_hash(
+            zcash_primitives::pedersen_hash::Personalization::NoteCommitment,
+            multipack::bytes_to_bits_le(&coin)
+        ));
+        let affine = merkle_root.to_affine();
+        let merkle_root = affine.get_u();
+
+        SpendRevealedValues { value_commit, nullifier, coin, merkle_root }
     }
     }
 
 
-    fn make_outputs(&self) -> [bls12_381::Scalar; 6] {
-        let mut public_input = [bls12_381::Scalar::zero(); 6];
+    fn make_outputs(&self) -> [bls12_381::Scalar; 7] {
+        let mut public_input = [bls12_381::Scalar::zero(); 7];
 
 
         // CV
         // CV
         {
         {
@@ -98,6 +106,8 @@ impl SpendRevealedValues {
             public_input[5] = hash[1];
             public_input[5] = hash[1];
         }
         }
 
 
+        public_input[6] = self.merkle_root;
+
         public_input
         public_input
     }
     }
 }
 }