Модуль «Сальдо» представляет собой комплексную валюту цепочки, которая обладает гибкостью для предоставления ряда различных функций.
В хранилище модуля «Сальдо» непосредственно хранятся только два сальдо:
- Свободный баланс
- Зарезервированный баланс
Сумма этих двух остатков используется для расчета общего баланса учетной записи.
Дополнительные уровни логики помещаются поверх свободного баланса для создания абстракций, таких как:
- Locked Balance
- Vesting Balance
Итак, давайте пройдемся по различным типам балансов, управляемых модулем Балансы.
Свободный баланс
Из раздела терминологии справочной документации:
Свободный баланс: Часть баланса, которая не зарезервирована.Свободный баланс является единственным балансом, который имеет значение для большинства операций.Когда этот баланс падает ниже существующего депозита, большая часть функциональности учетной записи удаляется.Когда и он, и зарезервированный баланс удаляются, считается, что аккаунт мертв.
Свободный баланс аккаунта используется всякий раз, когда transfer
, withdraw
или reserve
инициируется.Прежде чем эти операции могут быть успешно завершены, ensure_can_withdraw
вызывается с некоторыми WithdrawReason
и проверяет, что снятие не мешает некоторому переходному балансу или заблокированному остатку .
Это не препятствует выполнению других операций, таких как slash
, которые не заботятся о каких-либо абстракциях по свободному балансу.
Баланс передачи
счетаналожение баланса - это абстракция над свободным балансом.В частности, учетная запись, имеющая надёжный баланс, не может тратить со своего свободного баланса ниже этой суммы.Баланс на передачу не заботится о WithdrawReason
.
amount_spendable = free_balance - vesting_balance
Так что, даже если на счету может показаться, что у него много ликвидных средств, которые можно потратить при запросе свободного баланса, баланс наложения счетов может предотвратитьсредства от снятия.
Баланс наделения может быть установлен только в начале цепочки субстратов и уменьшается с линейной скоростью на блок с целью обеспечения полного баланса аккаунта на счете вопределенный номер блока.Баланс наделения может быть больше, чем свободный баланс в ситуациях, таких как задержка начала наложения или когда свободный баланс уменьшается путем сокращения.В этих случаях amount_spendable
насыщается до нуля.
Locked Balance
Блокированный баланс аккаунта - это еще одна абстракция над свободным балансом.В этом случае это определенная сумма, заблокированная для снятия по определенной причине.
Различные причины снятия средств:
- Транзакция Оплата: Для оплаты (система) транзакционные расходы.
- Передача: для передачи права собственности.
- Резерв: для резервирования некоторых средств для последующего возвращения или репатриации.
- Плата: дляоплатить некоторые другие (более высокого уровня) сборы.
Таким образом, если учетная запись имеет блокировку на 100 единиц с WithdrawReasons::Transfer
, она не может сделать перевод, который приносит ее свободный балансниже 100 единиц.Однако эта учетная запись сможет выполнять другие операции, такие как reserve
, с свободным балансом менее 100 единиц.С блокировкой может быть связано несколько причин, и в этом случае эти средства могут быть потрачены только по другим причинам.
На учетную запись можно установить несколько разных блокировок, но эти блокировки накладываются друг на друга, а не на стек,Это означает, что если у учетной записи есть 3 блокировки на 100 единиц, она может по любой причине потратить свои средства до 100 единиц, после чего блокировки начнут действовать.
Закрытый баланс также накладывается наналожение баланса, поскольку эти два проверяются независимо, но обе проверки должны пройти для ensure_can_withdraw
, чтобы быть успешным.
Зарезервированный баланс
Из раздела :
Зарезервированный баланс: Зарезервированный остаток по-прежнему принадлежит владельцу счета, ноприостановленоЗарезервированный баланс все еще может быть сокращен, но только после того, как весь свободный баланс был сокращен.Если зарезервированный баланс падает ниже существующего депозита, он и все связанные с ним функции будут удалены.Когда и он, и свободный баланс удаляются, считается, что аккаунт мертв.
Условно говоря, резервный баланс проще, чем свободный баланс, потому что над ним нет абстракций.Средства, зарезервированные от пользователя, не предназначены для непосредственного прикосновения к какой-либо другой логике за пределами модуля сальдо.Вместо этого средства сначала должны быть unreserved
, а затем изменены в free_balance
.
Зарезервированный баланс против заблокированного баланса
Зарезервированный баланс и заблокированный баланс выглядят одинаково, но принципиально отличаются.У заблокированного баланса есть идентификатор с точки зрения идентификатора блокировки, причин, по которым средства заблокированы, и на какой срок они заблокированы.Зарезервированный баланс не имеет ни одной из этих черт и не может быть недоступен без явного действия среды выполнения, чтобы отменить резервирование этих средств.
Кроме того, могут существовать последствия наличия свободного баланса по сравнению с отсутствием такового.Например, если вы установите блокировку для полного свободного остатка на счете, он все равно будет иметь свободный остаток, и OnFreeBalanceZero
не будет вызываться.Однако, если вы reserve
все средства, свободный остаток упадет ниже существующего депозита и OnFreeBalanceZero
будет запущен для модулей, которые реализовали эту функцию.