Легко! Хеш создается примерно со скоростью 100К в секунду на обычном компе на одном ядре.
Тем более нам нужен не конкретный, а просто наиболее близкий. Генерим миллиард, потом отбираем нужную цепочку адресов и первый адрес в цепочке встраиваем в генезис блок, все делов то день работы...
Вы немного наверное не поняли мою мысль, начальный или первых несколько блоков намертво прописаны в клиенте, их никак нельзя будет изменить, если не перекомпилировать клиент. Конечно можно переделать клиент и всовывать его на левых сайтах, но согласитесь это уже немного другое, так и биткоин клиенты можно переделывать.
Дык все же зависит от адреса актуального майнера? Мне показалось что нет. Выше писали про объединение сети и там так получалось, что все адреса известны заранее.
Просто если это не так и адрес майнера меняется, то возможна атака из глубины. Я задним число переделываю все транзакции, в том числе что якобы положил давно себе деньги... В итоге все новые ноды, случайно соединившиеся со мной загрузят мою версию блокчейна и аналогично будут "заражать" остальные новые ноды, а если новых нод (например при неожиданном росте) будет больше старых, то мы заполоним сеть...
Вот смотрите, ваш клиент получил блок, прошли проверки и он его принял. Теперь нам нужно узнать адрес следующего майнера. Для этого получаем хеш текущего номера блока, далее берем адрес майнера текущего блока и получаем хеш адреса этого майнера, после этого получаем общий хеш из этих двух хешей.
Исходные данные:
- текущий номер блока, величина меняющаяся, но прогнозируемая, т.к. мы знаем порядок в котором появляются номера блоков.
- адрес майнера, который создал текущий блок. Данная величина мало и плохо прогнозируемая, т.к. определяется суммарными предыдущими данными.
Таким образом искомый адрес майнера для нового блока, это комбинация слабо и сильно меняющихся данных.
Теперь про объединение сети. Условно у нас есть временное окно в течении которого можно изменять блокчейн. В рамках этого временного окна клиент ищет блоки от майнеров, которые были оштрафованы на отсутствие от них блока, если он находит такой блок, т.е. номер штрафного блока совпадает с номером блока от майнера и его адрес совпадает с адресом в штрафном блоке, то этот блок он заменяет вместо штрафного.
Что происходит дальше, как мы только что заменили штрафной блок на найденый блок от майнера, мы начинаем перестраивать блокчейн. Т.е. представте, что мы нагенерили 20 блоков от общего блока. А изменили пусть даже первый от общего блока, таким образом остальные 19 блоков могут стать неактуальными. Поэтому пока их отложем в сторону.
Теперь этот блок, что мы добавили будет считаться для этого клиента последним. Вычисляем адрес майнера для следующего блока и вначале проверяем свои блоки(это оставшиеся 19 блоков, которые отложили), если этого блока там нет, то начинаем опрос сети на предмет блока от этого майнера. Уже на этом этапе можно разбирать те оставшиеся 19 блоков и все транзакции добавлять в мемпул(вот здесь еще нужно подумать над вопросом давать какие-то им приоритеты и сохранять ли очередность).
В текущем моменте мы имеем объединенную сеть состоящую из 2-х подсетей в результате потери связи:
- первую, где был майнер на 1-ом блоке от общего и она имеет сейчас 20 блоков от общего.
- вторую, это та, где был обнаружен недостающий блок и где произошла перестройка блокчейна, она имеет только 1 блок от общего.
Т.е. эти две разделенных сети синхронизировали только свои первые блоки от общего.
Далее во второй сети начинается поиск адреса майнера для следующего блока, в то время как в первой сети этот майнер получил штраф, т.к. от него не было блока.
Майнер во второй сети создает блок и рассылает сети. Что происходит:
- в первой сети приходит второй блок от общего, он заменяет собой штрафной блок и начинается переделка блокчейна.
- во второй сети, где уже прошла переделка блокчейна, он просто включается в цепочку блокчейна.
Таким образом, после потери связи и разделения сети на 2 равных сети, они по отдельности нагенерили по 20 разных блока от общего блока (место от которого пошло разделение), но при востановлении связи и соединении, они синхронизировались на 2 блока от общего, а остальные блоки у той и другой сети были удалены, транзакции в этих блоках были перемешены в мемпул.
Пожалуй для механизма согласования временное окно сутки это много и скорее это будет 1-3 часа.
Как видите алгоритму безразлично ваше количество, он может спокойно работать в меньшинстве за счет того, что точно вычисляет кому сейчас генерировать блок, а если ваши данные подписаны не от этого адреса, то сколько бы вас не было, он их просто будет игнорировать определенное время.
А если блок так и не появиться от нужного адреса майнера, то создается штрафной блок и вычисляется новый адрес с которого должен прийти блок.
независимо прийти к тому же текущему состоянию, что и оставшаяся часть сети, основываясь
только на правилах протокола (таких, как определение генезис-блока) и сообщениях, переда-
ваемых по системе (например, множество всех действительных блоков).
Так у меня он и есть объективный. Начальные блоки намертво встроены в код, поэтому он сам вычисляет адрес майнера следующего блока и принимает только эти данные и так блок за блоком.
Алгоритмы PoS на основе цепи симулируют консенсус PoW, в котором протокол присваивает право создания целого нового блока псевдослучайно выбранному валидатору, а новый блок привязывается хэшем к родительскому блоку самой длинной предыдущей цепи.
Да у моего алгоритма идеология POS, он так и называется RndPOS, только в отличии от него не привязывается к большинству и величина денег не играет никакой роли.
Хотя, я тут подумал, даже если адрес предопределен я тоже самое могу сделать (сгенерить нужную цепочку адресов, переподписать ими блоки, а потом выкинуть все это в сеть). Все алгоритмы PoS этому подвержены, для защиты от таких атак применяются "чек-поинты". Но все это попахивает централизацией и не соответствует названию вашей темы
А вот этого не могу понять, какую цепочку Вы хотите заменить в блокчейне, прошлую или создать будущую?