diff --git a/substrate/core/sr-primitives/src/generic/digest.rs b/substrate/core/sr-primitives/src/generic/digest.rs index 75ea6086b4..a946efb545 100644 --- a/substrate/core/sr-primitives/src/generic/digest.rs +++ b/substrate/core/sr-primitives/src/generic/digest.rs @@ -108,7 +108,7 @@ impl DigestItem { } } -impl traits::DigestItem for DigestItem { +impl traits::DigestItem for DigestItem { 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 6691ba0b36..75a543850f 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 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 07fd67ff24..3d1a850613 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 = >::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();