diff --git a/substrate/core/sr-primitives/src/generic/digest.rs b/substrate/core/sr-primitives/src/generic/digest.rs index f2185c23db..5d6aba3ab6 100644 --- a/substrate/core/sr-primitives/src/generic/digest.rs +++ b/substrate/core/sr-primitives/src/generic/digest.rs @@ -19,7 +19,7 @@ use rstd::prelude::*; use codec::{Decode, Encode, Codec, Input}; -use traits::{self, Member, DigestItem as DigestItemT, MaybeSerializeDebug, MaybeHash}; +use traits::{self, Member, DigestItem as DigestItemT, MaybeHash}; use substrate_primitives::hash::H512 as Signature; @@ -57,7 +57,7 @@ impl traits::Digest for Digest where /// Digest item that is able to encode/decode 'system' digest items and /// provide opaque access to other items. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug))] pub enum DigestItem { /// System digest item announcing that authorities set has been changed /// in the block. Contains the new set of authorities. @@ -72,6 +72,15 @@ pub enum DigestItem { Other(Vec), } +#[cfg(feature = "std")] +impl ::serde::Serialize for DigestItem { + fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { + self.using_encoded(|bytes| { + ::substrate_primitives::bytes::serialize(bytes, seq) + }) + } +} + /// A 'referencing view' for digest item. Does not own its contents. Used by /// final runtime implementations for encoding/decoding its log items. @@ -123,8 +132,8 @@ impl DigestItem { } impl< - Hash: Codec + Member + MaybeSerializeDebug, - AuthorityId: Codec + Member + MaybeSerializeDebug + MaybeHash + Hash: Codec + Member, + AuthorityId: Codec + Member + MaybeHash, > traits::DigestItem for DigestItem { type Hash = Hash; type AuthorityId = AuthorityId; @@ -207,3 +216,25 @@ impl<'a, Hash: Encode, AuthorityId: Encode> Encode for DigestItemRef<'a, Hash, A v } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_serialize_digest() { + let digest = Digest { + logs: vec![ + DigestItem::AuthoritiesChange(vec![1]), + DigestItem::ChangesTrieRoot(4), + DigestItem::Seal(1, 15.into()), + DigestItem::Other(vec![1, 2, 3]), + ], + }; + + assert_eq!( + ::serde_json::to_string(&digest).unwrap(), + r#"{"logs":["0x010401000000","0x0204000000","0x0301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","0x000c010203"]}"# + ); + } +} diff --git a/substrate/core/sr-primitives/src/traits.rs b/substrate/core/sr-primitives/src/traits.rs index 05f4e8122b..4db2d580d7 100644 --- a/substrate/core/sr-primitives/src/traits.rs +++ b/substrate/core/sr-primitives/src/traits.rs @@ -588,7 +588,7 @@ pub trait Applyable: Sized + Send + Sync { /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Codec`. pub trait Digest: Member + MaybeSerializeDebugButNotDeserialize + Default { - type Hash: Member + MaybeSerializeDebugButNotDeserialize; + type Hash: Member; type Item: DigestItem; /// Get reference to all digest items. @@ -611,8 +611,8 @@ pub trait Digest: Member + MaybeSerializeDebugButNotDeserialize + Default { /// /// If the runtime does not supports some 'system' items, use `()` as a stub. pub trait DigestItem: Codec + Member + MaybeSerializeDebugButNotDeserialize { - type Hash: Member + MaybeSerializeDebugButNotDeserialize; - type AuthorityId: Member + MaybeSerializeDebugButNotDeserialize + MaybeHash + codec::Encode + codec::Decode; + type Hash: Member; + type AuthorityId: Member + MaybeHash + codec::Encode + codec::Decode; /// Returns Some if the entry is the `AuthoritiesChange` entry. fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]>;