2. Verificarea integrității

Inapoi la pagina de programare

Nu avem ce face cu un blockchain dacă nu putem verifica că este valid (că nu există modificări în blocurile lanțului).

Vom efectua 2 verificări:

  • semnătura blocului este aceeași cu cea care rezultă din calcul
  • semnătura blocului precedent coincide cu informatia privind semnătura din blocul curent

Vom parcurge întreg lanțul si vom verifica toate blocurile, utilizând funcția de mai jos, pe care o vom introduce tot în clasa Utile:

      public static Boolean isChainValid(List blockchain) {
        Block currentBlock;
        Block previousBlock;

        //parcurge lantul pentru a verifica hash-urile (semnaturile):
        for (int i = 1; i < blockchain.size(); i++) {
            currentBlock = blockchain.get(i);
            previousBlock = blockchain.get(i - 1);
            //compar semnatura blocului cu cea calculata
            if (!currentBlock.getHash().equals(calculateHash(currentBlock))) {
                System.out.println("Semnaturile nu sunt egale");
                return false;
            }
            //compar semnatura blocului predent cu informatia de semnatura precedenta din blocul curent
            if (!previousBlock.getHash().equals(currentBlock.getPreviousHash())) {
                System.out.println("Semnatura precedenta difera");
                return false;
            }
        }
        return true;
    }

Vom aplica aceasta funcție asupra lanțului creat de noi. Va trebui să modificam main-ul, astfel incat cele 3 blocuri sa le includem intr-o lista.

Începem prin adaugarea unei noi funcții in clasa Utile pentru a printa  o lista de blocuri:

 
    public static void printBlock(List blocks) {
        for (Block block : blocks) {
            printBlock(block);
        }
    }

În main creăm lista de obiecte de tip bloc. Noua varianta va arăta astfel:

 
    public static void main(String[] args) {
        List blocks = new ArrayList();
        Block block1 = new Block("primul mesaj", "0");
        blocks.add(block1);
        Block block2 = new Block("al doilea mesaj", block1.getHash());
        blocks.add(block2);
        Block block3 = new Block("al treilea mesaj", block2.getHash());
        blocks.add(block3);
        Utile.printBlock(blocks);
    }

In final adăugăm validarea lanțului:

 
System.out.println("Lanutul este " + (Utile.isChainValid(blocks) ? "valid" : "INvalid"));

După cum era de așteptat, primim confirmarea că lanțul este valid

……

semnatura= 145f77c895efd7cb1788caa27e6f306fd96284be68f3b453f419ce252168fef8
semnatura precedenta= 74130941b4c2225453ac49a0e6e714214ca2087b9a05a563439682ce627b6be2
**********END BLOCK***********
Lanutul este valid

Vom face și un test – după crearea lanțului vom modifica datele din blocul 2 și să vedem daca se mai validează

 
    public static void main(String[] args) {
        List blocks = new ArrayList();
        Block block1 = new Block("primul mesaj", "0");
        blocks.add(block1);
        Block block2 = new Block("al doilea mesaj", block1.getHash());
        blocks.add(block2);
        Block block3 = new Block("al treilea mesaj", block2.getHash());
        blocks.add(block3);
        Utile.printBlock(blocks);
        block2.setData("al doilea mesaj modificat");//intervenim in lant
        System.out.println("Lanutul este " + (Utile.isChainValid(blocks) ? "valid" : "INvalid"));
    }

Primim mesajul că lanțul nu mai este valid:

semnatura= e58a813f3a5f0abc34fe601ff9629cbed3dca4b2c6c38bf6e3643128528c32b6
semnatura precedenta= ffe598b39662deec6b3d7306026d578edd65a0736271f985d2bb06a95d988d22
**********END BLOCK***********
Semnaturile nu sunt egale
Lanutul este INvalid

În continuare vom trece la..minning – vom vedea de ce este necesar, ce înseamnă și cum poate fi efectuat

Inapoi la pagina de programare

Lasă un răspuns

Fii primul care lasă un comentariu

avatar
  Subscribe  
Notificare