Вики ZooBC
Транзакции

Мультиподпись

Мультиподписной аккаунт — это аккаунт, которым не управляет ни один ключ в одиночку. Он определяется списком участников и порогом и тратит средства, только когда одну и ту же транзакцию подписали не меньше этого числа участников: два из трёх, три из пяти и так далее. Участники могут пользоваться ключами разных типов, так что ключ ZooBC, ключ Ethereum и ключ Bitcoin могут делить один аккаунт.

Аккаунт

Мультиподписной аккаунт определяется своим порогом (от 1 до числа участников), nonce и адресами участников. Его адрес — хеш от них:

address = SHA3-256( threshold ‖ nonce ‖ count ‖ sorted participant addresses )

Результат используется как обычный аккаунт типа 0, поэтому он может получать ZBC, как любой адрес. Закрытого ключа к нему нет ни у кого, поэтому единственный способ потратить с него средства — собрать подписи участников.

Расходование, шаг за шагом

Шкала времени: предложение, содержащее внутренний платёж, подпись 1, подпись 2, счётчик доходит до порога, и платёж один раз уходит с аккаунта
Шкала времени: предложение, содержащее внутренний платёж, подпись 1, подпись 2, счётчик доходит до порога, и платёж один раз уходит с аккаунта
  1. Кто-то предлагает внутреннюю транзакцию, например платёж, внутри транзакции MultiSignature. Внутренняя транзакция не подписана, и её отправитель — мультиподписной аккаунт.
  2. Участники добавляют свои подписи — все сразу или в последующих транзакциях MultiSignature, в любом порядке. Тело MultiSignature может нести любое сочетание определения аккаунта, внутренней транзакции и подписей, так что несколько таких обёрток могут постепенно собрать одну внутреннюю транзакцию.
  3. Каждый участник подписывает дайджест внутренней транзакции, привязанный к цепочке, SHA3-256("ZBC-TX" ‖ genesis hash ‖ inner bytes), по схеме своего типа ключа (см. Подписание транзакции). Подписи хранятся под хешем внутренней транзакции. Подпись не-участника или подпись, не прошедшая проверку, просто не засчитывается.
  4. Когда действительные подписи достигают порога, внутренняя транзакция исполняется один раз. Мультиподписной аккаунт платит её комиссию, не меньше минимальной комиссии внутренней транзакции, а внутренняя транзакция навсегда помечается как исполненная, поэтому её никогда нельзя воспроизвести повторно.

Отправитель каждой обёртки MultiSignature платит собственную комиссию этой обёртки.

Никакая совместная подпись не собирается вне цепочки, и никакой порядок подписания не навязывается: каждый ключ подписывает сам по себе, по своей схеме.

Ожидающий внутренний платёж хранится по своему хешу; ключи ZooBC, Ethereum и Bitcoin подписывают в отдельных обёртках; две действительные подписи достигают порога, и платёж исполняется один раз
Ожидающий внутренний платёж хранится по своему хешу; ключи ZooBC, Ethereum и Bitcoin подписывают в отдельных обёртках; две действительные подписи достигают порога, и платёж исполняется один раз

Что он может делать

Внутренняя транзакция может быть одного из следующих типов:

  • Empty или SendZBC;
  • один из четырёх типов регистрации узла (регистрация, обновление, удаление и заявка на регистрацию узла);
  • SetSplitPolicy;
  • один из четырёх типов группы аккаунтов (LinkAccount, UnlinkAccount, SetMemberPermissions и TransferGroupControl).

Таким образом, мультиподписной аккаунт может платить ZBC, владеть регистрацией узла, делиться своим доходом с помощью политики разделения и участвовать в группе аккаунтов, но напрямую отправлять токены не может. Он может дать согласие на вступление в группу своим порогом, точно так же как одиночный ключ даёт согласие своей подписью.

По правилу одной транзакции на аккаунт в блоке внутренняя транзакция засчитывается мультиподписному аккаунту, когда исполняется.

Кто имеет право голоса

Засчитываются только подписи участников. Зарегистрированные узлы не подписывают за аккаунт; они лишь проверяют подписи участников, как проверяют любые другие. ZooBC Foundation тоже не имеет над ним власти, какой бы ни была сумма.

См. также