diff --git a/substrate/core/sr-primitives/src/generic/digest.rs b/substrate/core/sr-primitives/src/generic/digest.rs index 75ea6086b49c9c0d5f521916ec7396c9d36829cd..a946efb545220270babcf415206f9bf19385a013 100644 --- a/substrate/core/sr-primitives/src/generic/digest.rs +++ b/substrate/core/sr-primitives/src/generic/digest.rs @@ -108,7 +108,7 @@ impl<Hash, AuthorityId> DigestItem<Hash, AuthorityId> { } } -impl<Hash: Member, AuthorityId: Member> traits::DigestItem for DigestItem<Hash, AuthorityId> { +impl<Hash: Codec + Member, AuthorityId: Codec + Member> traits::DigestItem for DigestItem<Hash, AuthorityId> { type Hash = Hash; type AuthorityId = AuthorityId; diff --git a/substrate/core/sr-primitives/src/traits.rs b/substrate/core/sr-primitives/src/traits.rs index 6691ba0b369cc06dca57b3e6c9b817046e4ca566..75a543850ff3de58dd637e0ed8a66e267fb1cec5 100644 --- a/substrate/core/sr-primitives/src/traits.rs +++ b/substrate/core/sr-primitives/src/traits.rs @@ -333,6 +333,24 @@ impl CheckEqual for substrate_primitives::H256 { } } +impl<I> CheckEqual for I where I: DigestItem { + #[cfg(feature = "std")] + fn check_equal(&self, other: &Self) { + if self != other { + println!("DigestItem: given={:?}, expected={:?}", self, other); + } + } + + #[cfg(not(feature = "std"))] + fn check_equal(&self, other: &Self) { + if self != other { + runtime_io::print("DigestItem not equal"); + runtime_io::print(&Encode::encode(self)[..]); + runtime_io::print(&Encode::encode(other)[..]); + } + } +} + #[cfg(feature = "std")] pub trait MaybeSerializeDebugButNotDeserialize: Serialize + Debug {} #[cfg(feature = "std")] @@ -491,7 +509,7 @@ pub trait Digest: Member + Default { /// for casting member to 'system' log items, known to substrate. /// /// If the runtime does not supports some 'system' items, use `()` as a stub. -pub trait DigestItem: Member { +pub trait DigestItem: Codec + Member { type Hash: Member; type AuthorityId: Member; diff --git a/substrate/srml/executive/src/lib.rs b/substrate/srml/executive/src/lib.rs index 07fd67ff24679ac346c83e06e8c1d0a7df717307..3d1a8506133f754504dcbbd1b53bea36a11068b5 100644 --- a/substrate/srml/executive/src/lib.rs +++ b/substrate/srml/executive/src/lib.rs @@ -50,7 +50,7 @@ use rstd::prelude::*; use rstd::marker::PhantomData; use rstd::result; use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise, - MakePayment, Hash, As}; + MakePayment, Hash, As, Digest}; use runtime_support::Dispatchable; use codec::{Codec, Encode}; use system::extrinsics_root; @@ -204,10 +204,17 @@ impl< // remove temporaries. let new_header = <system::Module<System>>::finalise(); - // check digest. uncomment next two lines to figure out next digest hash for tests. -// runtime_io::print(&header.digest().encode()[..]); -// runtime_io::print(&new_header.digest().encode()[..]); - assert!(header.digest() == new_header.digest()); + // check digest. + assert_eq!( + header.digest().logs().len(), + new_header.digest().logs().len(), + "Number of digest items must match that calculated." + ); + let items_zip = header.digest().logs().iter().zip(new_header.digest().logs().iter()); + for (header_item, computed_item) in items_zip { + header_item.check_equal(&computed_item); + assert!(header_item == computed_item, "Digest item must match that calculated."); + } // check storage root. let storage_root = System::Hashing::storage_root();