From 32cba40d40a2a4ae42bee83354bb205338812ae2 Mon Sep 17 00:00:00 2001 From: yeastplume Date: Tue, 21 Apr 2020 10:22:42 +0100 Subject: [PATCH] serialize slate v4 ID as base64 --- libwallet/src/slate_versions/ser.rs | 31 +++++++++++++++++++++++++++++ libwallet/src/slate_versions/v4.rs | 1 + 2 files changed, 32 insertions(+) diff --git a/libwallet/src/slate_versions/ser.rs b/libwallet/src/slate_versions/ser.rs index fbea046b6..4c618838f 100644 --- a/libwallet/src/slate_versions/ser.rs +++ b/libwallet/src/slate_versions/ser.rs @@ -463,6 +463,37 @@ pub mod slate_state_v4 { } } +/// Serializes an secp256k1 pubkey to base64 +pub mod uuid_base64 { + use base64; + use serde::{Deserialize, Deserializer, Serializer}; + use uuid::Uuid; + + /// + pub fn serialize(id: &Uuid, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&base64::encode(&id.as_bytes())) + } + + /// + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + use serde::de::Error; + String::deserialize(deserializer) + .and_then(|string| { + base64::decode(&string).map_err(|err| Error::custom(err.to_string())) + }) + .and_then(|bytes: Vec| { + let mut b = [0u8; 16]; + b.copy_from_slice(&bytes[0..16]); + Ok(Uuid::from_bytes(b)) + }) + } +} // Test serialization methods of components that are being used #[cfg(test)] mod test { diff --git a/libwallet/src/slate_versions/v4.rs b/libwallet/src/slate_versions/v4.rs index b602e0cbf..37a8b7445 100644 --- a/libwallet/src/slate_versions/v4.rs +++ b/libwallet/src/slate_versions/v4.rs @@ -65,6 +65,7 @@ pub struct SlateV4 { #[serde(skip_serializing_if = "Option::is_none")] pub num_participants: Option, /// Unique transaction ID, selected by sender + #[serde(with = "ser::uuid_base64")] pub id: Uuid, /// Slate state #[serde(with = "ser::slate_state_v4")]