feat: Migrer de zstd vers flate2 pour la compatibilité WASM

This commit is contained in:
Debian 2025-08-29 15:07:52 +00:00
parent e98c5e7073
commit 694bc71714
4 changed files with 20 additions and 12 deletions

View File

@ -21,7 +21,7 @@ rand = "0.8.5"
serde = { version = "1.0.193", features = ["derive"] } serde = { version = "1.0.193", features = ["derive"] }
serde_json = { version = "1.0.108" } serde_json = { version = "1.0.108" }
rs_merkle = "1.4.2" rs_merkle = "1.4.2"
zstd = "0.13.3" flate2 = { version = "1.0", features = ["miniz_oxide"] }
getrandom = { version = "0.2", features = ["js"] } getrandom = { version = "0.2", features = ["js"] }
sp-client = { git = "https://github.com/Sosthene00/sp-client.git", branch = "dev", default-features = false } sp-client = { git = "https://github.com/Sosthene00/sp-client.git", branch = "dev", default-features = false }
backend-blindbit-native = { git = "https://github.com/Sosthene00/sp-client.git", branch = "dev", optional = true } backend-blindbit-native = { git = "https://github.com/Sosthene00/sp-client.git", branch = "dev", optional = true }

View File

@ -11,7 +11,7 @@ pub use serde_json;
pub use sp_client; pub use sp_client;
pub use tsify; pub use tsify;
pub use wasm_bindgen; pub use wasm_bindgen;
pub use zstd; pub use flate2;
#[cfg(feature = "blindbit-wasm")] #[cfg(feature = "blindbit-wasm")]
pub use js_sys; pub use js_sys;

View File

