Как работает алгоритм отбора аккаунтов, выигравших право сфоржить блок в криптовалюте PRiZM?
Автор: Любознательный призмачДля каждого форжащего аккаунта рассчитываются два числа. Первое - это так называемый хит аккаунта, которое получается из первых восьми байтов хеша, вычисленного из сигнатуры последнего сфорженного блока и публичного ключа аккаунта - генератора. Число получается не предсказуемое. И второе число - текущее целевое значение для аккаунта. Оно рассчитывается из числа базового целевого значения последнего сфорженного блока умноженного на эффективный баланс аккаунта и на количество секунд, прошедших от метки времени генерации последнего блока. Таким образом, чем больше эффективный баланс у форжащего аккаунта, тем большим получается текущее целевое значение для данного аккаунта. И если целевое значение оказывается больше, чем число хит аккаунта, то такой аккаунт получает право сфоржить блок. Базовое целевое значение пересчитывается у каждого нечётного блока (блока с нечётной высотой). Каким будет базовое целевое значение у будущего сфорженного блока с нечётной высотой, который примет сеть - тоже не предсказуемо. Единственный чётко определенный параметр, увеличивающий вероятность сфоржить конкретному аккаунту блок - это его эффективный баланс. То есть хочешь ловить блоки - увеличивай эффективный баланс.
Однако, увеличение эффективного баланса не дает 100% гарантию того, что твой аккаунт сфоржит следующий блок. Всегда может найтись аккаунт, даже с минимально возможным значением эффективного баланса в 1000 pzm, у которого значение числа хит аккаунта окажется настолько маленьким, что с ним невозможно будет соревноваться и он выиграет право сфоржить блок.
Попытки создать очередной блок в сети предпринимаются непрерывно и сразу после сфорженного очередного последнего блока. Если на текущий момент времени, на текущее значение секунд, прошедшие с момента генерации последнего блока, ни у одного из форжащих аккаунтов число хит аккаунта не оказывается ниже числа целевого значения для данного аккаунта, то время генерации блока затягивается. Т.е. увеличивается количество секунд, прошедших с генерации последнего блока. Постоянное увеличение количества секунд приводит к росту целевого значения у всех форжащих аккаунтов. Так как происходит умножение на это количество секунд. И таким образом у некоторых аккаунтов (одного или нескольких) целевое значение оказывается выше, чем значение хита, и они генерируют блок.
Если право сгенерировать блок выигрывают несколько аккаунтов, то в результате в сети появляются несколько версий блоков, а нужен всего один. Тогда для отбора блока применяется параметр - кумулятивная (накопленная) сложность цепочки блоков. То есть отбирается тот блок, на котором сложность получается больше.
Рассмотрим код на GitHub:
https://github.com/prizmspace/PrizmCore/tree/master/src/main/java/prizm/BlockImpl.java





https://github.com/prizmspace/PrizmCore/tree/master/src/main/java/prizm/Generator.java
