Egyszerű blokklánc megvalósítása Java-ban

1. Áttekintés

Ebben az oktatóanyagban megtanuljuk a blockchain technológia alapfogalmait. A Java-ban megvalósítunk egy alapalkalmazást is, amely a koncepciókra összpontosít.

Ezenkívül megvitatjuk a technológia néhány fejlett koncepcióját és gyakorlati alkalmazását.

2. Mi az a Blockchain?

Tehát először meg kell értenünk, hogy mi is pontosan a blokklánc ...

Nos, eredetét Satoshi Nakamoto által a Bitcoin-on kiadott, 2008-ban megjelent fehér könyvre vezetik vissza.

A Blockchain egy decentralizált információs főkönyv. A kriptográfia használatával összekapcsolt adatblokkokból áll. A nyilvános hálózaton keresztül csatlakozó csomópontok hálózatához tartozik. Ezt jobban meg fogjuk érteni, ha később megpróbálunk létrehozni egy alap oktatóanyagot.

Van néhány fontos tulajdonság, amelyet meg kell értenünk, ezért nézzük át őket:

  • Szabotázsbiztos: Először is, az adatok egy blokk részeként szabotázsbiztosak. Minden blokkra egy kriptográfiai kivonat hivatkozik, amelyet közönségesen hash-ként emlegetnek, így a blokk szabotázs-mentes.
  • Decentralizált: Az egész a blockchain teljesen decentralizált a hálózaton keresztül. Ez azt jelenti, hogy nincs főcsomópont, és a hálózat minden csomópontjának ugyanaz a példánya.
  • Átlátszó: Minden csomópont részt vesz a hálózatban konszenzus útján érvényesíti és új blokkot ad a láncához más csomópontokkal. Ezért minden csomópont teljes körűen láthatja az adatokat.

3. Hogyan működik a Blockchain?

Most értsük meg, hogyan működik a blokklánc.

A egy blokklánc alapvető egységei blokkok. Egy blokk több tranzakciót vagy más értékes adatot foglalhat magában:

3.1. Blokk bányászata

A blokkot hash értékkel képviseljük. A blokk hash értékének előállítását „bányászatnak” nevezzük. a háztömb. A blokk bányászata általában számítási szempontból költséges, mivel ez a „munka bizonyítékaként” szolgál.

A blokk hashja általában a következő adatokból áll:

  • Elsősorban a blokk hash-ja az általa beágyazott tranzakciókból áll
  • A hash a blokk létrehozásának időbélyegéből is áll
  • Tartalmaz egy nonce-t is, egy tetszőleges számot, amelyet a kriptográfiában használnak
  • Végül az aktuális blokk hashja magában foglalja az előző blokk hashját is

Többszörös a hálózat csomópontjai versenyezhetnek az enyémekkel a blokkot egyszerre. A hash generálása mellett a csomópontoknak azt is ellenőrizniük kell, hogy a blokkba felvett tranzakciók jogszerűek-e. Az első, aki egy blokkot bányász, megnyeri a versenyt!

3.2. Blokk hozzáadása a blokklánchoz

Míg egy blokk bányászata számítási szempontból drága, egy blokk jogszerűségének ellenőrzése viszonylag könnyebb. A hálózat összes csomópontja részt vesz egy újonnan bányászott blokk ellenőrzésében.

Így egy újonnan bányászott blokk kerül a blokkláncba a konszenzuson a csomópontok közül.

Most számos konszenzusos protokoll áll rendelkezésre, amelyeket ellenőrizni tudunk. A hálózat csomópontjai ugyanazt a protokollt használják a lánc rosszindulatú ágának felderítésére. Ezért a rosszindulatú ágat, még akkor is, ha bevezetik, a csomópontok többsége hamarosan elutasítja.

4. Alapvető Blockchain Java-ban

Most van elegendő kontextusunk ahhoz, hogy elkezdjünk egy alapalkalmazást építeni a Java-ban.

Egyszerű Az itt bemutatott példa bemutatja az alapfogalmakat csak láttuk. A gyártási szintű alkalmazás sok olyan szempontot magában foglal, amelyek meghaladják az oktatóanyag körét. A későbbiekben azonban érintünk néhány speciális témát.

4.1. Blokk megvalósítása

Először meg kell határoznunk egy egyszerű POJO-t, amely a blokkunk adatait fogja tárolni:

