Протокол активации

1. Особенности и функции

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

1.1 Особенности идентификации

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

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

1.2 Состояния функции в блокчейне

Состояние функций хранится в блокчейне. Функция может находиться в одном из трех состояний: исходное состояние называется Defined (определена). Каждая функция, даже несуществующая, имеет начальное состояние. Следующее состояние - Approved (одобрена). Это означает, что функция получила необходимое количество голосов от майнеров. По истечении определенного времени (количества блоков) подтвержденная функция становится Activated. С этого момента (блока), ноды, которые поддерживают эту функцию, начинают работать по-новому.

2. Голосование

Голосование осуществляется майнерами. Если майнер поддерживает функцию и хочет за нее проголосовать, он должен добавить её номер (ID) в лист поддерживаемых функций в конфиге. Сейчас каждый блок, генерируемый майнером, содержит ID-шники поддерживаемых функций. Каждые 10000 блоков (это число может меняться для других блокчейнов) нода суммирует число блоков, поддерживающих функцию. Если функция поддерживается более чем 80% блоков за последний период подсчета голосов, она становится Approved. В противном случае голосование продолжается и может продолжиться в следующий период голосования (10000 блоков для Mainnet) или более.

Если нода видит, что одобренная функция, в ней не реализуется, она (нода) логирует предупреждающее сообщение о предстоящей активации неподдерживаемой функции.

Перед тем, как подтвержденная функция активируется, необходимо, чтобы прошло еще 10000 блоков. Этот период предназначен для обновления не-майнящих нод до новой версии.

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

ПРЕДУПРЕЖДЕНИЕ


На Testnet подтверждение и активация функций занимают период в 3000 блоков каждый. Это позволяет быстрее активировать новые функции для целей тестирования.


3. Изменение конфига

В конфиг был добавлен новый раздел features. Он содержит два параметра:

  • auto-shutdown-on-unsupported-feature может быть yes или no. Если этот параметр включен, нода будет отключена при активации функции, которая не реализована кодовой базой ноды. По умолчанию параметр установлен в yes.

  • поддерживается список идентификаторов функций, которые поддерживает владелец ноды. По умолчанию список пуст.

Пример заполнения новой секции конфига:

 features {
   auto-shutdown-on-unsupported-feature = yes
   supported = []
 }

4. Изменения в REST API

Чтобы поддержать протокол активации, был добавлен новый API метод в node/activation. В ответ возвращается JSON, который описывает текущее состояние функций.

 {
   "height": 678929,
   "approvalInterval": 10000,
   "approvalThreshold": 8000,
   "nextCheck": 680000,
   "features": [
       {
           "id": 1,
           "blockhainStatus": "ACTIVATED",
           "nodeStatus": "SUPPORTED"
       },
       {
           "id": 2,
           "blockhainStatus": "APPROVED",
           "nodeStatus": "SUPPORTED"
       },
       {
           "id": 3,
           "blockchainStatus": "VOTING",
           "nodeStatus": "SUPPORTED",
           "supportBlocks": 7892,
       },
       {
           "id": 4,
           "blockchainStatus": "VOTING",
           "nodeStatus": "UNSUPPORTED",
           "supportBlocks": 7892
       }
   ]
 }

Поля возвращаемого объекта:

  • height - текущая высота блокчейна на ноде

  • approvalInterval - Длина периода подтверждения и активации в блоках

  • approvalThreshold - Число блоков, которые поддерживают функцию и подтверждают её

  • nextCheck - Высота на которой будет производиться следующий расчет подтверждений или статусов активации функций

  • features - Лист всех функций

  • id - ID функции

  • blockchainStatus - Текущий статус функции на блокчейне, может быть DEFINED, VOTING, APPROVED или ACTIVATED

  • nodeStatus - Статус функции на ноде, мождет быть SUPPORTED или UNSUPPORTED

  • supportBlocks - Число блоков, которые поддерживают функцию

5. Пример

Допустим, в версии 1.0.0 была введена новая интересующая нас функция, её ID равен 123.

Майнинг пул 'SuperMiners' с общей долей владения 40% поддерживает функцию. Администратор 'SuperMiners' обновляет ноду с версии 0.9.9 до 1.0.0 и добавляет 123 в лст поддерживаемых функций в конфиге. Нода 'SuperMiners' начинает класть ID равный 123 в каждый смайненый блок, начиная с высоты 1228765. Другие майнеры поддерживают функцию, но только некоторые из них обновили ноды до версии 1.0.0.

На блоке номер 1230000 ноды посчитали, что только 50% блоков поддерживают функцию 123. Таким образом, статус функции остается неизменным, голосование за этот период не увенчалось успехом, и, следовательно, продолжается.

В течение следующих 10000 блоков 'SuperMiners' убедили некоторых майнеров поменьше поддержать эту функцию. На блоке 1240000 оказывается, что функция поддерживается в 9102 из последних 10000 блоков, то есть в 91%. Таким образом, статус функции изменился на одобренный. В данный момент ноды, работающие на версии 0.9.9 и на более ранних, предупреждают своих владельцев об утверждении неподдерживаемой функции.

На момент генерации 1250000 блока функция 123 будет активирована и её начнут использовать ноды версии 1.0.0 и выше. Ноды более ранних версий перестанут работать.

results matching ""

    No results matching ""