ソースを参照

dao2: working signature checking

x 3 年 前
コミット
2fe6425ecf

+ 6 - 1
example/dao2/contract/money/src/lib.rs

@@ -103,8 +103,11 @@ fn get_metadata(_cid: ContractId, ix: &[u8]) -> ContractResult {
             let params: MoneyTransferParams = deserialize(data)?;
 
             let mut zk_public_values: Vec<(String, Vec<pallas::Base>)> = Vec::new();
-            let signature_public_keys: Vec<pallas::Point> = Vec::new();
+            let mut signature_public_keys: Vec<pallas::Point> = Vec::new();
 
+            for input in &params.clear_inputs {
+                signature_public_keys.push(input.signature_public.inner());
+            }
             for input in &params.inputs {
                 let value_coords = input.value_commit.to_affine().coordinates().unwrap();
                 let token_coords = input.token_commit.to_affine().coordinates().unwrap();
@@ -124,6 +127,8 @@ fn get_metadata(_cid: ContractId, ix: &[u8]) -> ContractResult {
                         sig_y,
                     ]
                 ));
+
+                signature_public_keys.push(input.signature_public.inner());
             }
             for output in &params.outputs {
                 let value_coords = output.value_commit.to_affine().coordinates().unwrap();

+ 1 - 1
example/dao2/src/main.rs

@@ -136,7 +136,7 @@ fn validate(
     }
 
     tx.zk_verify(&zk_bins, &zkpublic_table)?;
-    //tx.verify_sigs();
+    tx.verify_sigs(&sigpub_table);
 
     // Now we finished verification stage, just apply all changes
     assert_eq!(tx.calls.len(), updates.len());

+ 7 - 7
example/dao2/src/tx.rs

@@ -1,4 +1,5 @@
 use darkfi::{crypto::Proof, Result, VerifyFailed::ProofVerifyFailed};
+use darkfi_serial::Encodable;
 use darkfi_sdk::{
     crypto::{
         schnorr::{SchnorrPublic, Signature},
@@ -88,19 +89,18 @@ impl Transaction {
     }
 
     pub fn verify_sigs(&self, sigpub_table: &Vec<Vec<pallas::Point>>) -> Result<()> {
-        //let mut tx_data = Vec::new();
-        //self.calls.encode(&mut tx_data)?;
-        //self.proofs.encode(&mut tx_data)?;
-        // Hash it and use the hash as the signing data
-
-        let mut unsigned_tx_data = vec![0xde, 0xad, 0xbe, 0xef];
+        let mut tx_data = Vec::new();
+        self.calls.encode(&mut tx_data)?;
+        self.proofs.encode(&mut tx_data)?;
+        // TODO: Hash it and use the hash as the signing data
+        // let sighash = ...
 
         for (i, (signatures, signature_public_keys)) in
             self.signatures.iter().zip(sigpub_table.iter()).enumerate()
         {
             for (signature_pub_key, signature) in signature_public_keys.iter().zip(signatures) {
                 let signature_pub_key = PublicKey::from(*signature_pub_key);
-                let verify_result = signature_pub_key.verify(&unsigned_tx_data[..], &signature);
+                let verify_result = signature_pub_key.verify(&tx_data[..], &signature);
                 assert!(verify_result, "verify sigs[{}] failed", i);
             }
             debug!(target: "demo", "verify_sigs({}) passed", i);