Проверка целостности
Мы не имеем ничего общего с блокчейн, если не можем проверить его действительность (нет ли изменений в сеть блоков).
Мы выполним 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***********
Подписи не равны. Сеть является недействительной.
Далее мы пойдем к … майнингу — мы увидим, зачем это нужно, что это значит и как это можно сделать.