waves_logo Docs
  • Почему Waves
    Почему Waves
  • Основные понятия
    Основные понятия
  • Аккаунт
    • Создание аккаунта
      Создание аккаунта
    • Адрес
      Адрес
    • Баланс аккаунта
      Баланс аккаунта
    • Хранилище данных аккаунта
      Хранилище данных аккаунта
    • Псевдоним
      Псевдоним
    • dApp и смарт-аккаунт
      dApp и смарт-аккаунт
    Аккаунт
  • Токен (ассет)
    • NFT: невзаимозаменяемый токен
      NFT: невзаимозаменяемый токен
    • Смарт-ассет
      Смарт-ассет
    • ID токена
      ID токена
    • WAVES
      WAVES
    Токен (ассет)
  • Транзакция
    • Комиссия за транзакцию
      • Спонсирование комиссии
        Спонсирование комиссии
      Комиссия за транзакцию
    • Подпись и подтверждения
      Подпись и подтверждения
    • Типы транзакций
      • Вызов скрипта
        Вызов скрипта
      • Выпуск
        Выпуск
      • Генезис
        Генезис
      • Данные
        Данные
      • Довыпуск
        Довыпуск
      • Закрытие лизинга
        Закрытие лизинга
      • Лизинг
        Лизинг
      • Массовый перевод
        Массовый перевод
      • Обмен
        • Ордер
          Ордер
        Обмен
      • Обновление информации ассета
        Обновление информации ассета
      • Перевод
        Перевод
      • Сжигание токена
        Сжигание токена
      • Cоздание псевдонима
        Cоздание псевдонима
      • Спонсирование
        Спонсирование
      • Установка скрипта
        Установка скрипта
      • Установка скрипта ассета
        Установка скрипта ассета
      • Ethereum-like транзакция
        Ethereum-like транзакция
      Типы транзакций
    • Валидация транзакции
      Валидация транзакции
    Транзакция
  • Блок
    • Корневой хеш транзакций
      Корневой хеш транзакций
    • Блок генезиса
      Блок генезиса
    Блок
  • Нода
    • Лизинг
      Лизинг
    • Доход генератора блока
      Доход генератора блока
    • Монетарная политика
      Монетарная политика
    Нода
  • Mainnet, Testnet, Stagenet
    Mainnet, Testnet, Stagenet
  • Unit Zero
    Unit Zero
  • Оракул
    Оракул
  • Протоколы и форматы данных
    • [en] Cryptographic practical details
      [en] Cryptographic practical details
    • Leased Proof of Stake
      Leased Proof of Stake
    • [en] Waves-NG solution
      [en] Waves-NG solution
    • Протокол Waves-NG
      Протокол Waves-NG
    • Waves 1.5
      Waves 1.5
    • Типы данных блокчейна
      Типы данных блокчейна
    • Бинарные форматы
      • Бинарный формат адреса
        Бинарный формат адреса
      • Бинарный формат псевдонима
        Бинарный формат псевдонима
      • Бинарный формат блока
        Бинарный формат блока
      • [en] Network message binary format
        • [en] Block message binary format
          [en] Block message binary format
        • [en] Checkpoint message binary format
          [en] Checkpoint message binary format
        • [en] Get block message binary format
          [en] Get block message binary format
        • [en] Get peers message binary format
          [en] Get peers message binary format
        • [en] Get signatures message binary format
          [en] Get signatures message binary format
        • [en] Handshake message binary format
          [en] Handshake message binary format
        • [en] Peers message binary format
          [en] Peers message binary format
        • [en] Score message binary format
          [en] Score message binary format
        • [en] Signatures message binary format
          [en] Signatures message binary format
        • [en] Transaction message binary format
          [en] Transaction message binary format
        [en] Network message binary format
      • Бинарный формат ордера
        Бинарный формат ордера
      • Бинарный формат транзакции
        • Вызов скрипта
          Вызов скрипта
        • Выпуск
          Выпуск
        • Генезис
          Генезис
        • Данные
          Данные
        • Довыпуск
          Довыпуск
        • Лизинг
          Лизинг
        • Массовый перевод
          Массовый перевод
        • Обмен
          Обмен
        • Обновление информации ассета
          Обновление информации ассета
        • Отмена лизинга
          Отмена лизинга
        • Сжигание токена
          Сжигание токена
        • Cоздание псевдонима
          Cоздание псевдонима
        • Спонсирование
          Спонсирование
        • Перевод
          Перевод
        • Установка скрипта
          Установка скрипта
        • Установка скрипта ассета
          Установка скрипта ассета
        • Ethereum-like
          Ethereum-like
        Бинарный формат транзакции
      • Бинарный формат подтверждений
        Бинарный формат подтверждений
      Бинарные форматы
    • [en] Validation rules
      [en] Validation rules
    Протоколы и форматы данных
  • Термины
    Термины
      • English
      • Русский
      On this page
        • Обзор
        • Ключевые концепции
        • Транзакция CommitToGeneration
        • Механизм подтверждений
        • Изменения в структуре блоков и микроблоков
        • Наказания
        • Пустой набор генераторов
        • Изменения в синхронизации цепочки
        • Изменения в RIDE
        • Активация
      waves_logo Docs

          # Waves: финализация блоков

          # Обзор

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

          Новый механизм финализации работает следующим образом: валидаторы явно фиксируют своё участие в генерации блоков, а затем подтверждают ключевые блоки, подписывая родительский блок. Как только накопленный баланс подтверждающих блок достигает 2/3 от общего активного генерирующего баланса, блок считается финализированным и не может быть откатан.

          Механизм является дополнительным и обратно совместимым: если набор генераторов пуст, нода продолжает работу с вероятностной финализацией без нарушения производства блоков.


          # Ключевые концепции

          # Набор генераторов

          Набор генераторов — явно известный список валидаторов, участвующих в генерации блоков для заданного периода генерации (фиксированного числа блоков). Для членства требуется заблаговременная отправка транзакции CommitToGeneration; вступить в текущий период задним числом невозможно.

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

          Генератор исключается из набора если:

          • Его генерирующий баланс опускается ниже минимального порога (1000 WAVES) — исключение вступает в силу в блоке, следующем за тем, в котором произошло снижение баланса.
          • Он отправляет конфликтующее подтверждение — исключение немедленное, в том же блоке, где обнаружен конфликт.

          Параметры сети:

          Параметр Mainnet Testnet Stagenet
          Длительность периода (блоков) 10 000 3 000 1 000
          Максимальное число подтверждений на блок 128 64 32
          Максимальная глубина отката 100 100 100

          # Расчёт финализации

          Блок становится финализированным когда:

          3 × endorsedBalance ≥ 2 × totalGeneratingBalance
          

          Подтверждённый баланс — это сумма баланса генератора блока и всех действительных балансов подтверждающих, собранных в микроблоках данного блока. Только подтверждения, собранные на высоте N+1, учитываются при финализации блока N — голоса с более поздних высот не переносятся назад. Это сделано намеренно: перенос голосов потомков назад не позволил бы объединять ветви после разделения и воссоединения сети.

          Собственный баланс майнера всегда неявно учитывается в подтверждённом балансе. Если баланс майнера в одиночку удовлетворяет порогу 2/3, родительский блок финализируется без явных подтверждений, даже если блок пуст.

          Финализация блока N рассчитывается при получении ключевого блока N+2, который содержит микроблоки с голосами, собранными на высоте N+1. Финализированный блок не может быть исключён из цепочки путём реорганизации.

          Если набор генераторов пуст, финализация может продвигаться только через ограничение минимальной глубины отката — финализированная высота принимается равной текущая_высота − maxRollback, как и до активации функции.


          # Транзакция CommitToGeneration

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

          Поля:

          Поле Описание
          generation_period_start Высота блока, с которой начинается следующий период
          endorser_public_key BLS-ключ, используемый для подписи подтверждений
          commitment_signature BLS-доказательство владения: подпись от endorser_public_key \|\| generation_period_start

          Правила валидации:

          • Можно указать только начало следующего периода; ретроактивные обязательства или обязательства на далёкое будущее отклоняются.
          • Принимается только одно обязательство на аккаунт на период.
          • Генерирующий баланс отправителя (после вычета депозита и комиссии) должен быть ≥ 1000 WAVES.
          • endorser_public_key должен быть валидным BLS-ключом.
          • commitment_signature должна быть валидной BLS-подписью доказательства владения (защита от атаки Rogue Key).

          Комиссии и депозит:

          • Комиссия: минимум 0.1 WAVES
          • Депозит: 100 WAVES (блокируется на время периода)

          Депозит возвращается в первом блоке периода, следующего за периодом обязательства, при условии честного поведения генератора. При злоумышленном поведении (конфликтующее подтверждение) депозит полностью сжигается.


          # Механизм подтверждений

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

          # Поля сообщения подтверждения

          Поле Описание
          endorser_index Индекс подтверждающего в наборе генераторов
          endorsed_block_id ID подтверждаемого блока (родительского для текущего ключевого блока)
          finalized_block_id ID локально финализированного блока на момент подтверждения
          finalized_block_height Высота локально финализированного блока
          signature BLS-подпись от finalized_block_id \|\| finalized_block_height \|\| endorsed_block_id

          Поля finalized_block_id и finalized_block_height используются для обнаружения конфликтующих подтверждений (см. раздел «Наказания»).

          # Упаковка в микроблоки

          Генератор ключевого блока собирает подтверждения и упаковывает минимальный снимок в микроблоки:

          • Снимок валидных индексов подтверждающих и агрегированную BLS-подпись — но только после достижения кворума в 2/3. До этого порога индексы подтверждающих не включаются (финализировать нечего, и их отсутствие экономит место).
          • Все новые конфликтующие подтверждения, обнаруженные с момента последнего микроблока.

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

          # Криптография BLS

          Подписи подтверждений используют BLS12-381 (через библиотеку blst). Агрегированные BLS-подписи позволяют верифицировать весь набор подтверждений за одну операцию, минимизируя накладные расходы на блок.

          • Сжатые открытые ключи: 48 байт
          • Подписи: 96 байт
          • Размер агрегированной подписи: равен одиночной подписи (96 байт независимо от числа подтверждающих)

          Схема доказательства владения в CommitToGeneration защищает от атак Rogue Key. Библиотека blst автоматически проверяет принадлежность подписей к группе; открытые ключи необходимо проверять на принадлежность к подгруппе при получении.


          # Изменения в структуре блоков и микроблоков

          В заголовки блоков и микроблоков добавляется новое поле finalization_voting:

          finalization_voting:
            endorser_indexes                   – список валидных индексов подтверждающих
            finalized_block_height             – высота финализированного блока, на который ссылаются голоса
            aggregated_endorsement_signature   – агрегированная BLS-подпись
            conflict_endorsements              – список конфликтующих подтверждений
          

          Это поле охватывается подписью заголовка микроблока.

          Правила валидации подтверждений в блоке:

          • Блок не может подтверждать уже финализированный блок или любой более ранний блок.
          • Агрегированная BLS-подпись должна быть валидной относительно перечисленных открытых ключей подтверждающих.
          • Каждый подтверждающий должен присутствовать в наборе генераторов.
          • Генератор блока не может включать своё собственное подтверждение.
          • Подтверждающий может появиться не более одного раза (либо как валидный, либо как конфликтующий, но не оба варианта).
          • Число валидных подтверждающих не может превышать настроенный максимум.
          • В блоке-вызове (challenge block, см. Waves 1.5) заголовок финализации должен быть пустым.

          # Наказания

          Конфликтующие подтверждения наказуемы. Подтверждение считается конфликтующим, когда его finalized_block_height меньше или равна текущей финализированной высоте майнера, но finalized_block_id на этой высоте отличается от значения майнера. Это доказывает, что подтверждающий не мог перейти на цепочку майнера — они были безвозвратно на разных ветках.

          После включения конфликтующего подтверждения в блок или микроблок применяются следующие санкции:

          1. Исключение из набора генераторов на оставшийся текущий период (немедленно, на той же высоте).
          2. Полное сжигание депозита: 100 WAVES сжигаются в начале следующего блока.

          Исключённый генератор не может майнить блоки или участвовать в подтверждениях до окончания периода.

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


          # Пустой набор генераторов

          Набор генераторов может быть пуст по нескольким причинам: ни один генератор не зафиксировал участие в текущем периоде, у всех зафиксировавших генераторов баланс опустился ниже 1000 WAVES, или все были исключены за конфликтующие подтверждения.

          В таком случае:

          Производство блоков не нарушается. Блок принимается, если майнер находится в наборе генераторов или если набор генераторов пуст. Майнинг продолжается без прерываний независимо от причины, по которой набор пуст.

          Детерминированная финализация приостанавливается. При отсутствии активных генераторов финализация на основе подтверждений невозможна. Финализированная высота откатывается к текущая_высота − maxRollback (100 блоков) — такое же поведение, как до активации функции. Детерминированная финализация возобновляется автоматически, как только генераторы зафиксируют участие в следующем периоде.

          Это означает, что функция деградирует корректно — сеть никогда не останавливается, а лишь временно теряет более строгие гарантии финализации.


          # Изменения в синхронизации цепочки

          После активации, когда нода запрашивает расширение у пира:

          • До активации: возвращаются подписи последних 100 блоков.
          • После активации: возвращаются только блоки выше последнего финализированного блока.

          Это означает, что нода больше не может автоматически откатываться за последний финализированный блок.


          # Изменения в RIDE

          • CommitToGeneration добавлен как распознаваемый тип транзакции, и все его поля доступны в скриптах RIDE.
          • BalanceDetails.available отражает заблокированный депозит.
          • Высота финализированного блока не предоставляется как функция RIDE, поскольку финализация — это локальное свойство ноды, а не свойство блокчейна на уровне консенсуса.
          • BLS-криптографические примитивы и поле deposit не добавляются в BalanceDetails.

          # Активация

          Функция активируется на определённой высоте блока (ActivationHeight). До этой высоты все полученные подтверждения игнорируются, а финализированная высота принимается равной height − maxRollback.

          Первый период генерации начинается через GenerationPeriod блоков после активации:

          Первый период:  [ActivationHeight + GenerationPeriod + 1 ;  ActivationHeight + 2 × GenerationPeriod]
          Второй период: [ActivationHeight + 2 × GenerationPeriod + 1 ; ActivationHeight + 3 × GenerationPeriod]
          

          Генераторы, желающие участвовать в первом периоде, должны отправить транзакцию CommitToGeneration до высоты начала периода.

          Почему Waves
          Почему Waves