Skip to content

Commit f9f0b08

Browse files
kianenigmaggwpezKiChjang
authored
allow defensive operations to take a proof (paritytech#11353)
* allow defensive operations to take a proof * Update frame/support/src/traits/misc.rs Co-authored-by: Oliver Tale-Yazdi <[email protected]> * Update frame/bags-list/src/list/mod.rs Co-authored-by: Keith Yeung <[email protected]> * Update frame/support/src/traits/misc.rs Co-authored-by: Keith Yeung <[email protected]> * Update frame/support/src/traits/misc.rs Co-authored-by: Keith Yeung <[email protected]> * Fix build * fix build again * fmt Co-authored-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Keith Yeung <[email protected]>
1 parent f7df8fb commit f9f0b08

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

frame/bags-list/src/list/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,8 @@ impl<T: Config<I>, I: 'static> List<T, I> {
443443

444444
// remove the heavier node from this list. Note that this removes the node from storage and
445445
// decrements the node counter.
446-
// defensive: both nodes have been checked to exist.
447-
let _ = Self::remove(&heavier_id).defensive();
446+
let _ =
447+
Self::remove(&heavier_id).defensive_proof("both nodes have been checked to exist; qed");
448448

449449
// re-fetch `lighter_node` from storage since it may have been updated when `heavier_node`
450450
// was removed.

frame/staking/src/slashing.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use crate::{
5656
use codec::{Decode, Encode};
5757
use frame_support::{
5858
ensure,
59-
traits::{Currency, Get, Imbalance, OnUnbalanced},
59+
traits::{Currency, Defensive, Get, Imbalance, OnUnbalanced},
6060
};
6161
use scale_info::TypeInfo;
6262
use sp_runtime::{
@@ -600,8 +600,8 @@ pub fn do_slash<T: Config>(
600600
slashed_imbalance: &mut NegativeImbalanceOf<T>,
601601
slash_era: EraIndex,
602602
) {
603-
let controller = match <Pallet<T>>::bonded(stash) {
604-
None => return, // defensive: should always exist.
603+
let controller = match <Pallet<T>>::bonded(stash).defensive() {
604+
None => return,
605605
Some(c) => c,
606606
};
607607

frame/support/src/traits/misc.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ macro_rules! defensive {
5050
$error
5151
);
5252
debug_assert!(false, "{}: {:?}", $crate::traits::DEFENSIVE_OP_INTERNAL_ERROR, $error);
53+
};
54+
($error:tt, $proof:tt) => {
55+
frame_support::log::error!(
56+
target: "runtime",
57+
"{}: {:?}: {:?}",
58+
$crate::traits::DEFENSIVE_OP_PUBLIC_ERROR,
59+
$error,
60+
$proof,
61+
);
62+
debug_assert!(false, "{}: {:?}: {:?}", $crate::traits::DEFENSIVE_OP_INTERNAL_ERROR, $error, $proof);
5363
}
5464
}
5565

@@ -102,6 +112,10 @@ pub trait Defensive<T> {
102112
/// }
103113
/// ```
104114
fn defensive(self) -> Self;
115+
116+
/// Same as [`Defensive::defensive`], but it takes a proof as input, and displays it if the
117+
/// defensive operation has been triggered.
118+
fn defensive_proof(self, proof: &'static str) -> Self;
105119
}
106120

107121
/// Subset of methods similar to [`Defensive`] that can only work for a `Result`.
@@ -184,6 +198,13 @@ impl<T> Defensive<T> for Option<T> {
184198
},
185199
}
186200
}
201+
202+
fn defensive_proof(self, proof: &'static str) -> Self {
203+
if self.is_none() {
204+
defensive!(proof);
205+
}
206+
self
207+
}
187208
}
188209

189210
impl<T, E: sp_std::fmt::Debug> Defensive<T> for Result<T, E> {
@@ -229,6 +250,16 @@ impl<T, E: sp_std::fmt::Debug> Defensive<T> for Result<T, E> {
229250
},
230251
}
231252
}
253+
254+
fn defensive_proof(self, proof: &'static str) -> Self {
255+
match self {
256+
Ok(inner) => Ok(inner),
257+
Err(e) => {
258+
defensive!(e, proof);
259+
Err(e)
260+
},
261+
}
262+
}
232263
}
233264

234265
impl<T, E: sp_std::fmt::Debug> DefensiveResult<T, E> for Result<T, E> {

0 commit comments

Comments
 (0)