Обязательна ли обработка типа "Дисбаланс" после снятия или депозита?
При использовании любой из функций, которые чеканят / записывают базовую валюту (например, Currency::withdraw()
) тебе дали Imbalance
возвращаемое значение Субстрат ожидает, что я что-то с этим сделаю?
1 ответ
Вы получаете обратно Imbalance
всякий раз, когда вы выполняете какую-либо "одностороннюю операцию" в модуле Балансы (deposit
, slash
, withdraw
, так далее...).
Оба PositiveImbalance
а также NegativeImbalance
реализовать Drop
trait, который определяет функцию деструктора, которая вызывается, когда переменная выходит из области видимости.
В случае Imbalance
, drop
Функция просто обновляет общую выдачу модуля сальдо, чтобы убедиться, что сумма всех текущих остатков на счетах равна общей выдаче.
Поэтому по умолчанию нет, вам не нужно ничего делать с возвращенным вам дисбалансом. Вы можете просто поместить результат "односторонней операции" в неиспользуемую переменную следующим образом:
let _ = <balances::Module<T> as Currency<_>>::withdraw(...)?;
Однако, если вы хотите, вам также предоставляется набор инструментов для управления возвращенными вам дисбалансами:
impl<T: Trait<I>, I: Instance> Imbalance<T::Balance> for NegativeImbalance<T, I> {
type Opposite = PositiveImbalance<T, I>;
fn zero() -> Self {...}
fn drop_zero(self) -> result::Result<(), Self> {...}
fn split(self, amount: T::Balance) -> (Self, Self) {...}
fn merge(mut self, other: Self) -> Self {...}
fn subsume(&mut self, other: Self) {...}
fn offset(self, other: Self::Opposite) -> result::Result<Self, Self::Opposite> {...}
fn peek(&self) -> T::Balance {...}
}