فهرست منبع

move parse_id function to src/util.rs

ghassmo 4 سال پیش
والد
کامیت
eebf9ddc5a
1فایلهای تغییر یافته به همراه96 افزوده شده و 0 حذف شده
  1. 96 0
      src/util.rs

+ 96 - 0
src/util.rs

@@ -1,4 +1,9 @@
 use crate::Result;
+use crate::serial::{deserialize, serialize};
+
+use sha2::{Digest, Sha256};
+use serde_json::Value;
+use log::*;
 
 use std::path::{Path, PathBuf};
 
@@ -17,3 +22,94 @@ pub fn join_config_path(file: &PathBuf) -> Result<PathBuf> {
 
     Ok(path)
 }
+
+// here we hash the alphanumeric token ID. if it fails, we change the last 4 bytes and hash it
+// again, and keep repeating until it works.
+pub fn parse_id(token: &Value) -> Result<jubjub::Fr> {
+    let tkn_str = token.as_str().unwrap();
+    if bs58::decode(tkn_str).into_vec().is_err() {
+        // TODO: make this an error
+        debug!(target: "CASHIER", "COULD NOT DECODE STR");
+    }
+    let mut data = bs58::decode(tkn_str).into_vec().unwrap();
+    let token_id = deserialize::<jubjub::Fr>(&data);
+    if token_id.is_err() {
+        let mut counter = 0;
+        loop {
+            data.truncate(28);
+            let serialized_counter = serialize(&counter);
+            data.extend(serialized_counter.iter());
+            let mut hasher = Sha256::new();
+            hasher.update(&data);
+            let hash = hasher.finalize();
+            let token_id = deserialize::<jubjub::Fr>(&hash);
+            if token_id.is_err() {
+                counter += 1;
+                continue;
+            }
+            debug!(target: "CASHIER", "DESERIALIZATION SUCCESSFUL");
+            let tkn = token_id.unwrap();
+            return Ok(tkn);
+        }
+    }
+    unreachable!();
+}
+
+
+
+#[cfg(test)]
+mod tests {
+    use crate::serial::{deserialize, serialize};
+    use sha2::{Digest, Sha256};
+
+    #[test]
+    fn test_jubjub_parsing() {
+        // 1. counter = 0
+        // 2. serialized_counter = serialize(counter)
+        // 3. asset_id_data = hash(data + serialized_counter)
+        // 4. asset_id = deserialize(asset_id_data)
+        // 5. test parse
+        // 6. loop
+        let tkn_str = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
+        println!("{}", tkn_str);
+        if bs58::decode(tkn_str).into_vec().is_err() {
+            println!("Could not decode str into vec");
+        }
+        let mut data = bs58::decode(tkn_str).into_vec().unwrap();
+        println!("{:?}", data);
+        let mut hasher = Sha256::new();
+        hasher.update(&data);
+        let hash = hasher.finalize();
+        let token_id = deserialize::<jubjub::Fr>(&hash);
+        println!("{:?}", token_id);
+        let mut counter = 0;
+        if token_id.is_err() {
+            println!("could not deserialize tkn 58");
+            loop {
+                println!("TOKEN IS NONE. COMMENCING LOOP");
+                counter += 1;
+                println!("LOOP NUMBER {}", counter);
+                println!("{:?}", data.len());
+                data.truncate(28);
+                let serialized_counter = serialize(&counter);
+                println!("{:?}", serialized_counter);
+                data.extend(serialized_counter.iter());
+                println!("{:?}", data.len());
+                let mut hasher = Sha256::new();
+                hasher.update(&data);
+                let hash = hasher.finalize();
+                let token_id = deserialize::<jubjub::Fr>(&hash);
+                println!("{:?}", token_id);
+                if token_id.is_err() {
+                    continue;
+                }
+                if counter > 10 {
+                    break;
+                }
+                println!("deserialization successful");
+                token_id.unwrap();
+                break;
+            }
+        };
+    }
+}