ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 149
Numărul 148 Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 65
Abonament PDF

Tehnologia Blockchain

Ludovic Andreas Toth
Software Engineer msg systems Romania



PROGRAMARE

Pe parcursul evoluţiei umane au existat mai multe momente revoluţionare. De la apariţia roţii până la apariţia motorului cu combustie, de la la apriţia primei prese până la apariţia internetului,lumea s-a aflat într-o continuă schimbareşi dezvoltare.

Pentru a ajunge în forma actuală, Internetul, apărut în anul 1977 sub forma unui număr mic de calculatoare interconectate ce puteau transporta o cantitate mică de date, a suferit transformări drastice. În prezent, cantitatea de date ce poate fi transportată este limitată doar de capacitatea unităţilor de stocare, pentru interconectare nu mai este nevoie nici măcar de fir, iar comunicarea prin intermediul acestuia a devenit o necesitate în viaţa de zi cu zi. Totuşi, deşi această evoluţie a deschis noi oportunităţi, o problemă s-a accentuat şi anume, încrederea dintre oameni a atins un nivel critic, fiind evidenţiată mai ales în domeniul afacerilor.

Suntem aproximativ 7,6 miliarde de oameni şi tranzacţionăm anual 100 de trilioane de dolari. Fiecare din aceste tranzacţii presupune a avea încredere în partener. Încrederea reprezintă moneda de bază a comerţului, dar cu toate acestea, instinctual, pornim cu ideea că partenerul are ceva de ascuns sau încearcă să obţină avantaje în urma tranzacţiei.

Astfel, pentru a putea avea încredere unii în alţii este necesară o verificare prealabilă a istoricului tranzacţiilor partenerului sau a datelor existente despre acesta. Soluţia este reprezentată de folosirea de intermediari pentru a stoca şi a afla date despre aceşti parteneri.

Ex. La achiziţionarea unui vehicul, primul lucru care este verificat este istoricul accidentelor. Este necesară investigarea istoricului în vederea determinării eventualelor daune pe care vehiculul le-a suferit sau pentru a determina nivelul de îngrijire al vehiculului.

Tehnologia Blockchain a fost creată ca o soluţie la problema neîncrederii. Primii paşi în dezvoltarea tehnologiei au fost făcuţi în anul 1991, când Stuart Haber şi W. Scott Stornetta au vorbit pentru prima oară despre un lanţ de blocuri(blockchain) securizat criptografic. În anul 1992 cu cei doi, alături de Dave Bayer au integrat arborii de tip Merkel în concept, în vederea optimizării. Cei trei nu ştiau la momentul acela câte poate să schimbe conceptul a căror baze le-au pus.

Ca urmare a crizei financiare din anul 2008, conceptul de blockchain, reprezentând o bază de date distribuită, a fost dezvoltat, dorind să propună o soluţie pentru schimbarea modului în care tranzacţiile monetare sunt realizate prin intermediul diferitelor instituţiilor financiare. Cu ajutorul unei reţele peer-to-peer şi a unui server distribuit folosit pentru datare, o bază de date blockchain poate fi autonomă.

Prima versiune de implementare a acestui concept a fost folosită în cadrul dezvoltării criptomonedei Bitcoin, apărută în anul 2009. Baza de date blockchain a Bitcoin a ajuns la începutul anului în curs, la o dimensiune impresionantă de 100 GB, numărul total de tranzacţii find de aproximativ 262.500.000, cu o sumă totală de 50 de bilioane de dolari, o singură monedă ajungând să valoreze peste 5000$, având o creştere de peste 750%.

Structură şi implementare

Pe scurt, conceptul de blockchain este simplu, reprezentând o bază de date distribuită ce păstrează o listă dinamică de înregistrări. Asocierea cu alte concepte precum tranzacţiile, contractele inteligente(smart-contracts) sau criptomonedele, fac conceptul în sine mai greu de înţeles.

Un _blockchain reprezintă un lanţ (chain) de blocuri interconectate, fiecare nod conţinând cheia hash a nodului anterior, cu excepţia primului bloc denumit genesis.

În mod normal, structura unui bloc(block) este alcătuită din două componente principale: un header şi un body. Header-ul cuprinde versiunea curentă a blocului, cheia hash a blocului anterior, cheia hash a blocului curent, o semnătură de timp, un contor şi biţii ţintă, iar body-ul este format din tranzacţii.

O funcţie hash aplicată unui obiect ajută la obţinerea unei secvenţe de caractere, denumită cheie hash, ce reprezintă semnătura digitală a obiectului respectiv. O cheie hash este unică şi poate fi reprodusă doar dacă sunt cunoscute toate componentele iniţiale din care aceasta a fost obţinută.

Soluţia următoare reprezintă un PoC(Proof of Concept), fiind o variantă de implementare simplificată a unui blockchain realizată în limbajul Java, folosind biblioteca Lombok pentru eliminarea codului _boilerplate. Pentru simplificare, structura de bază a unui bloc poate fi formată doar dintr-un index, o semnătura de timp, conţinutul de date şi cele două chei hash.

