Compare digests item-by-item (#869)

* compare digest item-by-item

* update comment
This commit is contained in:
Svyatoslav Nikolsky
2018-10-05 15:16:22 +03:00
committed by Gav Wood
parent 4d18c50e67
commit 187c232629
3 changed files with 32 additions and 7 deletions
@@ -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;
+19 -1
View File
@@ -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;
+12 -5
View File
@@ -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();