Мы не имеем ничего общего с блокчейн, если не можем проверить его действительность (нет ли изменений в сеть блоков).
Мы выполним 2 проверки:
- Подпись блока совпадает с подписью, полученной в результате расчета
- Предыдущая подпись блока совпадает с информацией о подписи текущего блока
Мы пройдемся по всей сети проверим все блоки, используя функцию ниже, которую мы также введем в класс Utile:
public static Boolean isChainValid(List blockchain) { Block currentBlock; Block previousBlock; //просматриваем сеть, чтобы проверить hash (подписи): for (int i = 1; i < blockchain.size(); i++) { currentBlock = blockchain.get(i); previousBlock = blockchain.get(i - 1); //Сравниваю подпись блока с расчетной if (!currentBlock.getHash().equals(calculateHash(currentBlock))) { System.out.println("Подписи не равны"); return false; } //сравниваю предыдущую подпись блока с предыдущей информацией подписи в текущем блоке if (!previousBlock.getHash().equals(currentBlock.getPreviousHash())) { System.out.println("Предыдущая подпись отличается"); return false; } } return true; }
Мы применим эту функцию к нашей сеть. Придется изменить сеть, чтобы 3 блока были включены в список.
Мы начнем с добавления новой функции в класс Utile для вывода списка блоков:
public static void printBlock(List blocks) { for (Block block : blocks) { printBlock(block); } }
В main-сеть мы создаем список блочных объектов. Новая версия будет выглядеть так:
public static void main(String[] args) { List blocks = new ArrayList(); Block block1 = new Block("первое сообщение", "0"); blocks.add(block1); Block block2 = new Block("второе сообщение", block1.getHash()); blocks.add(block2); Block block3 = new Block("третье сообщение", block2.getHash()); blocks.add(block3); Utile.printBlock(blocks); }
В конце мы добавляем проверку сети:
System.out.println("Сеть является " + (Utile.isChainValid(blocks) ? "действительной" : "недействительной"));
Как и ожидалось, мы получаем подтверждение того, что сеть действительна
подпись = 145f77c895efd7cb1788caa27e6f306fd96284be68f3b453f419ce252168fef8
предыдущая подпись = 74130941b4c2225453ac49a0e6e714214ca2087b9a05a563439682ce627b6be2
********** END BLOCK***********
Сеть действительна
Мы проведем тест — после создания сети мы изменим данные во 2 блоке и посмотрим, все ли они действительны
public static void main(String[] args) { List blocks = new ArrayList(); Block block1 = new Block("первое сообщение", "0"); blocks.add(block1); Block block2 = new Block("второе сообщение", block1.getHash()); blocks.add(block2); Block block3 = new Block("третье сообщение", block2.getHash()); blocks.add(block3); Utile.printBlock(blocks); block2.setData("второе измененное сообщение");//входим в цепочку System.out.println(«Сеть есть»+ (Utile.isChainValid(blocks) ? «действительный»: «недействительный»)); }
Мы получаем сообщение о том, что сеть больше не действительна:
подпись = e58a813f3a5f0abc34fe601ff9629cbed3dca4b2c6c38bf6e3643128528c32b6
предыдущая подпись = ffe598b39662deec6b3d7306026d578edd65a0736271f985d2bb06a95d988d22
**********END BLOCK***********
Подписи не равны.
Сеть является недействительной.
Далее мы пойдем к … майнингу — мы увидим, зачем это нужно, что это значит и как это можно сделать.