From 3bd078192cdb84288439d18da28d92acf3f4cf92 Mon Sep 17 00:00:00 2001
From: qh11 <qh11@illinois.edu>
Date: Tue, 1 Feb 2022 11:59:01 -0600
Subject: [PATCH] Update transaction.rs

---
 src/types/transaction.rs | 42 +++++++++++++++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/src/types/transaction.rs b/src/types/transaction.rs
index 626c2e4..cb98654 100755
--- a/src/types/transaction.rs
+++ b/src/types/transaction.rs
@@ -1,28 +1,60 @@
-use serde::{Serialize,Deserialize};
 use ring::signature::{Ed25519KeyPair, Signature, KeyPair, VerificationAlgorithm, EdDSAParameters};
 use rand::Rng;
+use crate::types::address::Address;
+use bincode::serialize;
+use serde::{Serialize,Deserialize};
+
 
 #[derive(Serialize, Deserialize, Debug, Default, Clone)]
 pub struct Transaction {
+    sender: Address,
+    receiver: Address,
+    value: u32
 }
 
+
 #[derive(Serialize, Deserialize, Debug, Default, Clone)]
 pub struct SignedTransaction {
+    transaction: Transaction,
+    signature_vec: Vec<u8>,
+    public_key_vec: Vec<u8>
 }
 
 /// Create digital signature of a transaction
 pub fn sign(t: &Transaction, key: &Ed25519KeyPair) -> Signature {
-    unimplemented!()
+    let serializeT = bincode::serialize(&t).unwrap(); 
+    let signature = key.sign(&serializeT);
+    signature
+    //unimplemented!()
 }
 
 /// Verify digital signature of a transaction, using public key instead of secret key
 pub fn verify(t: &Transaction, public_key: &[u8], signature: &[u8]) -> bool {
-    unimplemented!()
+    let serializeT = serialize(&t).unwrap();
+    let unparsed = ring::signature::UnparsedPublicKey::new(&ring::signature::ED25519, public_key);
+    let result = unparsed.verify(&serializeT, signature);
+    let mut ans:bool = false;
+    if result == Ok(()) {
+        ans = true;
+    } else {
+        ans = false;
+    }
+    return ans;
+    //unimplemented!()
 }
 
 #[cfg(any(test, test_utilities))]
 pub fn generate_random_transaction() -> Transaction {
-    unimplemented!()
+    let sender: [u8; 20] = rand::random();
+    let receiver: [u8; 20] = rand::random();
+    let value: u32 = rand::random();
+    let newTransaction = Transaction {
+        sender: sender.into(),
+        receiver: receiver.into(),
+        value: value
+    };
+    newTransaction
+    //unimplemented!()
 }
 
 // DO NOT CHANGE THIS COMMENT, IT IS FOR AUTOGRADER. BEFORE TEST
@@ -53,4 +85,4 @@ mod tests {
     }
 }
 
-// DO NOT CHANGE THIS COMMENT, IT IS FOR AUTOGRADER. AFTER TEST
\ No newline at end of file
+// DO NOT CHANGE THIS COMMENT, IT IS FOR AUTOGRADER. AFTER TEST
-- 
GitLab