Обязательна ли обработка типа «Дисбаланс» после снятия или депозита? - PullRequest
1 голос
/ 28 мая 2019

При использовании любой из функций, которые чеканят / записывают базовую валюту (например, Currency::withdraw()), вы получаете возвращаемое значение Imbalance. Субстрат ожидает, что я что-то с этим сделаю?

1 Ответ

1 голос
/ 28 мая 2019

Вы получаете Imbalance всякий раз, когда выполняете «одностороннюю операцию» в модуле «Балансы» (deposit, slash, withdraw и т. Д.).

Оба PositiveImbalance и NegativeImbalance реализуют черту Drop, которая определяет функцию деструктора, которая вызывается, когда переменная выходит из области видимости.

В случае 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 {...}
}
...