nyilvános osztály Block {private String hash; privát húr előzőHash; privát karakterlánc-adatok; magán hosszú időbélyeg; private int nonce; public Block (String adatok, String előző Hash, long timeStamp) {this.data = adatok; this.previousHash = előzőHash; this.timeStamp = timeStamp; this.hash = kiszámoljaBlockHash (); } // szokásos mérőeszközök és beállítók}

Értsük meg, mit csomagoltunk ide:

  • Az előző blokk hashja, a lánc felépítésének fontos része
  • A tényleges adatok, minden értékkel bíró információ, például egy szerződés
  • A blokk létrehozásának időbélyege
  • Nonce, ami a kriptográfiában tetszőleges szám
  • Végül ennek a blokknak a kivonata, más adatok alapján kiszámítva

4.2. A hash kiszámítása

Most hogyan számoljuk ki a blokk kivonatát? Használtunk egy módszert calcBlockHash de még nem láttam megvalósítást. Mielőtt ezt a módszert alkalmaznánk, érdemes egy kis időt eltölteni, hogy megértsük, mi is pontosan a hash.

A hash valaminek a hash függvénynek nevezett eredménye. A A hash függvény tetszőleges méretű bemeneti adatokat rögzít rögzített méretű adatokhoz. A kivonat meglehetősen érzékeny a bemeneti adatok bármilyen változására, bármilyen kicsi is lehet.

Sőt, lehetetlen visszaszerezni a bemeneti adatokat csak a hash-ból. Ezek a tulajdonságok miatt a hash funkció nagyon hasznos a kriptográfiában.

Tehát nézzük meg, hogyan állíthatjuk elő a blokk hashját a Java-ban:

public String calcBlockHash () {String dataToHash = előzőHash + Long.toString (timeStamp) + Integer.toString (nonce) + adatok; MessageDigest digest = null; bájt [] bájt = null; próbáld ki az {digest = MessageDigest.getInstance ("SHA-256"); bájtok = digest.digest (dataToHash.getBytes (UTF_8)); } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {logger.log (Level.SEVERE, ex.getMessage ()); } StringBuffer puffer = new StringBuffer (); for (bájt b: bájt) {buffer.append (String.format ("% 02x", b)); } return buffer.toString (); }

Elég sok minden történik itt, értsük meg részletesen:

  • Először összefűzzük a blokk különböző részeit, hogy kivonatokat készítsünk belőlük
  • Ezután kapjuk az SHA-256 hash függvény példányát Üzenet feldolgozása
  • Ezután létrehozzuk a bemeneti adatok hash értékét, amely egy bájt tömb
  • Végül átalakítjuk a bájt tömböt hex sztringekké, a hash tipikusan 32 jegyű hex számként jelenik meg

4.3. Bányásztuk mégis a blokkot?

Eddig minden egyszerűnek és elegánsnak hangzik, kivéve azt a tényt, hogy még nem bányásztuk le a blokkot. Tehát mi jár pontosan egy blokk bányászatával, amely már egy ideje magával ragadja a fejlesztők kedvét!

Jól, egy blokk bányászata számítási szempontból bonyolult feladat megoldását jelenti a blokkhoz. Míg a blokk hashjának kiszámítása kissé triviális, az öt nullával kezdődő hash megtalálása nem. Még bonyolultabb lenne egy tíz nullával kezdődő kivonat megtalálása, és általános elképzelést kapunk.

Szóval, hogyan tudjuk ezt pontosan megtenni? Őszintén szólva a megoldás sokkal kevésbé divatos! Nyers erővel próbáljuk elérni ezt a célt. Itt használjuk a nonce-t:

public String mineBlock (int előtag) {String prefixString = új String (új char [előtag]). csere ('\ 0', '0'); while (! hash.substring (0, prefix) .egyenlő (prefixString)) {nonce ++; hash = kiszámoljaBlockHash (); } return hash; }

Lássuk, mit próbálunk itt megtenni:

  • Kezdjük azzal, hogy meghatározzuk a megtalálni kívánt előtagot
  • Ezután ellenőrizzük, hogy megtaláltuk-e a megoldást
  • Ha nem, akkor növeljük a nonce-t, és egy hurokban kiszámoljuk a kivonatot
  • A hurok addig tart, amíg el nem érjük a jackpotot

Itt kezdjük a nonce alapértelmezett értékével, és eggyel növeljük. De vannak még kifinomult stratégiák a nonce indításához és növeléséhez valós alkalmazásokban. Továbbá itt nem ellenőrizzük adatainkat, ami általában fontos rész.

4.4. Futtassuk a példát

Most, hogy definiáltuk blokkunkat a funkcióival együtt, ezt felhasználhatjuk egy egyszerű blokklánc létrehozására. Ezt tároljuk egy Tömb lista:

List blockchain = new ArrayList (); int előtag = 4; String prefixString = új karakterlánc (új karakter [előtag]). Cserélje le ('\ 0', '0');

Ezenkívül meghatároztuk a négy előtagot, ami azt jelenti, hogy azt akarjuk, hogy a hash-t négy nullával kezdjük.

Nézzük meg, hogyan adhatunk ide blokkot:

@Test public void givenBlockchain_whenNewBlockAdded_thenSuccess () {Block newBlock = new Block ("Az új blokk.", Blockchain.get (blockchain.size () - 1) .getHash (), új Date (). GetTime ()); newBlock.mineBlock (előtag); assertTrue (newBlock.getHash (). szubsztring (0, előtag) .egyenlő (prefixString)); blockchain.add (newBlock); }

4.5. Blockchain ellenőrzés

Hogyan ellenőrizheti egy csomópont, hogy a blokklánc érvényes? Bár ez meglehetősen bonyolult lehet, gondolkodjunk el egy egyszerű verzión:

@Test public void givenBlockchain_whenValidated_thenSuccess () {logikai zászló = igaz; for (int i = 0; i <blockchain.size (); i ++) {String előzőHash = i == 0? "0": blockchain.get (i - 1) .getHash (); flag = blockchain.get (i) .getHash (). egyenlő (blockchain.get (i) .calculateBlockHash ()) && previousHash.equals (blockchain.get (i) .getPreviousHash ()) && blockchain.get (i). getHash (). szubsztring (0, előtag) .egyenlő (prefixString); ha (! zászló) megtörik; } assertTrue (zászló); }

Tehát itt minden blokknál három konkrét ellenőrzést végzünk:

  • Az aktuális blokk tárolt kivonatát valóban kiszámítja
  • Az aktuális blokkban tárolt előző blokk hashja az előző blokk hashja
  • A jelenlegi blokk ki lett aknázva

5. Néhány fejlett fogalom

Míg az alapvető példánk a blockchain alapfogalmait hozza fel, ez természetesen nem teljes. Ennek a technológiának a gyakorlati alkalmazásához számos más szempontot kell figyelembe venni.

Bár nem lehet részletezni mindegyiket, nézzük át néhány fontosat:

5.1. Tranzakciók ellenőrzése

Egy blokk kivonatának kiszámítása és a kívánt hash megtalálása csak a bányászat egyik része. A blokk adatokból áll, gyakran több tranzakció formájában. Ezeket ellenőrizni kell, mielőtt egy blokk részévé tehetnék és bányászhatnák őket.

A. Tipikus megvalósítása a blockchain korlátozást szab arra vonatkozóan, hogy mennyi adat lehet egy blokk része. Az is szabályokat állapít meg a tranzakció igazolására. A hálózat több csomópontja részt vesz az ellenőrzési folyamatban.

5.2. Alternatív konszenzusos protokoll

Láttuk, hogy a konszenzusos algoritmust, például a „Munka igazolását” használják egy blokk bányászására és érvényesítésére. Ez azonban nem az egyetlen használható konszenzusos algoritmus.

Vannak számos más konszenzusos algoritmus közül lehet választani, mint a tét igazolása, a tekintély igazolása és a súly igazolása. Mindezeknek megvannak az előnyeik és hátrányaik. Melyiket kell használni, attól függ, hogy milyen típusú alkalmazást tervezünk megtervezni.

5.3. Bányászati ​​jutalom

A blokklánc hálózat általában önkéntes csomópontokból áll. Most miért akarna bárki hozzájárulni ehhez a bonyolult folyamathoz, és legitimnek és növekvőnek tartani?

Ez azért van, mert a csomópontokat a tranzakciók ellenőrzéséért és egy blokk bányászásáért díjazzák. Ezek a jutalmak általában az alkalmazáshoz kapcsolódó érmék formájában vannak. De egy alkalmazás eldöntheti, hogy a jutalom bármi értéket képvisel-e.

5.4. Csomópont típusok

A blokklánc teljes mértékben a hálózat működésére támaszkodik. Elméletileg a hálózat teljesen decentralizált, és minden csomópont egyenlő. A gyakorlatban azonban egy hálózat többféle csomópontból áll.

Míg egy teljes csomópont rendelkezik a tranzakciók teljes listájával, a könnyű csomópont csak részleges listával rendelkezik. Sőt, nem minden csomópont vesz részt az ellenőrzésben és az érvényesítésben.

5.5. Biztonságos kommunikáció

A blockchain technológia egyik jellemzője nyitottsága és névtelensége. De hogyan nyújt biztonságot a belül lebonyolított tranzakciók számára? Ez titkosítás és nyilvános kulcsú infrastruktúra alapján.

A tranzakció kezdeményezője a magánkulcsát használja a biztonság megőrzéséhez, és csatolja a címzett nyilvános kulcsához. A csomópontok a résztvevők nyilvános kulcsaival ellenőrizhetik a tranzakciókat.

6. A Blockchain gyakorlati alkalmazásai

Úgy tűnik tehát, hogy a blokklánc izgalmas technológia, de hasznosnak is kell lennie. Ez a technológia már egy ideje létezik, és mondanom sem kell, hogy sok területen zavarónak bizonyult.

Aktívan folytatják alkalmazását számos más területen. Értsük meg a legnépszerűbb alkalmazásokat:

  • Valuta: Ez messze a legrégebbi és legszélesebb körben ismert blokklánc, a Bitcoin sikerének köszönhetően. Biztonságos és súrlódásmentes pénzt biztosítanak az embereknek szerte a világon, mindenféle központi hatóság vagy kormányzati beavatkozás nélkül.
  • Identitás: A digitális identitás a mai világban gyorsan normává válik. Ezt azonban biztonsági kérdések és manipulációk sújtják. A blockchain elkerülhetetlen, hogy forradalmasítsa ezt a területet teljesen biztonságos és szabotázsbiztos identitásokkal.
  • Egészségügy: Az egészségügyi ágazat tele van adatokkal, amelyeket többnyire a központi hatóságok kezelnek. Ez csökkenti az ilyen adatok kezelésének átláthatóságát, biztonságát és hatékonyságát. A blockchain technológia harmadik fél nélkül is képes olyan rendszert biztosítani, amely biztosítja a szükséges bizalmat.
  • Kormány: Ez talán egy olyan terület, amely jól nyitott a blokklánc-technológia általi zavarásokra. A kormány általában több állampolgári szolgálat középpontjában áll, amelyek gyakran hatástalansággal és korrupcióval vannak terhelve. A blokklánc sokkal jobb kormány-állampolgár kapcsolatok kialakításában segíthet.

7. A kereskedelem eszközei

Míg itt az alapvető megvalósításunk hasznos a fogalmak kiváltására, nem célszerű a semmiből blokkláncra fejleszteni egy terméket. Szerencsére ez a tér most megérett, és van néhány hasznos eszközünk, amelyekből kiindulhatunk.

Menjünk át néhány népszerű eszközön, hogy ezen a területen dolgozzunk:

  • Szilárdság: A szilárdság az statikusan tipizált és objektum-orientált programozási nyelv Ajánlott okos szerződések megírásához. Használható intelligens szerződések írására különböző blockchain platformokon, mint például az Ethereum.
  • Remix IDE: A Remix egy erőteljes nyílt forráskódú eszköz intelligens szerződések megírásához a Szilárdságban. Ez lehetővé teszi a felhasználó számára, hogy intelligens szerződéseket írjon közvetlenül a böngészőből.
  • Szarvasgomba-csomag: A szarvasgomba biztosítja egy csomó eszköz a fejlesztő elindításához és elindításához az elosztott alkalmazások fejlesztésében. Ide tartoznak a szarvasgomba, a Ganache és a Drizzle.
  • Ethlint / Solium: A Solium lehetővé teszi a fejlesztők számára, hogy biztosítsák a Solidity-ra írt okos szerződések mentesek a stílus és a biztonság kérdésétől. A szolium ezen problémák megoldásában is segít.
  • Paritás: A paritás segít az intelligens szerződés fejlesztési környezetének megteremtése az éteriumon. Gyors és biztonságos módot kínál a blokklánccal való interakcióra.

8. Következtetés

Összefoglalva, ebben az oktatóanyagban áttekintettük a blockchain technológia alapfogalmait. Megértettük, hogy egy hálózat enyém, és hozzáadunk egy új blokkot a blokklánchoz. Továbbá megvalósítottuk az alapkoncepciókat a Java-ban. Megvitattunk néhány, a technológiával kapcsolatos fejlett fogalmat is.

Végül összefoglaltuk a blockchain néhány gyakorlati alkalmazását és az elérhető eszközöket.

Mint mindig, a kód megtalálható a GitHubon.