Implementácia jednoduchého blockchainu v Jave
1. Prehľad
V tomto tutoriále sa dozvieme základné pojmy technológie blockchain. Implementujeme tiež základnú aplikáciu v Jave, ktorá sa zameriava na koncepty.
Ďalej si povieme niečo o pokročilých konceptoch a praktických aplikáciách tejto technológie.
2. Čo je Blockchain?
Poďme si teda najskôr uvedomiť, čo presne blockchain je ...
Jeho pôvod sa datuje späť k dokumentu zverejnenému Satoshi Nakamotom pre bitcoin v roku 2008.
Blockchain je decentralizovaná kniha informácií. Skladá sa z blokov dát spojených pomocou kryptografie. Patrí do siete uzlov pripojených cez verejnú sieť. Pochopíme to lepšie, keď sa neskôr pokúsime vytvoriť základný návod.
Existuje niekoľko dôležitých atribútov, ktorým musíme rozumieť, poďme si nimi teda prejsť:
- Odolné proti neoprávnenej manipulácii: V prvom rade údaje ako súčasť bloku sú chránené proti neoprávnenej manipulácii. Na každý blok sa odvoláva kryptografický súhrn, ktorý sa všeobecne nazýva hash, vďaka čomu je blok odolný voči neoprávnenej manipulácii.
- Decentralizované: Celé blockchain je úplne decentralizovaný cez sieť. To znamená, že neexistuje žiadny hlavný uzol a každý uzol v sieti má rovnakú kópiu.
- Transparentné: Každý uzol zapojený do siete overuje a na základe konsenzu pridáva do svojho reťazca nový blok s ostatnými uzlami. Preto má každý uzol úplnú viditeľnosť údajov.
3. Ako funguje blockchain?
Poďme teda pochopiť, ako blockchain funguje.
The základné jednotky blockchainu sú blokov. Jeden blok môže zapuzdriť niekoľko transakcií alebo iných cenných údajov:

3.1. Ťažba bloku
Blok reprezentujeme hodnotou hash. Generovanie hashovej hodnoty bloku sa nazýva „mining“ blok. Ťažba bloku je zvyčajne výpočtovo nákladná, pretože slúži ako „dôkaz o práci“.
Hašovanie bloku zvyčajne pozostáva z nasledujúcich údajov:
- Hash bloku sa primárne skladá z transakcií, ktoré obsahuje
- Hash tiež pozostáva z časovej pečiatky vytvorenia bloku
- Zahŕňa tiež nonce, ľubovoľné číslo používané v kryptografii
- Nakoniec hash aktuálneho bloku obsahuje aj hash predchádzajúceho bloku
Viacnásobné uzly v sieti môžu konkurovať ťažbe bloku súčasne. Okrem generovania hash musia uzly tiež overiť, či sú transakcie pridávané do bloku legitímne. Prvý, kto vyťaží blok, vyhráva závod!
3.2. Pridanie bloku do blockchainu
Aj keď je ťažba bloku výpočtovo nákladná, overenie, či je blok legitímny, je relatívne oveľa jednoduchšie. Všetky uzly v sieti sa podieľajú na overovaní novo vyťaženého bloku.