@ -14,6 +14,8 @@ use sp_client::{
silentpayments::SilentPaymentAddress, silentpayments::SilentPaymentAddress,
}; };
use tsify::Tsify; use tsify::Tsify;
use flate2::write::{DeflateEncoder, DeflateDecoder};
use flate2::Compression;
use crate::hash::AnkPcdHash; use crate::hash::AnkPcdHash;
use crate::serialization::OutPointMemberMap; use crate::serialization::OutPointMemberMap;
@ -24,7 +26,6 @@ use crate::{
}; };
pub const PCD_VERSION: u8 = 1; pub const PCD_VERSION: u8 = 1;
pub(crate) const ZSTD_COMPRESSION_LEVEL: i32 = zstd::DEFAULT_COMPRESSION_LEVEL;
pub trait PcdSerializable { pub trait PcdSerializable {
fn serialize_to_pcd(&self) -> Result<Vec<u8>>; fn serialize_to_pcd(&self) -> Result<Vec<u8>>;
@ -36,7 +37,7 @@ pub trait PcdSerializable {
impl PcdSerializable for serde_json::Value { impl PcdSerializable for serde_json::Value {
fn serialize_to_pcd(&self) -> Result<Vec<u8>> { fn serialize_to_pcd(&self) -> Result<Vec<u8>> {
let mut compressed = Vec::new(); let mut compressed = Vec::new();
let mut encoder = zstd::stream::Encoder::new(&mut compressed, ZSTD_COMPRESSION_LEVEL)?; let mut encoder = DeflateEncoder::new(&mut compressed, Compression::default());
encoder.write_all(&[PCD_VERSION])?; encoder.write_all(&[PCD_VERSION])?;
encoder.write_all(&[DataType::Json as u8])?; encoder.write_all(&[DataType::Json as u8])?;
@ -48,7 +49,9 @@ impl PcdSerializable for serde_json::Value {
fn deserialize_from_pcd(data: &[u8]) -> Result<Self> { fn deserialize_from_pcd(data: &[u8]) -> Result<Self> {
let mut decompressed = Vec::new(); let mut decompressed = Vec::new();
zstd::stream::copy_decode(data, &mut decompressed)?; let mut decoder = DeflateDecoder::new(&mut decompressed);
decoder.write_all(data)?;
let decompressed = decoder.finish()?;
if decompressed.len() < 3 { if decompressed.len() < 3 {
return Err(Error::msg("Invalid data: too short")); return Err(Error::msg("Invalid data: too short"));
@ -71,7 +74,7 @@ impl PcdSerializable for serde_json::Value {
impl PcdSerializable for FileBlob { impl PcdSerializable for FileBlob {
fn serialize_to_pcd(&self) -> Result<Vec<u8>> { fn serialize_to_pcd(&self) -> Result<Vec<u8>> {
let mut compressed = Vec::new(); let mut compressed = Vec::new();
let mut encoder = zstd::stream::Encoder::new(&mut compressed, ZSTD_COMPRESSION_LEVEL)?; let mut encoder = DeflateEncoder::new(&mut compressed, Compression::default());
encoder.write_all(&[PCD_VERSION])?; encoder.write_all(&[PCD_VERSION])?;
encoder.write_all(&[DataType::FileBlob as u8])?; encoder.write_all(&[DataType::FileBlob as u8])?;
@ -87,7 +90,9 @@ impl PcdSerializable for FileBlob {
fn deserialize_from_pcd(data: &[u8]) -> Result<Self> { fn deserialize_from_pcd(data: &[u8]) -> Result<Self> {
let mut decompressed = Vec::new(); let mut decompressed = Vec::new();
zstd::stream::copy_decode(data, &mut decompressed)?; let mut decoder = DeflateDecoder::new(&mut decompressed);
decoder.write_all(data)?;
let decompressed = decoder.finish()?;
if decompressed.len() < 4 { if decompressed.len() < 4 {
return Err(Error::msg("Invalid data: too short")); return Err(Error::msg("Invalid data: too short"));

View File

@ -2,6 +2,7 @@ use anyhow::Result;
use std::collections::{BTreeMap, HashMap, HashSet}; use std::collections::{BTreeMap, HashMap, HashSet};
use std::str::FromStr; use std::str::FromStr;
use std::sync::{Mutex, MutexGuard, OnceLock}; use std::sync::{Mutex, MutexGuard, OnceLock};
use std::io::Write;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use sp_client::{ use sp_client::{
@ -698,7 +699,7 @@ mod tests {
SpClient, SpendKey, SpClient, SpendKey,
}; };
use crate::pcd::{Member, ValidationRule, ZSTD_COMPRESSION_LEVEL}; use crate::pcd::{Member, ValidationRule};
use super::*; use super::*;
@ -1362,8 +1363,9 @@ mod tests {
&Value::String("new_value1".to_owned()), &Value::String("new_value1".to_owned()),
) )
.unwrap(); .unwrap();
let updated_value = let mut encoder = DeflateEncoder::new(Vec::new(), Compression::default());
zstd::encode_all(serialized_value.as_slice(), ZSTD_COMPRESSION_LEVEL).unwrap(); encoder.write_all(serialized_value.as_slice()).unwrap();
let updated_value = encoder.finish().unwrap();
new_state new_state
.update_value(key_to_modify.as_str(), updated_value.as_slice()) .update_value(key_to_modify.as_str(), updated_value.as_slice())
.unwrap(); .unwrap();
@ -1396,8 +1398,9 @@ mod tests {
&Value::String("new_value1".to_owned()), &Value::String("new_value1".to_owned()),
) )
.unwrap(); .unwrap();
let updated_value = let mut encoder = DeflateEncoder::new(Vec::new(), Compression::default());
zstd::encode_all(serialized_value.as_slice(), ZSTD_COMPRESSION_LEVEL).unwrap(); encoder.write_all(serialized_value.as_slice()).unwrap();
let updated_value = encoder.finish().unwrap();
new_state new_state
.update_value(key_to_modify.as_str(), updated_value.as_slice()) .update_value(key_to_modify.as_str(), updated_value.as_slice())
.unwrap(); .unwrap();