2. Verificarea integrității

Spread the love

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