Pentru a obţine cheia hash a unui obiect este necsară transformarea obiectului folosind algoritmul de criptare SHA-256. Pachetul java.security pune la dispoziţie clasele necesare obţinerii acesteia:

private String getHashFromString(String decodedHash) throws NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hash = digest.digest((decodedHash).getBytes(StandardCharsets.UTF_8));
    return Base64.getEncoder().encodeToString(hash);
}

Câmpurile utilizate sunt:

    //Versiunea
    private int index;

    //Semnătura de timp
    private LocalDate timestamp;

    //Cheia hash a blocului curent
    @NonFinal private String hash;

    //Cheia hash a blocului anterior
    private String previousHash;

    //Contorul
    @NonFinal private int nonce = 0;

    //Tranzacţiile
    private T data;

    //Dificultatea
    private int difficulty;

    //Timpul de minare
    @NonFinal private Duration miningTime;

Iar funcţia de calculare a cheii pentru un bloc este următoarea:

public String calculateHash() throws NoSuchAlgorithmException {
    String decodedHash = String.valueOf(index) + this.timestamp + this.data + this.previousHash + this.nonce;
    return getHashFromString(decodedHash);
}

Pentru ca fiecare participant să poată intra în contact cu datele distribuite, a fost introdus conceptul de minerit. Este necesară limitarea numărului de generări de blocuri într-un interval de timp întrucât pot apărea inconsistenţe. De asemenea un timp foarte mic de generare poate ajuta la compromiterea unui lanţ.

În ceea ce priveşte Bitcoin, mineritul este folosită pentru a genera monede noi, dar scopul principal rămâne acela de a oferi consistenţă datelor.

La un nivel simplificat următorul cod este echivalentul unui proces mai complex de minerit. Se setează un nivel de dificultate care urmăreşte generarea unui număr de 0-uri la începutul cheii hash. Această generare presupune un timp de procesare îndelungat. Pentru testare se pot folosi diferite nivele de dificultate.

private void calculateHashAndMiningTime() throws NoSuchAlgorithmException {
    Instant startTime = Instant.now();
    mineBlock();
    Instant endTime = Instant.now();

    this.miningTime = Duration.between(startTime,endTime);
}

public void mineBlock() throws NoSuchAlgorithmException {
    while (!generateStarting(difficulty).equals(hash.substring(0, difficulty))) {
        nonce++;
        this.hash = this.calculateHash();
    }
}

private String generateStarting(int difficulty) {
    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i < difficulty; i++) {
        stringBuilder.append("0");
    }

    return stringBuilder.toString();
}

O tranzacţie poate fi reprezentată de o clasă similară conţinând detalii despre destinatar, expeditor, valoarea tranzacţiei şi un mesaj ataşat(se poate observa similitudinea cu ceea ce înseamnă un transfer bancar):

@Data
@Builder
@AllArgsConstructor
public class Transaction {
    private String sender;
    private int value;
    private String receiver;
    private String message;

    @Override
    public String toString() {
        return sender + " sent a value of " + value + "$ to " + receiver + " with the following message " + message;
    }
}

Un blockchain are următoarea structură.

public class BlockChain {
    private List> blockList;
    private final int chainDifficulty;

    public BlockChain(Block genesisBlock, int chainDifficulty) {
        this.chainDifficulty = chainDifficulty;
        this.blockList = new LinkedList<>();
        this.blockList.add(genesisBlock);
    }

    public BlockChain(Block genesisBlock) {
        this(genesisBlock, 3);
    }
}

Aceasta trebuie să ofere posibilitatea de a returna numărul total de blocuri dintr-un blockchain şi cea a returnării ultimului bloc.

public int getChainSize() {
    return blockList.size();
}

public Block getLatestBlock() {
    return blockList.get(blockList.size() - 1);
}

În momentul adăugării unui bloc nou, acesta trebuie să fie validat.

public void addBlock(T data) throws NoSuchAlgorithmException {
    Block previousBlock = getLatestBlock();
    Block block = new Block<>(previousBlock.getIndex() + 1, data, getLatestBlock().getHash(), chainDifficulty);

    if (isValidBlock(previousBlock, block)) {
        blockList.add(block);
    }

}

public boolean isValidBlock(Block lastBlock, Block newBlock) throws NoSuchAlgorithmException {
    if (lastBlock.getIndex() != newBlock.getIndex() - 1) {
        return false;
    }

    if (!lastBlock.getHash().equals(newBlock.getPreviousHash())) {
        return false;
    }

    if (!newBlock.getHash().equals(newBlock.calculateHash())) {
        return false;
    }

    return true;
}

De asemenea este foarte important să existe posibilitatea validării întregului bloc în orice moment:

public boolean validateBlockChain() throws NoSuchAlgorithmException {
    for (int i = 1; i < blockList.size(); i++) {
        Block previousBlock = blockList.get(i - 1);
        Block currentBlock = blockList.get(i);

        if (!isValidBlock(previousBlock, currentBlock)) {
            return false;
        }
    }

    return true;

}

Iniţializarea unui blockchain thread-safe arată astfel:

