util.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. use log::debug;
  2. use serde_json::Value;
  3. use sha2::{Digest, Sha256};
  4. use std::path::{Path, PathBuf};
  5. use crate::{
  6. serial::{deserialize, serialize},
  7. Result,
  8. };
  9. pub fn expand_path(path: &str) -> Result<PathBuf> {
  10. let ret: PathBuf;
  11. if path.starts_with("~/") {
  12. let homedir = dirs::home_dir().unwrap();
  13. let remains = PathBuf::from(path.strip_prefix("~/").unwrap());
  14. ret = [homedir, remains].iter().collect();
  15. } else if path.starts_with('~') {
  16. ret = dirs::home_dir().unwrap();
  17. } else {
  18. ret = PathBuf::from(path);
  19. }
  20. Ok(ret)
  21. }
  22. pub fn join_config_path(file: &Path) -> Result<PathBuf> {
  23. let mut path = PathBuf::new();
  24. let dfi_path = Path::new("darkfi");
  25. if let Some(v) = dirs::config_dir() {
  26. path.push(v);
  27. }
  28. path.push(dfi_path);
  29. path.push(file);
  30. Ok(path)
  31. }
  32. // here we hash the alphanumeric token ID. if it fails, we change the last 4 bytes and hash it
  33. // again, and keep repeating until it works.
  34. pub fn parse_id(token: &Value) -> Result<jubjub::Fr> {
  35. let tkn_str = token.as_str().unwrap();
  36. if bs58::decode(tkn_str).into_vec().is_err() {
  37. // TODO: make this an error
  38. debug!(target: "CASHIER", "COULD NOT DECODE STR");
  39. }
  40. let mut data = bs58::decode(tkn_str).into_vec().unwrap();
  41. let token_id = deserialize::<jubjub::Fr>(&data);
  42. if token_id.is_err() {
  43. let mut counter = 0;
  44. loop {
  45. data.truncate(28);
  46. let serialized_counter = serialize(&counter);
  47. data.extend(serialized_counter.iter());
  48. let mut hasher = Sha256::new();
  49. hasher.update(&data);
  50. let hash = hasher.finalize();
  51. let token_id = deserialize::<jubjub::Fr>(&hash);
  52. if token_id.is_err() {
  53. counter += 1;
  54. continue;
  55. }
  56. debug!(target: "CASHIER", "DESERIALIZATION SUCCESSFUL");
  57. let tkn = token_id.unwrap();
  58. return Ok(tkn);
  59. }
  60. }
  61. unreachable!();
  62. }
  63. #[cfg(test)]
  64. mod tests {
  65. use crate::serial::{deserialize, serialize};
  66. use sha2::{Digest, Sha256};
  67. #[test]
  68. fn test_jubjub_parsing() {
  69. // 1. counter = 0
  70. // 2. serialized_counter = serialize(counter)
  71. // 3. asset_id_data = hash(data + serialized_counter)
  72. // 4. asset_id = deserialize(asset_id_data)
  73. // 5. test parse
  74. // 6. loop
  75. let tkn_str = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
  76. println!("{}", tkn_str);
  77. if bs58::decode(tkn_str).into_vec().is_err() {
  78. println!("Could not decode str into vec");
  79. }
  80. let mut data = bs58::decode(tkn_str).into_vec().unwrap();
  81. println!("{:?}", data);
  82. let mut hasher = Sha256::new();
  83. hasher.update(&data);
  84. let hash = hasher.finalize();
  85. let token_id = deserialize::<jubjub::Fr>(&hash);
  86. println!("{:?}", token_id);
  87. let mut counter = 0;
  88. if token_id.is_err() {
  89. println!("could not deserialize tkn 58");
  90. loop {
  91. println!("TOKEN IS NONE. COMMENCING LOOP");
  92. counter += 1;
  93. println!("LOOP NUMBER {}", counter);
  94. println!("{:?}", data.len());
  95. data.truncate(28);
  96. let serialized_counter = serialize(&counter);
  97. println!("{:?}", serialized_counter);
  98. data.extend(serialized_counter.iter());
  99. println!("{:?}", data.len());
  100. let mut hasher = Sha256::new();
  101. hasher.update(&data);
  102. let hash = hasher.finalize();
  103. let token_id = deserialize::<jubjub::Fr>(&hash);
  104. println!("{:?}", token_id);
  105. if token_id.is_err() {
  106. continue;
  107. }
  108. if counter > 10 {
  109. break;
  110. }
  111. println!("deserialization successful");
  112. token_id.unwrap();
  113. break;
  114. }
  115. };
  116. }
  117. }