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

blockchain: Test unit showing manual header deserialization

x 6 месяцев назад
Родитель
Сommit
f2230450e5
1 измененных файлов с 47 добавлено и 0 удалено
  1. 47 0
      src/blockchain/header_store.rs

+ 47 - 0
src/blockchain/header_store.rs

@@ -490,3 +490,50 @@ impl HeaderStoreOverlay {
         Ok(ret)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use darkfi_sdk::{crypto::pasta_prelude::PrimeField, pasta::Fp};
+    use rand::Rng;
+
+    #[test]
+    /// Shows how to deserialize both the header with native and XMR PoW.
+    fn test_header_manual_deserialization() {
+        // =============
+        // Native header
+        // =============
+        let mut previous = [0u8; 32];
+        let mut rng = rand::thread_rng();
+        rng.fill(&mut previous[..]);
+        let previous = HeaderHash(previous);
+
+        let header = Header::new(previous, 1, 0, Timestamp::current_time());
+        let header_se = serialize(&header);
+
+        let version_de = header_se[0];
+        let previous_de = &header_se[1..33];
+        let height_de = &header_se[33..37];
+        let nonce_de = &header_se[37..41];
+        let timestamp_de = &header_se[41..49];
+        let transactions_root_de = &header_se[49..81];
+        let state_root_de = &header_se[81..113];
+        let pow_data_de = &header_se[113..];
+
+        assert_eq!(header.version, version_de);
+        assert_eq!(header.previous, HeaderHash(previous_de.try_into().unwrap()));
+        assert_eq!(header.height, u32::from_le_bytes(height_de.try_into().unwrap()));
+        assert_eq!(header.nonce, u32::from_le_bytes(nonce_de.try_into().unwrap()));
+        assert_eq!(header.timestamp.inner(), u64::from_le_bytes(timestamp_de.try_into().unwrap()));
+        assert_eq!(
+            header.transactions_root.inner(),
+            Fp::from_repr(transactions_root_de.try_into().unwrap()).unwrap()
+        );
+        assert_eq!(
+            header.state_root,
+            <&[u8] as TryInto<[u8; 32]>>::try_into(state_root_de).unwrap()
+        );
+        // Native PowData is an enum identifier 0x00
+        assert_eq!([0x00], <&[u8] as TryInto<[u8; 1]>>::try_into(pow_data_de).unwrap());
+    }
+}