Является ли обработка типа «Имбаланс» обязательной после вывода или депозита?

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

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы получаете 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 {...}
}

Другие вопросы по теме