3. Minning

Avem deja un blockchian cu blocuri pe care le putem verifica că sunt valide. Dar de unde știm că întreg lanțul este valid? – că nu a intervenit cineva și a schimbat întreg lanțul de blocuri cu un altul?

Soluția ingenioasă pe care o aplică tehnologia blockchain este identificarea unor semnături care sa presupună o dificultate foarte ridicată de obținere (calculare) – astfel pentru a crea un nou lanț care să-l înlocuiască pe cel existent va trebui sa folosești o putere de procesare extrăordinar de mare – practic imposibil de atins.

Asta fac minerii de criptomonede – identifcă semnături care respecta unele condiții și blocurile sunt adăugate la lanț. Cu cât minarea se face de mai mult timp, cu atât va fi mai dificil să se creeze un lanț la fel cu cel existent.

Dar cum putem face semnătura mai dificilă? – doar algoritmul este clar – este refolosit pentru validare! Soluția este simplă – în crearea semnăturii mai adăugăm un parametru care se tot schimbă până când se obține o semnătură care să respecte o anumită regulă. Un exemplu:

– condiția: semnătura sa înceapa cu 5 zerouri (0000….)

– pe lângă datele  deja stabilite, blocul va mai conține o informație: un număr întreg  care va fi inclus in calcularea semnăturii blocului. Pașii pentru găsirea numărului potrivit: aflăm semnătura blocului daca numărul=1 si vedem dacă primele 5 caractere sunt zero. Dacă nu îi dăm numărului valoarea 2, refacem semnătura si verificăm daca sunt cei 5 de zero la început; și așa mai departe până găsim numărul potrivit (în cazul de față probabil va trebui să încercăm cateva milioane de variante)

Primul pas este să adăugăm în bloc (clasa Block) un nou câmp – un număr:

  
    private int numar; //noul numar adaugat

    public int getNumar() {
        return numar;
    }

    public void setNumar(int numar) {
        this.numar = numar;
    }

Să nu uităm să modificăm și functia de calculare a semnăturii, ca să includă și numarul nostru

  
    public static String calculateHash(Block block) {
        String calculatedhash = applySha256(
                block.getPreviousHash()
                + Long.toString(block.getTimestamp())
                + block.getData()
                + Integer.toString(block.getNumar())//numarul care face acum parte din semnatura
        );
        return calculatedhash;
    }

Următorul pas este adăugarea în clasa Utile a unei funcții de minare (în care dificultatea va fi existența de zerouri in fața la semnătură):

    public static String mineBlock(int difficulty, Block block) {
        //Cream un string format numai din zerouri a caror numar este egal cu dificultatea (il vom folosi sa verificam ca semnatura incepe cu un astfel de string)
        String target = new String(new char[difficulty]).replace('\0', '0');
        int numar = 0;
        //calculam cat timp semnatura nu respecta conditia
        while (!block.getHash().substring(0, difficulty).equals(target)) {
            numar++; //incrementam numarul ca sa mai incercam o data
            block.setNumar(numar);
            block.setHash(calculateHash(block));//calculam semnatura
        }
        //cand iesim din while, avem semnatura asa cum ne-o dorim 
 System.out.println("Am obtinut blocul!!! : " + block.getHash());
 System.out.println("Numar=" + numar);
        return block.getHash();
    }

Să facem și un test, modificând în main pentru dificultate=5:

  
 public static void main(String[] args) {
 List<Block> blocks = new ArrayList<Block>();
 Block block1 = new Block("primul mesaj", "0");
 Utile.mineBlock(5, block1);
 blocks.add(block1);
 Block block2 = new Block("al doilea mesaj", block1.getHash());
 Utile.mineBlock(5, block2);
 blocks.add(block2);
 Block block3 = new Block("al treilea mesaj", block2.getHash());
 Utile.mineBlock(5, block3);
 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"));
 }

La mine, după aproximativ 3 secunde s-au minat blocurile:

Am obtinut blocul!!! : 00000129515144fcfbee5e054d8c6cc47c3a22c068264fbb39ea15cb04af7d94
Numar=136386
Am obtinut blocul!!! : 00000cf5b3778ab748d1604b60479fd85785b87812a34cecb62e7d2cde4bfc1a
Numar=272565
Am obtinut blocul!!! : 000003fa79aecc19771d96a4af73cd1e8216ec874aa977aa5291826dba28b08d
Numar=22787
**********START BLOCK***********
date= primul mesaj
data creare= 11.05.2018 11:26:50
semnatura= 00000129515144fcfbee5e054d8c6cc47c3a22c068264fbb39ea15cb04af7d94
semnatura precedenta= 0
numar= 136386
**********END BLOCK***********
**********START BLOCK***********
date= al doilea mesaj
data creare= 11.05.2018 11:26:51
semnatura= 00000cf5b3778ab748d1604b60479fd85785b87812a34cecb62e7d2cde4bfc1a
semnatura precedenta= 00000129515144fcfbee5e054d8c6cc47c3a22c068264fbb39ea15cb04af7d94
numar= 272565
**********END BLOCK***********
**********START BLOCK***********
date= al treilea mesaj
data creare= 11.05.2018 11:26:52
semnatura= 000003fa79aecc19771d96a4af73cd1e8216ec874aa977aa5291826dba28b08d
semnatura precedenta= 00000cf5b3778ab748d1604b60479fd85785b87812a34cecb62e7d2cde4bfc1a
numar= 22787
**********END BLOCK***********
Lanutul este valid

 

La valori de dificultate mai mari, timpul de procesare crește exponențial.

Acum avem mecanismul prin care ne putem asigura că lanțul nostru nu va putea fi înlocuit de altul.

Ce facem cu acest blockchain? Nu prea ne folosește la nimic, dacă nu am putea face tranzacții cu ajutorul lui. Urmatoarea scțiune le va prezenta:

4. Crearea unui portofel virtual

 

Lasă un răspuns

Fii primul care lasă un comentariu

avatar
  Subscribe  
Notificare