Как работает алгоритм отбора аккаунтов, выигравших право сфоржить блок в криптовалюте PRiZM?

Как работает алгоритм отбора аккаунтов, выигравших право сфоржить блок в криптовалюте PRiZM?

Автор: Любознательный призмач

Для каждого форжащего аккаунта рассчитываются два числа. Первое - это так называемый хит аккаунта, которое получается из первых восьми байтов хеша, вычисленного из сигнатуры последнего сфорженного блока и публичного ключа аккаунта - генератора. Число получается не предсказуемое. И второе число - текущее целевое значение для аккаунта. Оно рассчитывается из числа базового целевого значения последнего сфорженного блока умноженного на эффективный баланс аккаунта и на количество секунд, прошедших от метки времени генерации последнего блока. Таким образом, чем больше эффективный баланс у форжащего аккаунта, тем большим получается текущее целевое значение для данного аккаунта. И если целевое значение оказывается больше, чем число хит аккаунта, то такой аккаунт получает право сфоржить блок. Базовое целевое значение пересчитывается у каждого нечётного блока (блока с нечётной высотой). Каким будет базовое целевое значение у будущего сфорженного блока с нечётной высотой, который примет сеть - тоже не предсказуемо. Единственный чётко определенный параметр, увеличивающий вероятность сфоржить конкретному аккаунту блок - это его эффективный баланс. То есть хочешь ловить блоки - увеличивай эффективный баланс.

Однако, увеличение эффективного баланса не дает 100% гарантию того, что твой аккаунт сфоржит следующий блок. Всегда может найтись аккаунт, даже с минимально возможным значением эффективного баланса в 1000 pzm, у которого значение числа хит аккаунта окажется настолько маленьким, что с ним невозможно будет соревноваться и он выиграет право сфоржить блок.


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


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

Рассмотрим код на GitHub:

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

blockSignature = Crypto.sign(bytes(), secretPhrase);
byte[] bytes() {
generationSignatureHash = digest.digest(getGeneratorPublicKey());
BigInteger hit
} else if (previousBlock.getHeight() % 2 == 0) {

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

static boolean verifyHit


Report Page