Просмотр исходного кода

example/dao: each Vec<Signature> corresponds to ONE function call

lunar-mining 3 лет назад
Родитель
Сommit
5c98311c98
2 измененных файлов с 59 добавлено и 16 удалено
  1. 54 9
      example/dao/src/main.rs
  2. 5 7
      example/dao/src/util.rs

+ 54 - 9
example/dao/src/main.rs

@@ -89,7 +89,12 @@ pub async fn example() -> Result<()> {
     let func_call = builder.build(&zk_bins);
     let func_calls = vec![func_call];
 
-    let signatures = sign([signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -230,7 +235,12 @@ async fn main() -> Result<()> {
     let func_call = builder.build(&zk_bins);
     let func_calls = vec![func_call];
 
-    let signatures = sign([signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -327,7 +337,12 @@ async fn main() -> Result<()> {
     let func_call = builder.build(&zk_bins)?;
     let func_calls = vec![func_call];
 
-    let signatures = sign([cashier_signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([cashier_signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -454,7 +469,12 @@ async fn main() -> Result<()> {
     let func_call = builder.build(&zk_bins)?;
     let func_calls = vec![func_call];
 
-    let signatures = sign([cashier_signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([cashier_signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -602,7 +622,12 @@ async fn main() -> Result<()> {
     let func_call = builder.build(&zk_bins);
     let func_calls = vec![func_call];
 
-    let signatures = sign([signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -723,7 +748,12 @@ async fn main() -> Result<()> {
     let func_call = builder.build(&zk_bins);
     let func_calls = vec![func_call];
 
-    let signatures = sign([signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -809,7 +839,12 @@ async fn main() -> Result<()> {
     let func_call = builder.build(&zk_bins);
     let func_calls = vec![func_call];
 
-    let signatures = sign([signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -895,7 +930,12 @@ async fn main() -> Result<()> {
     let func_call = builder.build(&zk_bins);
     let func_calls = vec![func_call];
 
-    let signatures = sign([signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     //// Validator
@@ -1082,7 +1122,12 @@ async fn main() -> Result<()> {
     let exec_func_call = builder.build(&zk_bins);
     let func_calls = vec![transfer_func_call, exec_func_call];
 
-    let signatures = sign([tx_signature_secret, exec_signature_secret].to_vec(), &func_calls);
+    let mut signatures = vec![];
+    for func_call in &func_calls {
+        let sign = sign([signature_secret].to_vec(), func_call);
+        signatures.push(sign);
+    }
+
     let tx = Transaction { func_calls, signatures };
 
     {

+ 5 - 7
example/dao/src/util.rs

@@ -140,7 +140,7 @@ impl ZkContractTable {
 
 pub struct Transaction {
     pub func_calls: Vec<FuncCall>,
-    pub signatures: Vec<Signature>,
+    pub signatures: Vec<Vec<Signature>>,
 }
 
 impl Transaction {
@@ -187,12 +187,12 @@ impl Transaction {
 
     pub fn verify_sigs(&self) {
         let mut unsigned_tx_data = vec![];
-        for (i, (func_call, signature)) in
+        for (i, (func_call, signatures)) in
             self.func_calls.iter().zip(self.signatures.clone()).enumerate()
         {
             func_call.encode(&mut unsigned_tx_data).expect("failed to encode data");
             let signature_pub_keys = func_call.call_data.signature_public_keys();
-            for signature_pub_key in signature_pub_keys {
+            for (signature_pub_key, signature) in signature_pub_keys.iter().zip(signatures) {
                 let verify_result = signature_pub_key.verify(&unsigned_tx_data[..], &signature);
                 assert!(verify_result, "verify sigs[{}] failed", i);
             }
@@ -201,12 +201,10 @@ impl Transaction {
     }
 }
 
-pub fn sign(signature_secrets: Vec<SecretKey>, func_calls: &Vec<FuncCall>) -> Vec<Signature> {
+pub fn sign(signature_secrets: Vec<SecretKey>, func_call: &FuncCall) -> Vec<Signature> {
     let mut signatures = vec![];
     let mut unsigned_tx_data = vec![];
-    for (_i, (signature_secret, func_call)) in
-        signature_secrets.iter().zip(func_calls.iter()).enumerate()
-    {
+    for signature_secret in signature_secrets {
         func_call.encode(&mut unsigned_tx_data).expect("failed to encode data");
         let signature = signature_secret.sign(&unsigned_tx_data[..]);
         signatures.push(signature);