ThreadLocal> blockChainThreadLocal = new ThreadLocal<>();
Transaction initialTransaction = new Transaction("Loolkovsky", 9999, "Loolkovsky", "Initial amount");
Block initialTransactionBlock = new Block<>(0, initialTransaction, "");
BlockChain chainBlock = new BlockChain<>(initialTransactionBlock);
blockChainThreadLocal.set(chainBlock);

Un miner poate avea următoarea structură:

public class Client implements IClient {
    @Override
    public  BlockChain generateBLockchain(BlockChain blockChain, T data) throws Exception {
        blockChain.addBlock(data);
        return blockChain;
    }
}

Există şansa ca în momentul procesului de minare, doi sau mai mulţi mineri să obţină soluţia. În momentul în care trece perioada asignată generării unui nod şi sunt analizate rezultatele, minerul cel mai rapid este luat în calcul.

boolean fistClientBlockValidity = firstClientBlockChain.validateBlockChain();
boolean secondClientBlockValidity = secondClientBlockChain.validateBlockChain();

if (fistClientBlockValidity && secondClientBlockValidity) {
    if (firstClientBlockChain.getLatestBlock().getMiningTime().compareTo(secondClientBlockChain.getLatestBlock().getMiningTime()) >= 0) {
        blockChainThreadLocal.set(firstClientBlockChain);
        System.out.println("First client was faster " + firstClientBlockChain.getLatestBlock().getMiningTime());
    } else {
        secondClientBlockChain.set(secondClientBlockChain);
        System.out.println("Second client was faster " + secondClientBlockChain.getLatestBlock().getMiningTime());
    }
} else if (fistClientBlockValidity) {
    blockChainThreadLocal.set(firstClientBlockChain);
} else if (secondClientBlockValidity) {
    blockChainThreadLocal.set(secondClientBlockChain);
}

Rezultatele arată astfel:

First client was faster PT13.755S
Second client was faster PT1M0.976S
First client was faster PT1.008S
First client was faster PT2.007S

Pe scurt, fiecare bloc reprezintă o intrare de date înscrisă şi datată de o entitate unică, de încredere şi imparţială reprezentând un registru. Fiecare informaţie din bloc alături de informaţiile din blocul anterior reprezintă componente ale cheii digitale. Astfel se crează un lanţ ce oferă încredere, întrucât fiecare modificare poate fi verificată, validată şi e imposibil de compromis. Astfel este introdus conceptul de imutabilitate. În cazul unei încercări de compromitere sau alterare a datelor, sistemul detectează inconsistenţele şi realizează o restaurare către ultima versiune validă cunoscută şi deţinut de o entitate din reţea.

Pentru ca fiecare participant să aibă acces la date acestea trebuie minate pentru o perioadă determinată de timp. Acest minerit este foarte costisitor din punct de vedere al resurselor hardware. De exemplu, puterea totală de calcul folosită pentru mineritul criptomonezii Bitcoin a ajuns să depăşească de până la 100 de ori toată puterea totală de calcul deţinută de gigantul Google.

Fiecare participant are acces la acest blockchain, dar fiecare bloc din blockchain poate reprezenta la rândul lui alt blockchain, astfel existând comunicare între diferite arii şi domenii. Tranzacţiile realizate sunt transparente, interogabile şi incoruptible. Datele din blockchain pot reprezenta chiar date personale ajungându-se la o identitate virtuală pe care putem să o controlăm în întregime şi să alegem ce date distribuim.

În Rusia este investigată posibilitatea trecerii la un sistem de vot, politicienii pot fi monitorizaţi de cetăţeni iar şpaga poate fi eliminată dacă sunt implementate sisteme ce folosesc această tehnologie.

Fiecare companie care implementează acest concept devine o companie de încredere. Fiecare companie va avea competiţie din partea unei versiuni "blockchain" a propriei companii.

Aşadar principalele 5 avantaje pe care tehnologia blockchain le oferă sunt:

  1. Protejarea drepturilor
  2. Crearea unei economii distribuite
  3. Eliminarea taxelor
  4. Protejarea si controlul datelor
  5. Compensaţie pentru producători

Concluzii

Deşi tehnologia oferă multe avantaje şi rezolvă multe probleme, aceasta nu poate rezolva toate problemele. Oamenii nu trebuie să aibă încredere doar în alţi oameni ci şi în dispozitive mobile, roboţi sau vehicule. Deşi suntem într-un stadiu tehnologic atât de avansat, doar 40% din populaţia globului e conectată la internet.

Aşadar, în ultimii ani lumea a vorbit tot mai mult despre social media, robotică sau inteligenţă artificială şi prea puţin despre tehnologia blockchain şi criptomonede. Este momentul să ne îndreptăm atenţia în această direcţie.

Pe scurt, tehnologia blockchain reprezintă începutul unei noi ere digitale, o eră ce poate rezolva multe din problemele cu care ne confruntăm sau o eră ce poate să ne îndepărteze şi mai mult de ceea ce înseamnă umanitate.

NUMĂRUL 149 - Development with AI

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects