diff --git a/substrate/core/primitives/src/authority_id.rs b/substrate/core/primitives/src/authority_id.rs index d2094d417a..9f5e3c26ac 100644 --- a/substrate/core/primitives/src/authority_id.rs +++ b/substrate/core/primitives/src/authority_id.rs @@ -23,16 +23,6 @@ use H256; #[derive(Clone, Copy, PartialEq, Eq, Default, Encode, Decode)] pub struct AuthorityId(pub [u8; 32]); -impl AuthorityId { - /// Create an id from a 32-byte slice. Panics with other lengths. - #[cfg(feature = "std")] - fn from_slice(data: &[u8]) -> Self { - let mut r = [0u8; 32]; - r.copy_from_slice(data); - AuthorityId(r) - } -} - #[cfg(feature = "std")] impl ::std::fmt::Display for AuthorityId { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { @@ -94,14 +84,13 @@ impl Into for AuthorityId { #[cfg(feature = "std")] impl Serialize for AuthorityId { fn serialize(&self, serializer: S) -> Result where S: Serializer { - ::bytes::serialize(&self.0, serializer) + ::ed25519::serialize(&self, serializer) } } #[cfg(feature = "std")] impl<'de> Deserialize<'de> for AuthorityId { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { - ::bytes::deserialize_check_len(deserializer, ::bytes::ExpectedLen::Exact(32)) - .map(|x| AuthorityId::from_slice(&x)) + ::ed25519::deserialize(deserializer) } } diff --git a/substrate/core/primitives/src/ed25519.rs b/substrate/core/primitives/src/ed25519.rs index 2e30653e81..c6f28c64c1 100644 --- a/substrate/core/primitives/src/ed25519.rs +++ b/substrate/core/primitives/src/ed25519.rs @@ -24,6 +24,9 @@ use ring::{rand, signature}; use {hash::H512, AuthorityId}; use base58::{ToBase58, FromBase58}; +#[cfg(feature = "std")] +use serde::{de, Serializer, Deserializer, Deserialize}; + /// Alias to 512-bit hash when used in the context of a signature on the relay chain. pub type Signature = H512; @@ -278,6 +281,25 @@ impl Verifiable for LocalizedSignature { } } +/// Deserialize from `ss58` into something that can be constructed from `[u8; 32]`. +#[cfg(feature = "std")] +pub fn deserialize<'de, D, T: From<[u8; 32]>>(deserializer: D) -> Result where + D: Deserializer<'de>, +{ + let ss58 = String::deserialize(deserializer)?; + Public::from_ss58check(&ss58) + .map_err(|e| de::Error::custom(format!("{:?}", e))) + .map(|v| v.0.into()) +} + +/// Serializes something that implements `AsRef<[u8; 32]>` into `ss58`. +#[cfg(feature = "std")] +pub fn serialize>(data: &T, serializer: S) -> Result where + S: Serializer, +{ + serializer.serialize_str(&Public(*data.as_ref()).to_ss58check()) +} + #[cfg(test)] mod test { use super::*; diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 46d88c5cbc..c9643519e9 100644 Binary files a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index a12cd6a07e..fb0d9a9d04 100644 Binary files a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm and b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm differ