Группы аккаунтов
Группа аккаунтов — это один аккаунт, до которого можно дойти по многим адресам. Кошелёк на телефоне, аппаратный кошелёк и браузерный кошелёк Ethereum могут быть участниками, и платёж любому из них попадает на один общий баланс. Один участник, контролёр, управляет группой и решает, сколько может тратить каждый другой участник. Это делает возможными семейные и корпоративные аккаунты с лимитом расходов для каждого человека или устройства.
Один аккаунт, много адресов
Баланс группы, её токены и всё остальное, чем она владеет, находятся на бесключевом адресе группы, производном от транзакции, которая основала группу:
group address = 00000000 ‖ SHA3-256( "ZBC-GROUP" ‖ founding transaction hash )
Ключа к нему нет ни у кого. Каждый адрес участника разрешается в него: платёж любому участнику зачисляется группе, а запрос баланса любого участника возвращает баланс группы. Каждый адрес сохраняет собственный nonce.
Группа содержит до 100 адресов, включая контролёра. Участники могут быть любого типа ключа, способного подписывать (ZooBC, Bitcoin, Ethereum, Solana и другие; см. Ключи и типы аккаунтов), и участником может быть также мультиподписной аккаунт.
Вступление
Привязывает новый адрес только контролёр, транзакцией LinkAccount, и только с согласия этого адреса: подписи над дайджестом, привязанным к цепочке, с меткой «ZBC-GROUP-LINK», действительной не более чем на 5 760 блоков (сутки) вперёд и пригодной к использованию один раз. Согласием может быть собственная подпись адреса, пороговое число подписей мультиподписного аккаунта или personal_sign из Ethereum.
Вступление переносит в группу всё, чем владеет адрес, до 1 000 объектов: его баланс, токены, выпущенные токены, наборы данных, файлы, триггеры, расписания, предложения, ордера, спонсорства, а также регистрации узлов и сервисов.
Среди адресов, которые не могут вступить:
- адрес группы;
- адрес, который уже состоит в группе, поскольку каждый адрес может быть только в одной;
- адрес с политикой разделения;
- активный ключ узла, шлюза, ретранслятора или архивного узла;
- орган выпуска релизов.
Выход и передача управления
Участник выходит транзакцией UnlinkAccount и ничего с собой не забирает: адрес начинает заново как новый пустой аккаунт. Всё, что он принёс, остаётся в группе.
Контролёр не может выйти, не передав управление. TransferGroupControl передаёт управление другому участнику, который должен дать согласие подписью с меткой «ZBC-GROUP-CONTROL»; после этого прежний контролёр становится участником только на приём.
Права
Новый участник может только принимать: он может получать платежи для группы и может выйти, но не может тратить. Контролёр меняет это транзакцией SetMemberPermissions:
- бит 0: участник может тратить ZBC;
- бит 1: участник может перемещать токены группы (для этого нужен и бит 0);
- лимит в ZBC за период, где период — от 1 до 2 102 400 блоков (год); лимит 0 означает отсутствие лимита.
Лимит 5 ZBC за 5 760 блоков, например, — это суточное содержание в 5 ZBC.
Некоторые действия принадлежат только контролёру: LinkAccount, SetMemberPermissions, TransferGroupControl, SetSplitPolicy и SetTransactPolicy. Политика разделения группы применяется к деньгам, отправленным любому участнику (см. Политики разделения и транзакций).
Как соблюдаются лимиты
Лимит участника — правило консенсуса, а не настройка кошелька:
- при приёме транзакции узел вычисляет максимум ZBC, который транзакция может забрать у группы (сумма, комиссия, любой депозит survival, а также вознаграждение и аренда эскроу), и отклоняет её, если это больше остатка окна участника с учётом других его ожидающих транзакций;
- когда исполняется транзакция участника с лимитом, она исполняется внутри точки сохранения: цепочка измеряет, сколько баланс группы на самом деле потерял, и если это выходит за лимит, транзакция отменяется;
- блок, несущий отклонённую транзакцию участника, недействителен на каждом узле.
У каждого участника свой слот по правилу одной транзакции на аккаунт в блоке, потому что каждый подписывает своим адресом.
Токены и аренда
Токен, выпущенный участником, принадлежит группе, и любой участник, которому разрешено отправлять от имени группы, может позже его довыпускать (см. Довыпуск и сжигание токенов).
Группа платит аренду аккаунта, как любой аккаунт, плюс арендную плату за хранение своей записи: 96 байт и адрес контролёра плюс 40 байт и адрес каждого участника. Участники собственной аренды не платят. Группа, которая не может заплатить, распускается, а её оставшаяся пыль уходит в пул долголетия (см. ZBC никогда не сжигается).