Обязательна ли обработка типа "Дисбаланс" после снятия или депозита?

При использовании любой из функций, которые чеканят / записывают базовую валюту (например, 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 {...}
}
Другие вопросы по тегам