Events to track extrinsic success (#640)

* Initial draft

* Fixes

* Extrinsic success events
This commit is contained in:
Gav Wood
2018-08-31 18:44:37 +02:00
committed by GitHub
parent 2601392d6a
commit 98a2121a3c
12 changed files with 57 additions and 15 deletions
+1 -1
View File
@@ -908,7 +908,7 @@ mod tests {
let mut second = from_block_number(3);
second.parent_hash = first_hash;
let second_hash = second.hash();
let _second_hash = second.hash();
let mut first_bft = service.build_upon(&first).unwrap().unwrap();
assert!(service.live_agreement.lock().as_ref().unwrap().0 == first);
@@ -93,10 +93,16 @@ macro_rules! impl_outer_event {
$(#[$attr])*
#[allow(non_camel_case_types)]
pub enum $name {
system(system::Event),
$(
$module($module::Event<$trait>),
)*
}
impl From<system::Event> for $name {
fn from(x: system::Event) -> Self {
$name::system(x)
}
}
$(
impl From<$module::Event<$trait>> for $name {
fn from(x: $module::Event<$trait>) -> Self {
@@ -205,7 +205,7 @@ impl<
// decode parameters and dispatch
let r = xt.apply();
<system::Module<System>>::note_applied_extrinsic();
<system::Module<System>>::note_applied_extrinsic(&r);
r.map(|_| internal::ApplyOutcome::Success).or_else(|e| Ok(internal::ApplyOutcome::Fail(e)))
}
@@ -233,6 +233,7 @@ mod tests {
use primitives::BuildStorage;
use primitives::traits::{HasPublicAux, Identity, Header as HeaderT, BlakeTwo256, AuxLookup};
use primitives::testing::{Digest, Header, Block};
use system;
struct NullLookup;
impl AuxLookup for NullLookup {
+33 -6
View File
@@ -83,7 +83,7 @@ pub trait Trait: Eq + Clone {
Hash = Self::Hash,
Digest = Self::Digest
>;
type Event: Parameter + Member;
type Event: Parameter + Member + From<Event>;
}
decl_module! {
@@ -110,6 +110,20 @@ pub struct EventRecord<E: Parameter + Member> {
pub event: E,
}
/// Event for the system module.
#[derive(Encode, Decode, PartialEq, Eq, Clone)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
pub enum Event {
/// An extrinsic completed successfully.
ExtrinsicSuccess,
/// An extrinsic failed.
ExtrinsicFailed,
}
impl From<Event> for () {
fn from(_: Event) -> () { () }
}
decl_storage! {
trait Store for Module<T: Trait> as System {
@@ -230,7 +244,11 @@ impl<T: Trait> Module<T> {
}
/// To be called immediately after an extrinsic has been applied.
pub fn note_applied_extrinsic() {
pub fn note_applied_extrinsic(r: &Result<(), &'static str>) {
Self::deposit_event(match r {
Ok(_) => Event::ExtrinsicSuccess,
Err(_) => Event::ExtrinsicFailed,
}.into());
<ExtrinsicIndex<T>>::put(<ExtrinsicIndex<T>>::get().unwrap_or_default() + 1u32);
}
@@ -301,6 +319,15 @@ mod tests {
type Event = u16;
}
impl From<Event> for u16 {
fn from(e: Event) -> u16 {
match e {
Event::ExtrinsicSuccess => 100,
Event::ExtrinsicFailed => 101,
}
}
}
type System = Module<Test>;
fn new_test_ext() -> runtime_io::TestExternalities<KeccakHasher> {
@@ -318,15 +345,15 @@ mod tests {
System::initialise(&2, &[0u8; 32].into(), &[0u8; 32].into());
System::deposit_event(42u16);
System::note_applied_extrinsic();
System::deposit_event(69u16);
System::note_applied_extrinsic();
System::note_applied_extrinsic(&Ok(()));
System::note_applied_extrinsic(&Err(""));
System::note_finished_extrinsics();
System::deposit_event(3u16);
System::finalise();
assert_eq!(System::events(), vec![
EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16 },
EventRecord { phase: Phase::ApplyExtrinsic(1), event: 69u16 },
EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16 },
EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16 },
EventRecord { phase: Phase::Finalization, event: 3u16 }
]);
});