Riker, Nxt core-разработчик и проджект-менеджер, решил
ответить на некоторые (базовые) вопросы относительно блокчейна Nxt.
- Nxt-проджект-менеджер
Riker продолжает освещать базовые принципы работы Nxt. На этот раз как бы в диалоге с воображаемым собеседником
Beamy он затронул механизм форжинга:
Beamy: что такое форжинг (forging)?
Riker: это процесс создания нового блока в блокчейне Nxt. В сою очередь, блок представляет собой совокупность 0 или более транзакций. Каждый блок подписывается приватным ключом форжера.
Beamy: а я могу сфоржить блок ?
Riker: конечно. Всё, что вам нужно - это иметь сколько-то NXT (монет) на балансе (чем больше, тем лучше, но не менее 1000 NXT для версий Nxt старше 1.7.4, т.е. после блока 621000).
Beamy: и что я получу за свой форжинг ?
Riker: в качестве награды за формирование нового блока (форжинг), ваш аккаунт получит все комиссии транзакций этого блока. Начиная с блока 621000 для некоторых типов транзакций комиссия распределяется между форжерами последних 4-х блоков в соотношении 40%, 30%, 20%, 10%.
Beamy: кто выбирает очередного форжера ?
Riker: каждая форжащая нода несложным алгоритмом рассчитывает время, в которое форжащий аккаунт имеет право сгенерировать очередной. Все остальные узлы при получении нового блока перепроверяют это расчет, и в случае нарушения алгоритма отвергают этот блок.
Beamy: и что это за несложный алгоритм?
Riker: подробно он
расписан в "Белой книге Nxt". Если коротко, то так: открытый ключ форжера накладывается на подпись предыдущего блока. Получается уникальная строка из комбинации аккаунта и последнего блока; из SHA256-хэша этой строки берут как число первые 8 байт, и делят на произведение
текущей сложности сети на
эффективный баланс аккаунта. Полученное значение показывает количество секунд, через которое данный аккаунт получит право сфоржить блок. После генерации каким-либо аккаунтом очередного блока
сложность сети пересчитывается для обеспечения в среднем 60-ти секунд на блок.
До блока 621000 такой пересчёт работал несколько консервативно, что приводило в среднем к 90 секундам на блок, и к довольно частым промежуткам в 10 и более минут между блоками. После блока 621000 код пересчёта сложности был изменён, и задержки в 10 минут должны случаться значительно реже.Beamy: не могу ли я подобрать SHA256-хэш таким образом, чтобы уменьшить себе время до генерации очередного блока??
Riker: нет, не можешь, этот хэш не зависит от случайного значения (nonce) как в Биткоине. Каждый
аккаунт может создать ровно один такой SHA256-хэш.
Beamy: почему бы мне не пытаться создавать
аккаунты, пока один из них не даст лучший хэш?
Riker: нет смысла в распылении своих NXT по нескольким аккаунтом, т.к. баланс на аккаунте может форжить только после 1440 блоков.
Beamy: может ли форжер жульничать ?
Riker: в целом, нет, поскольку жульничество - например, например, опережающий форжинг либо указание в заголовке блока времени из будущего - приведёт к отторжению такого блока другими нодами с диагностикой "блок из будущего ". Что форжер может делать - это решать, какие из транзакций включать, или не включать в свой очередной блок, например, чтобы отсрочить чьи-то транзакции путём включения множества бесполезных транзакций ("пыли"), или поместить транзакции в блок в определённом порядке, или включить в блок свои высококомиссионные транзакции с целью получения назад этой комиссии.
Beamy: и как вы боретесь с такими манипуляциями?
Riker: заполнение блока "пылью" возможно, но в настоящее время блоки ограничены 256-ю транзакциями, так что сейчас это не проблема. Далее, Nxt-код разработан так, что изменение порядка транзакций не даёт реального преимущества, а получение назад своей комиссии исключается тем, что высокая комиссия распределяется между тремя предыдущими форжерами, как упомянуто выше.
Beamy: что такое "прозрачный форжинг" ?
Riker: как было пояснено выше, каждая нода может вычислить, в какое время какой аккаунт получает право сгенерировать следующий блок. Поэтому ноды вместо широкой рассылки могут направлять будущие транзакции прямо на ту ноду, аккаунт которой будет форжить очередной блок. Потенциально это может существенно увеличить масштабируемость сети. В версии 1.7 мы сделали некоторые шаги в направлении реализации этого механизма, требуя, чтобы у форжера эффективный баланс был не менее 1000 NXT. Это намного облегчает вычисление следующего форжера.