Двойное подписание (эквивокация)
Эквивокация, или двойное подписание, означает, что один производитель подписывает два разных блока на одном и том же родительском блоке. Тогда разные узлы могут первыми увидеть разные блоки, и сеть может на время разделиться. ZooBC справляется с этим тремя способами: честный узел никогда так не поступает, даже после сбоя; любой зарегистрированный узел, увидевший два таких блока, может доказать это в цепочке транзакцией EquivocationReport; а производителю засчитывается пропущенный ход со всеми вытекающими потерями дохода и оценки.
Что считается эквивокацией
Когда узел выбран для создания блока, он строит один блок поверх текущей вершины — своего родителя. Эквивокация — это подписание двух блоков с разными заголовками над одним и тем же родителем. Поздний блок эквивокацией не является: он лишь добавляет своей ветви меньше веса (см. Выбор ветви и накопленная сложность). Создание блоков на разных высотах — тоже не эквивокация: у каждой высоты свой родитель.
Честный производитель никогда не подписывает дважды
Производитель запоминает для каждого родителя подписанный им блок и хранит эту запись также на диске, поэтому перезапуск не заставит его забыть. Если его снова выберут для того же родителя, он повторно отправит уже подписанный блок, а не создаст новый.
Есть одно сознательное исключение. После предела восстановления, через 3 600 секунд после родителя, остановившаяся цепочка должна иметь возможность запуститься снова. Тогда производитель может подписать один новый блок для этого родителя, за который его не наказывают, и в дальнейшем повторно отправляет именно этот блок. Точно так же пара блоков, метки времени которых лежат по разные стороны предела восстановления (ровно одна из них больше чем через 3 600 секунд после родителя), — это возобновление остановившейся цепочки, а не эквивокация.
Обнаружение
Узел, получивший от одного зарегистрированного производителя два заголовка с действительными подписями над одним родителем, считает их доказательством:
- он отмечает производителя как доказанного лжеца, что заносит его в чёрный список пиров и разрывает с ним соединение, если только это не отрежет узел от сети;
- он отправляет один EquivocationReport на каждую пару родителя и производителя;
- он, как обычно, передаёт оба блока на проверку; выбор ветви определяет уцелевший блок, а при точном равенстве на каждом узле побеждает ветвь с меньшим хешем вершины.
EquivocationReport
Отчёт (тип транзакции 60) несёт само доказательство: два подписанных заголовка, за каждым из которых следует 64-байтовая подпись производителя. При заголовках в 284 байта тело занимает 704 байта: 4-байтовая длина, заголовок 1, подпись 1, 4-байтовая длина, заголовок 2, подпись 2.
Цепочка выполняет тринадцать проверок в таком порядке:
- тип отчёта активен;
- комиссия равна ровно 0, потому что отчёт — обязанность зарегистрированных узлов;
- тело разбирается, и каждый заголовок имеет размер подписанного заголовка: 204 байта или 284 с доказательством сида;
- два заголовка различаются;
- ключ производителя по смещению 76 байт одинаков в обоих;
- хеш родителя по смещению 172 одинаков в обоих;
- обе подписи проверяются этим ключом производителя;
- родитель — блок этой цепочки;
- пара не лежит по разные стороны часового предела восстановления;
- отчёт поступает не позже чем через 720 блоков после высоты эквивокации;
- производитель — зарегистрированный узел;
- автор отчёта — зарегистрированный узел;
- этому производителю ещё не засчитано наказание за эту высоту.
Заявление о том, что кто-то видел второй блок, ничего не доказывает; доказывают две подписи. Голосование мест не нужно, потому что подписи может проверить кто угодно.
Цена
Действительный отчёт засчитывает производителю один пропущенный ход — один раз на производителя и высоту. По правилам, принятым для версии 0.5.8, доказанное двойное подписание к тому же делает узел отсутствующим до его следующего собственного блока: ни доли coinbase, ни доли комиссий или пула долголетия, а оценка участия падает. Четыре пропущенных хода подряд приводят к приостановке узла. См. Пропущенные ходы, приостановка и исключение.
Никакие балансы не меняются. Автору отчёта ничего не платят, и из стейка производителя ничего не изымается: ZBC никогда не сжигаются (см. ZBC никогда не сжигается).