У нас уже есть блокчейн с блоками, которые мы можем проверить, если он являются действительными. Но как мы узнаем, что вся сети действительна? — чтобы никто не вмешивался и не заменял всю сеть блоков на другую? Гениальное решение, которое применяет технология блокчейн. Это идентификация подписей, которые сопряжены с очень большими трудностями при получении (вычислении). Поэтому для создания новой сети, заменяющей существующую, вам потребуется использовать исключительную вычислительную мощность — практически невозможно достичь. Это то, что делают криптовалютные майнеры — идентифицируют подписи, которые удовлетворяют определенным условиям, и блоки добавляются в сеть. Чем дольше идет майнинг, тем сложнее будет создать сеть, аналогичную существующей.
Но как мы можем сделать подпись более сложной? — понятен только алгоритм — он повторно используется для проверки! Решение простое — при создании подписи мы добавляем параметр, который изменяется до тех пор, пока не будет получена подпись, соответствующая определенному правилу. Пример: — условие: подпись начинается с 5 нулей (0000 .) — В дополнение к уже установленным датам блок также будет содержать информацию: целое число, которое будет включено в расчет подписи блока. Шаги для поиска правильного числа: найдите подпись блока, если число = 1, и посмотрите, равны ли первые 5 символов нулю. Если не дать число значение 2, мы переделаем подпись и проверяем, есть ли 5 нулей в начале; и так далее, пока мы не найдем нужную число (в этом случае нам, вероятно, придется попробовать несколько миллионов вариантов) Первый шаг — добавить блок (класс Block) в новое поле — число:
private int номер; //добавлен новый номер
public int getномер() {
return номер;
}
public void setномер(int номер) {
this.номер = номер;
}
Давайте также не забудем изменить функцию вычисления подписи, чтобы включить наш номер.
public static String calculateHash(Block block) {
String calculatedhash = applySha256(
block.getPreviousHash()
+ Long.toString(block.getTimestamp())
+ block.getData()
+ Integer.toString(block.getномер, который теперь является частью подписи );())//номер, который теперь является частью подписи
);
return calculatedhash;
}
Следующим шагом является добавление функции майнинга в класс Utile (где сложность будет заключаться в наличии нулей перед подписью):
https://bitcoinrush.md/mining/