Вики ZooBC
Proof of Participation

Двойное подписание (эквивокация)

Эквивокация, или двойное подписание, означает, что один производитель подписывает два разных блока на одном и том же родительском блоке. Тогда разные узлы могут первыми увидеть разные блоки, и сеть может на время разделиться. ZooBC справляется с этим тремя способами: честный узел никогда так не поступает, даже после сбоя; любой зарегистрированный узел, увидевший два таких блока, может доказать это в цепочке транзакцией EquivocationReport; а производителю засчитывается пропущенный ход со всеми вытекающими потерями дохода и оценки.

Что считается эквивокацией

Когда узел выбран для создания блока, он строит один блок поверх текущей вершины — своего родителя. Эквивокация — это подписание двух блоков с разными заголовками над одним и тем же родителем. Поздний блок эквивокацией не является: он лишь добавляет своей ветви меньше веса (см. Выбор ветви и накопленная сложность). Создание блоков на разных высотах — тоже не эквивокация: у каждой высоты свой родитель.

Честный производитель никогда не подписывает дважды

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

Есть одно сознательное исключение. После предела восстановления, через 3 600 секунд после родителя, остановившаяся цепочка должна иметь возможность запуститься снова. Тогда производитель может подписать один новый блок для этого родителя, за который его не наказывают, и в дальнейшем повторно отправляет именно этот блок. Точно так же пара блоков, метки времени которых лежат по разные стороны предела восстановления (ровно одна из них больше чем через 3 600 секунд после родителя), — это возобновление остановившейся цепочки, а не эквивокация.

Обнаружение

Узел, получивший от одного зарегистрированного производителя два заголовка с действительными подписями над одним родителем, считает их доказательством:

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

EquivocationReport

Отчёт (тип транзакции 60) несёт само доказательство: два подписанных заголовка, за каждым из которых следует 64-байтовая подпись производителя. При заголовках в 284 байта тело занимает 704 байта: 4-байтовая длина, заголовок 1, подпись 1, 4-байтовая длина, заголовок 2, подпись 2.

Тело отчёта в 704 байта в виде шести блоков; ниже два заголовка рядом, с одинаковым ключом производителя по смещению 76 и одинаковым хешем родителя по смещению 172.
Тело отчёта в 704 байта в виде шести блоков; ниже два заголовка рядом, с одинаковым ключом производителя по смещению 76 и одинаковым хешем родителя по смещению 172.

Цепочка выполняет тринадцать проверок в таком порядке:

  1. тип отчёта активен;
  2. комиссия равна ровно 0, потому что отчёт — обязанность зарегистрированных узлов;
  3. тело разбирается, и каждый заголовок имеет размер подписанного заголовка: 204 байта или 284 с доказательством сида;
  4. два заголовка различаются;
  5. ключ производителя по смещению 76 байт одинаков в обоих;
  6. хеш родителя по смещению 172 одинаков в обоих;
  7. обе подписи проверяются этим ключом производителя;
  8. родитель — блок этой цепочки;
  9. пара не лежит по разные стороны часового предела восстановления;
  10. отчёт поступает не позже чем через 720 блоков после высоты эквивокации;
  11. производитель — зарегистрированный узел;
  12. автор отчёта — зарегистрированный узел;
  13. этому производителю ещё не засчитано наказание за эту высоту.

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

Цена

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

Никакие балансы не меняются. Автору отчёта ничего не платят, и из стейка производителя ничего не изымается: ZBC никогда не сжигаются (см. ZBC никогда не сжигается).

Заголовки A и B помещаются в EquivocationReport (тип 60), который попадает в блок: один пропущенный ход, отсутствие до следующего собственного блока, никакого дохода, оценка падает. Рядом — связь с производителем разорвана, и ни один ZBC не сжигается.
Заголовки A и B помещаются в EquivocationReport (тип 60), который попадает в блок: один пропущенный ход, отсутствие до следующего собственного блока, никакого дохода, оценка падает. Рядом — связь с производителем разорвана, и ни один ZBC не сжигается.

См. также