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

Одна транзакция на аккаунт в блоке и пакеты

Начиная с версии 0.5.8 к каждому блоку применяется простое правило действительности: он может нести не более одной транзакции от каждого аккаунта. Чтобы сделать много действий сразу, аккаунт использует пакет — одну транзакцию, несущую несколько действий одного вида. Вместе эти два правила сохраняют точность проверок, которые узлы выполняют до блока, и всё же позволяют загруженному аккаунту заплатить многим людям в одном блоке.

Правило

Аккаунт здесь — это подписывающий адрес. Блок, несущий две транзакции с одного адреса, недействителен на каждом узле, поэтому честный производитель никогда такой не построит. Производители берут сначала самую старую подходящую транзакцию каждого аккаунта, а следующую оставляют для более позднего блока, через 15 секунд.

Очередь транзакций от отправителя A входит в блоки N, N+1 и N+2 по одной на блок, начиная с самой старой, а транзакции от отправителей B и C заполняют те же блоки
Очередь транзакций от отправителя A входит в блоки N, N+1 и N+2 по одной на блок, начиная с самой старой, а транзакции от отправителей B и C заполняют те же блоки

Аккаунт всё равно может отправить несколько транзакций подряд. Пул узла держит до 50 ожидающих транзакций на отправителя (это локальная политика каждого узла), и производители включают их по одной на блок, начиная с самой старой.

Из определения следуют две детали:

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

Чем это помогает

Узел проверяет транзакцию по подтверждённому состоянию дважды: когда принимает её в свой пул и когда собирает блок. При одной транзакции на аккаунт никакая другая транзакция того же аккаунта не может изменить это состояние внутри блока. Поэтому проверка остаётся точной для всего, что контролирует только отправитель, например для его собственного баланса и его собственных объектов.

Между разными аккаунтами побеждает транзакция, применённая первой. Если два аккаунта пытаются принять одно и то же предложение обмена, его получает первый, а транзакция второго становится бессмысленной: это оплаченная пустая операция, которая платит свою комиссию и больше ничего не делает (см. Транзакции). Честные производители не включают такие транзакции. Отдельного правила для каждого объекта нет.

Пакеты

Пакет — это одна транзакция, несущая несколько действий одного вида. Существует три вида:

  • платежи ZBC, до 25 в одном пакете;
  • переводы токенов, до 32, любых токенов, с комиссией в ZBC;
  • доказательства хранения, до 1 000, — один пакет на узел за эпоху хранения (см. Пул децентрализованного хранения).

Пакет — это всё или ничего. Каждое действие проверяется заранее, поэтому либо проходят все платежи в нём, либо ни один, а весь пакет подписывается один раз.

Сколько стоит пакет

Несколько действий оплачиваются как несколько транзакций. Минимальная комиссия пакета — это сумма минимальных комиссий, которые его действия заплатили бы как отдельные транзакции: базовая комиссия за каждое действие плюс плата за байты каждого действия (см. Комиссии), причём сообщение пакета оплачивается только один раз. Три платежа без сообщения стоят одинаково — одним пакетом или тремя отдельными транзакциями. Пакет доказательств хранения ничего не платит: каждое доказательство хранения — обязанность без комиссии, поэтому сумма равна нулю.

Три отдельных платежа, каждый со своей комиссией, равны одному пакету из трёх платежей с теми же тремя комиссиями, помеченному «всё или ничего» и подписанному один раз
Три отдельных платежа, каждый со своей комиссией, равны одному пакету из трёх платежей с теми же тремя комиссиями, помеченному «всё или ничего» и подписанному один раз

Пакет экономит в основном работу сети, а не комиссии: одна подпись для проверки и один слот в блоке вместо трёх. И это способ для одного аккаунта заплатить многим получателям в одном и том же блоке.

См. также