Когда у алгоритма консенсуса есть сложность или его аналог, то он может попасть в ловушку этой сложности.
Особенно от этого страдали небольшие блокчейны с алгоритмом POW. Был небольшой хешрейт сети, потом приходил какой-нибудь китайчонок с майнинг фермой, начинал майнить, сложность после этого взлетала до небес, после этого он уходил.
У сети опять становился маленький хешрейт, но уже высокая сложность. Блоки либо очень долго майнились, либо не майнились вообще.
Именно для обхода данной проблемы у меня пересчет идёт на каждом блоке.
Хочу напомнить, что в этом алгоритме аналогом сложности служит минимальная сумма блока, при достижении которой ноды сети получив такой блок перестают дальше его создавать и начинают строить следующий.
Как сейчас у меня реализовано регулирование минимальной суммы блока:
Оно будет работать следующим образом. Вначале набирается статистика из 10 и более блоков и анализируется среднее время создания каждого блока.
Теперь на каждом новом созданном блоке, исходя из расчета среднего времени создания блока будет делаться следующие:
- Если среднее время создания блока меньше 3 минут, то минимальная сумма блока увеличивается на 10%.
- Если среднее время создания блока больше 3 минут, то минимальная сумма блока уменьшается на 10%.
В нашем случае, когда сети могут намеренно устроить ловушку сложности, то уменьшение минимальной сложности блока на 10% может не хватить и тогда сеть может зависнуть ожидая, пока не создастся блок с требуемой минимальной суммой блока.
Именно поэтому такое ступенчатое регулирование придется видоизменить на другое решение.
И вот, как оно будет выглядеть на примере.
Пусть у нас сейчас минимальная сумма блока равна 100. До этого все блоки создавались со стандартным временем примерно 3 минуты.
И вдруг сеть резко теряет возможность поддерживать данную минимальную сумму блоков.
Начинается ожидание и постоянный пересчет минимальной суммы блока на последнем создаваемом блоке.
Было примерно для 10 последних блоков следующие время создания:
1-й блок=3 мин
2-й блок=3 мин
3-й блок=3 мин
4-й блок=3 мин
5-й блок=3 мин
6-й блок=3 мин
7-й блок=3 мин
8-й блок=3 мин
9-й блок=3 мин
10-й блок(текущий)=3 мин.
Среднее время за последние 10 блоков равно:
(3+3+3+3+3+3+3+3+3+3)/10=3
А теперь представим, что произошла потеря сетью возможности создавать блоки с текущей минимальной суммой блока и сеть начинает простаивать.
Время текущего блока определяется по последнему подблоку, а тому майнер может перезаписывать свой последний подблок в текущем блоке, в результате возможен следующий пересчет, скажем для простаивания последнего блока для 10 минут:
(3+3+3+3+3+3+3+3+3+
10)/10=3.7
И так у нас было среднее время 3, а сейчас стало 3.7 изменение составило 23.33%.
Теперь нашу минимальную сумму можно уменьшить на этот процент, она была раньше 100, то сейчас она стала 77.
Допустим этого не достаточно и сеть может создавать блок с минимальной суммой, скажем 55.
Тогда время создания последнего блока будет не 10 минут, а больше.
Удовлетворяющим условием будет время создания блока равное 17 минут, давайте это проверим:
(3+3+3+3+3+3+3+3+3+
17)/10=4.4
И так у нас было среднее время 3, а сейчас стало 4.4 изменение составило 46.67%. И если на этот процент уменьшить минимальную сумму блока 100, то получим 53.33.
Вот уже эта минимальная сумма блока позволит нодам сети создавать новые блоки.