Teda novo ťažená blok je pridaný do blockchainu na základe konsenzu uzlov.
Teraz je k dispozícii niekoľko konsenzuálnych protokolov, ktoré môžeme použiť na overenie. Uzly v sieti používajú rovnaký protokol na detekciu škodlivej vetvy reťazca. Preto bude škodlivá vetva, aj keď bude zavedená, čoskoro odmietnutá väčšinou uzlov.
4. Základný blockchain v Jave
Teraz máme dostatok kontextu na to, aby sme začali vytvárať základnú aplikáciu v Jave.
Naše jednoduché príklad tu ilustruje základné pojmy práve sme videli. Aplikácia na úrovni výroby vyžaduje veľa úvah, ktoré presahujú rámec tohto tutoriálu. Neskôr sa však dotkneme niektorých pokročilých tém.
4.1. Implementácia bloku
Najprv musíme definovať jednoduchý POJO, ktorý bude obsahovať údaje pre náš blok:
verejná trieda Blokovať {súkromný hash reťazca; private String previousHash; súkromné údaje reťazca; súkromná dlhá známka; súkromné int nonce; public Block (String data, String previousHash, long timeStamp) {this.data = data; this.previousHash = previousHash; this.timeStamp = timeStamp; this.hash = vypočítaťBlockHash (); } // štandardní zakladatelia a zakladatelia}
Poďme pochopiť, čo sme si tu zabalili:
- Oheň z predchádzajúceho bloku, dôležitá súčasť stavby reťaze
- Skutočné údaje, akékoľvek informácie s hodnotou, napríklad zmluva
- Časová pečiatka vytvorenia tohto bloku
- Nonce, čo je ľubovoľné číslo používané v kryptografii
- Nakoniec hash tohto bloku, vypočítaný na základe ďalších údajov
4.2. Výpočet hodnoty Hash
Teraz, ako vypočítame hash bloku? Použili sme metódu vypočítaťBlockHash ale zatiaľ som nevidel implementáciu. Pred implementáciou tejto metódy stojí za to venovať nejaký čas pochopeniu, čo to vlastne hash je.
Hash je výstup niečoho známeho ako hash funkcia. A hashová funkcia mapuje vstupné dáta ľubovoľnej veľkosti na výstupné dáta pevnej veľkosti. Haš je pomerne citlivý na akúkoľvek zmenu vstupných údajov, aj keď môže byť akákoľvek malá.
Navyše je nemožné získať vstupné údaje späť iba z ich hodnoty hash. Vďaka týmto vlastnostiam je hašovacia funkcia v kryptografii veľmi užitočná.
Pozrime sa teda, ako môžeme vygenerovať hash nášho bloku v Jave:
public String CalculateBlockHash () {String dataToHash = previousHash + Long.toString (timeStamp) + Integer.toString (nonce) + dáta; MessageDigest digest = null; byte [] bytes = null; try {digest = MessageDigest.getInstance ("SHA-256"); bytes = digest.digest (dataToHash.getBytes (UTF_8)); } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {logger.log (Level.SEVERE, ex.getMessage ()); } Vyrovnávacia pamäť StringBuffer = nový StringBuffer (); for (byte b: bytes) {buffer.append (String.format ("% 02x", b)); } return buffer.toString (); }
Deje sa tu veľa vecí, poďme im podrobne porozumieť:
- Najskôr zreťazíme rôzne časti bloku, z ktorého vygenerujeme hash
- Potom získame inštanciu hash funkcie SHA-256 z MessageDigest
- Potom vygenerujeme hashovaciu hodnotu našich vstupných údajov, ktorou je bajtové pole
- Nakoniec transformujeme bajtové pole na hexadecimálny reťazec, hash je zvyčajne reprezentovaný ako 32-miestne hexadecimálne číslo
4.3. Už sme ťažili blok?
Všetko zatiaľ znie jednoducho a elegantne, až na to, že sme blok ešte neťažili. Čo presne znamená ťažba bloku, ktorý už nejaký čas zaujal vývojárov!
No, vyťažiť blok znamená vyriešiť výpočtovo zložitú úlohu pre blok. Zatiaľ čo výpočet hash bloku je trochu triviálny, nájdenie hash začínajúceho piatimi nulami nie je. Ešte zložitejšie by bolo nájsť hash začínajúci desiatimi nulami a dostaneme všeobecnú predstavu.
Ako konkrétne to môžeme urobiť? Úprimne povedané, riešenie je oveľa menej efektné! Tento cieľ sa snažíme dosiahnuť hrubou silou. Využívame tu nonce:
public String mineBlock (int prefix) {String prefixString = new String (new char [prefix]). replace ('\ 0', '0'); while (! hash.substring (0, prefix) .equals (prefixString)) {nonce ++; hash = vypočítaťBlockHash (); } návratový hash; }
Pozrime sa, čo sa tu snažíme robiť:
- Začneme definovaním predpony, ktorú hľadáme
- Potom skontrolujeme, či sme našli riešenie
- Ak nie, zvýšime hodnotu nonce a vypočítame hash v slučke
- Slučka pokračuje, kým nenarazíme na jackpot
Začíname tu s predvolenou hodnotou nonce a zvyšujeme ju o jednu. Ale je ich viac prepracované stratégie na naštartovanie a zvýšenie nonce v reálnych aplikáciách. Tiež tu neoverujeme naše údaje, čo je zvyčajne dôležitá súčasť.
4.4. Spustime príklad
Teraz, keď sme definovali náš blok spolu s jeho funkciami, môžeme ho použiť na vytvorenie jednoduchého blockchainu. Toto uložíme do ArrayList:
Zoznam blockchain = nový ArrayList (); predpona int = 4; String prefixString = new String (new char [prefix]). Replace ('\ 0', '0');
Ďalej sme definovali predponu štyri, čo v skutočnosti znamená, že chceme, aby náš hash začínal štyrmi nulami.
Pozrime sa, ako tu môžeme pridať blok:
@Test public void givenBlockchain_whenNewBlockAdded_thenSuccess () {Block newBlock = new Block ("The is a New Block.", Blockchain.get (blockchain.size () - 1) .getHash (), new Date (). GetTime ()); newBlock.mineBlock (predpona); assertTrue (newBlock.getHash (). substring (0, predpona) .equals (prefixString)); blockchain.add (newBlock); }
4.5. Overenie blockchainu
Ako môže uzol overiť platnosť blockchainu? Aj keď to môže byť dosť komplikované, zamyslime sa nad jednoduchou verziou:
@Test public void givenBlockchain_whenValidated_thenSuccess () {boolean flag = true; for (int i = 0; i <blockchain.size (); i ++) {String previousHash = i == 0? "0": blockchain.get (i - 1) .getHash (); flag = blockchain.get (i) .getHash (). equals (blockchain.get (i) .calculateBlockHash ()) && previousHash.equals (blockchain.get (i) .getPreviousHash ()) && blockchain.get (i). getHash (). podreťazec (0, predpona) .equals (prefixString); if (! flag) break; } assertTrue (vlajka); }
Takže tu robíme tri konkrétne kontroly pre každý blok:
- Uložený hash aktuálneho bloku je vlastne to, čo počíta
- Hash predchádzajúceho bloku uložený v aktuálnom bloku je hash predchádzajúceho bloku
- Aktuálny blok bol vyťažený
5. Niektoré pokročilé koncepty
Náš základný príklad síce prináša základné koncepty blockchainu, ale určite nie je úplný. Na praktické využitie tejto technológie je potrebné zohľadniť niekoľko ďalších aspektov.
Aj keď nie je možné podrobne rozpísať všetky, prejdime si niektoré z dôležitých:
5.1. Overenie transakcie
Výpočet hash bloku a nájdenie požadovaného hash je iba jednou časťou ťažby. Blok pozostáva z údajov, často vo forme viacerých transakcií. Tieto musia byť overené predtým, ako sa môžu stať súčasťou bloku a ťažiť.
Typická implementácia blockchain nastavuje obmedzenie toho, koľko dát môže byť súčasťou bloku. To tiež stanovuje pravidlá, ako je možné overiť transakciu. Na procese overovania sa podieľa viac uzlov v sieti.
5.2. Alternatívny konsenzusový protokol
Videli sme, že konsenzuálny algoritmus ako „Proof of Work“ sa používa na ťažbu a validáciu bloku. Toto však nie je jediný algoritmus konsenzu, ktorý je k dispozícii na použitie.
Existujú niekoľko ďalších konsenzuálnych algoritmov, z ktorých si môžete vybrať, napríklad Dôkaz o podiele, Dôkaz o autorite a Dôkaz o hmotnosti. Všetky tieto výhody a nevýhody majú svoje výhody. To, ktoré z nich použijeme, závisí od typu aplikácie, ktorú chceme navrhnúť.
5.3. Odmena za ťažbu
Sieť blockchainu sa zvyčajne skladá z dobrovoľných uzlov. Prečo by potom chcel niekto prispievať k tomuto zložitému procesu a udržiavať ho legitímny a rastúci?
To je preto, že uzly sú odmenené za overenie transakcií a vyťaženie bloku. Tieto odmeny majú zvyčajne podobu mince spojenej s aplikáciou. Aplikácia však môže rozhodnúť, že odmenou bude čokoľvek hodnotné.
5.4. Typy uzlov
Blockchain sa pri svojej činnosti úplne spolieha na svoju sieť. Teoreticky je sieť úplne decentralizovaná a každý uzol je rovnaký. V praxi sa však sieť skladá z viacerých typov uzlov.
Zatiaľ čo úplný uzol má úplný zoznam transakcií, ľahký uzol má iba čiastočný zoznam. Nie všetky uzly sa navyše zúčastňujú overovania a validácie.
5.5. Bezpečná komunikácia
Jedným z charakteristických znakov blockchainovej technológie je jej otvorenosť a anonymita. Ako však poskytuje bezpečnosť transakciám uskutočňovaným v rámci? Toto je založené na kryptografii a infraštruktúre verejných kľúčov.
Iniciátor transakcie použije svoj súkromný kľúč na zabezpečenie a pripojenie k verejnému kľúču príjemcu. Uzly môžu na overenie transakcií používať verejné kľúče účastníkov.
6. Praktické aplikácie blockchainu
Blockchain sa teda javí ako vzrušujúca technológia, ale musí sa tiež ukázať ako užitočný. Táto technológia existuje už nejaký čas a - je zbytočné zdôrazňovať, že sa v mnohých doménach ukázala ako rušivá.
Aktívne sa presadzuje jeho aplikácia v mnohých ďalších oblastiach. Poďme pochopiť najobľúbenejšie aplikácie:
- Mena: Toto je zďaleka najstaršie a najznámejšie využitie blockchainu vďaka úspechu bitcoinu. Poskytujú bezpečné peniaze bez trenia ľuďom na celom svete bez zásahu ústredného orgánu alebo vlády.
- Identita: Digitálna identita sa v súčasnom svete rýchlo stáva normou. To je však utopené bezpečnostnými problémami a nedovolenou manipuláciou. Blockchain je nevyhnutný v revolúcii v tejto oblasti s úplne bezpečnými a nedovolenými identitami.
- Zdravotná starostlivosť: Zdravotnícky priemysel je nabitý údajmi, ktoré väčšinou spracúvajú ústredné orgány. To znižuje transparentnosť, bezpečnosť a efektívnosť zaobchádzania s týmito údajmi. Technológia blockchain môže poskytnúť systém bez toho, aby tretia strana poskytla potrebnú dôveru.
- Vláda: Toto je možno oblasť, ktorá je dobre otvorená narušeniu blockchainovou technológiou. Vláda je zvyčajne v centre niekoľkých služieb občanom, ktoré sú často zaťažené neefektívnosťou a korupciou. Blockchain môže pomôcť nadviazať oveľa lepšie vzťahy medzi vládou a občanmi.
7. Obchodné nástroje
Aj keď je tu naša základná implementácia užitočná na vyvolanie konceptov, nie je praktické vyvíjať produkt na blockchaine od nuly. Našťastie tento priestor teraz dozrel a na začatie máme niekoľko veľmi užitočných nástrojov.
Poďme si prejsť niektorými z populárnych nástrojov na prácu v tomto priestore:
- Solidity: Solidity is staticky napísaný a objektovo orientovaný programovací jazyk určené na písanie inteligentných zmlúv. Môže byť použitý na písanie inteligentných zmlúv na rôznych blockchainových platformách, ako je Ethereum.
- Remix IDE: Remix je výkonný nástroj open-source nástroj na písanie inteligentných zmlúv v Solidity. To umožňuje používateľovi písať inteligentné zmluvy priamo z prehliadača.
- Truffle Suite: Truffle provides veľa nástrojov, ktoré vývojárom pomôžu a môžu začať pri vývoji distribuovaných aplikácií. Patria sem hľuzovky, ganache a mrholenie.
- Ethlint / Solium: Solium umožňuje vývojárom zabezpečiť, aby ich inteligentné zmluvy napísané na Solidity neobsahujú problémy so štýlom a zabezpečením. Solium tiež pomáha pri riešení týchto problémov.
- Parita: Parita pomáha pri nastavenie vývojového prostredia pre inteligentnú zmluvu na éteru. Poskytuje rýchly a bezpečný spôsob interakcie s blockchainom.
8. Záver
Ak to zhrnieme, v tomto tutoriáli sme si prešli základné koncepty technológie blockchain. Pochopili sme, ako sieť ťaží a pridáva nový blok do blockchainu. Ďalej sme implementovali základné koncepty v Jave. Diskutovali sme tiež o niektorých pokročilých konceptoch týkajúcich sa tejto technológie.
Nakoniec sme zhrnuli niekoľko praktických aplikácií blockchainu a tiež dostupné nástroje.
Ako vždy, kód nájdete na GitHub.