Мультиподпись
Мультиподписной аккаунт — это аккаунт, которым не управляет ни один ключ в одиночку. Он определяется списком участников и порогом и тратит средства, только когда одну и ту же транзакцию подписали не меньше этого числа участников: два из трёх, три из пяти и так далее. Участники могут пользоваться ключами разных типов, так что ключ ZooBC, ключ Ethereum и ключ Bitcoin могут делить один аккаунт.
Аккаунт
Мультиподписной аккаунт определяется своим порогом (от 1 до числа участников), nonce и адресами участников. Его адрес — хеш от них:
address = SHA3-256( threshold ‖ nonce ‖ count ‖ sorted participant addresses )
Результат используется как обычный аккаунт типа 0, поэтому он может получать ZBC, как любой адрес. Закрытого ключа к нему нет ни у кого, поэтому единственный способ потратить с него средства — собрать подписи участников.
Расходование, шаг за шагом
- Кто-то предлагает внутреннюю транзакцию, например платёж, внутри транзакции MultiSignature. Внутренняя транзакция не подписана, и её отправитель — мультиподписной аккаунт.
- Участники добавляют свои подписи — все сразу или в последующих транзакциях MultiSignature, в любом порядке. Тело MultiSignature может нести любое сочетание определения аккаунта, внутренней транзакции и подписей, так что несколько таких обёрток могут постепенно собрать одну внутреннюю транзакцию.
- Каждый участник подписывает дайджест внутренней транзакции, привязанный к цепочке,
SHA3-256("ZBC-TX" ‖ genesis hash ‖ inner bytes), по схеме своего типа ключа (см. Подписание транзакции). Подписи хранятся под хешем внутренней транзакции. Подпись не-участника или подпись, не прошедшая проверку, просто не засчитывается. - Когда действительные подписи достигают порога, внутренняя транзакция исполняется один раз. Мультиподписной аккаунт платит её комиссию, не меньше минимальной комиссии внутренней транзакции, а внутренняя транзакция навсегда помечается как исполненная, поэтому её никогда нельзя воспроизвести повторно.
Отправитель каждой обёртки MultiSignature платит собственную комиссию этой обёртки.
Никакая совместная подпись не собирается вне цепочки, и никакой порядок подписания не навязывается: каждый ключ подписывает сам по себе, по своей схеме.
Что он может делать
Внутренняя транзакция может быть одного из следующих типов:
- Empty или SendZBC;
- один из четырёх типов регистрации узла (регистрация, обновление, удаление и заявка на регистрацию узла);
- SetSplitPolicy;
- один из четырёх типов группы аккаунтов (LinkAccount, UnlinkAccount, SetMemberPermissions и TransferGroupControl).
Таким образом, мультиподписной аккаунт может платить ZBC, владеть регистрацией узла, делиться своим доходом с помощью политики разделения и участвовать в группе аккаунтов, но напрямую отправлять токены не может. Он может дать согласие на вступление в группу своим порогом, точно так же как одиночный ключ даёт согласие своей подписью.
По правилу одной транзакции на аккаунт в блоке внутренняя транзакция засчитывается мультиподписному аккаунту, когда исполняется.
Кто имеет право голоса
Засчитываются только подписи участников. Зарегистрированные узлы не подписывают за аккаунт; они лишь проверяют подписи участников, как проверяют любые другие. ZooBC Foundation тоже не имеет над ним власти, какой бы ни была сумма.