Implementacija jednostavnog blockchaina u Javi

1. Pregled

U ovom uputstvu naučit ćemo osnovne pojmove blockchain tehnologije. Također ćemo implementirati osnovnu aplikaciju na Javi koja se fokusira na koncepte.

Dalje ćemo razmotriti neke napredne koncepte i praktične primjene ove tehnologije.

2. Što je Blockchain?

Dakle, prvo shvatimo što je točno blockchain ...

Pa, vuče svoje porijeklo još od bijelog papira koji je objavio Satoshi Nakamoto o Bitcoinu, davne 2008. godine.

Blockchain je decentralizirana knjiga podataka. Sastoji se od blokova podataka povezanih korištenjem kriptografije. Pripada mreži čvorova povezanih preko javne mreže. To ćemo bolje razumjeti kad kasnije pokušamo izgraditi osnovni vodič.

Postoje neki važni atributi koje moramo razumjeti, pa prođimo kroz njih:

  • Zaštita od neovlaštenog pristupa: Prvo i najvažnije, podaci kao dio bloka zaštićeni su od neovlaštenog korištenja. Na svaki blok referencira se kriptografski sažetak, obično poznat kao hash, što čini blok neovlaštenim.
  • Decentralizirano: cjelokupno blockchain je u potpunosti decentraliziran preko mreže. To znači da ne postoji glavni čvor, a svaki čvor u mreži ima istu kopiju.
  • Transparentno: svaki čvor koji sudjeluje u mreži potvrđuje i dodaje novi blok u svoj lanac konsenzusom s ostalim čvorovima. Dakle, svaki čvor ima potpunu vidljivost podataka.

3. Kako funkcionira Blockchain?

Sada, shvatimo kako funkcionira blockchain.

The temeljne jedinice blockchaina su blokovi. Jedan blok može enkapsulirati nekoliko transakcija ili drugih vrijednih podataka:

3.1. Iskopavanje bloka

Blok predstavljamo hash vrijednošću. Generiranje hash vrijednosti bloka naziva se "rudarstvo" Gradska četvrt, kvart. Rudarstvo bloka obično je računski skupo raditi, jer služi kao „dokaz rada“.

Hash bloka obično se sastoji od sljedećih podataka:

  • Prvenstveno se hash bloka sastoji od transakcija koje enkapsulira
  • Hash se također sastoji od vremenske oznake stvaranja bloka
  • Također uključuje nonce, proizvoljan broj koji se koristi u kriptografiji
  • Konačno, hash trenutnog bloka također uključuje hash prethodnog bloka

Višestruko čvorovi u mreži mogu se natjecati s mojima blok istodobno. Osim generiranja hasha, čvorovi također moraju provjeriti jesu li transakcije koje se dodaju u blok legitimne. Prvi koji je minirao blok pobjeđuje u utrci!

3.2. Dodavanje bloka u Blockchain

Iako je rudarenje bloka računski skupo, provjeriti je li blok legitiman relativno je lakše. Svi čvorovi u mreži sudjeluju u provjeri nedavno miniranog bloka.

Dakle, novo minirano blok se dodaje u blockchain na konsenzusu čvorova.

Sada je dostupno nekoliko protokola konsenzusa koje možemo koristiti za provjeru. Čvorovi u mreži koriste isti protokol za otkrivanje zlonamjerne grane lanca. Stoga će zlonamjerna grana, čak i ako je uvedena, uskoro odbiti većina čvorova.

4. Osnovni blockchain u Javi

Sad imamo dovoljno konteksta da započnemo graditi osnovnu aplikaciju na Javi.

Naše jednostavno Primjer ovdje ilustrirat će osnovne pojmove upravo smo vidjeli. Aplikacija proizvodne razine uključuje puno razmatranja koja su izvan dosega ovog vodiča. Međutim, kasnije ćemo se dotaknuti nekih naprednih tema.

4.1. Implementacija bloka

Prvo, moramo definirati jednostavan POJO koji će sadržavati podatke za naš blok:

javna klasa Block {private String hash; private String previousHash; privatni niz podataka; privatna dugotrajna marka; privatni int nonce; javni blok (podaci niza, niz prethodni heš, dugotrajna marka) {this.data = podaci; this.previousHash = previousHash; this.timeStamp = vremenska oznaka; this.hash = izračunajBlockHash (); } // standardni getteri i postavljači}

Shvatimo što smo ovdje spakirali:

  • Hash prethodnog bloka, važan dio za izgradnju lanca
  • Stvarni podaci, bilo koja informacija koja ima vrijednost, poput ugovora
  • Vremenska oznaka stvaranja ovog bloka
  • Nonce, što je proizvoljan broj koji se koristi u kriptografiji
  • Konačno, hash ovog bloka, izračunat na temelju drugih podataka

4.2. Izračunavanje hasha

Sada, kako izračunati hash bloka? Koristili smo metodu izračunajBlockHash ali još nisu vidjeli provedbu. Prije nego što implementiramo ovu metodu, vrijedi potrošiti malo vremena da shvatimo što je točno hash.

Hash je izlaz nečega što je poznato kao hash funkcija. A hash funkcija preslikava ulazne podatke proizvoljne veličine na izlazne podatke fiksne veličine. Hash je prilično osjetljiv na bilo kakvu promjenu ulaznih podataka, koliko god ona mala bila.

Štoviše, nemoguće je vratiti ulazne podatke samo iz njihova hasha. Ova svojstva čine hash funkciju vrlo korisnom u kriptografiji.

Pa, da vidimo kako možemo generirati hash svog bloka na Javi:

javni String convertBlockHash () {String dataToHash = previousHash + Long.toString (timeStamp) + Integer.toString (nonce) + podaci; Sažetak porukeDigest = null; bajt [] bajtova = null; isprobajte {digest = MessageDigest.getInstance ("SHA-256"); bajtova = digest.digest (dataToHash.getBytes (UTF_8)); } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {logger.log (Level.SEVERE, ex.getMessage ()); } StringBuffer međuspremnik = novi StringBuffer (); for (byte b: bytes) {buffer.append (String.format ("% 02x", b)); } povratni buffer.toString (); }

Puno se stvari ovdje događa, shvatimo ih detaljno:

  • Prvo, spajamo različite dijelove bloka kako bismo generirali hash
  • Zatim dobivamo primjerak hash-funkcije SHA-256 iz MessageDigest
  • Zatim generiramo hash vrijednost naših ulaznih podataka, a to je bajtni niz
  • Konačno, transformiramo bajtni niz u heksadecimalni niz, hash je obično predstavljen kao 32-znamenkasti hex broj

4.3. Jesmo li još iskopali blok?

Do sada sve zvuči jednostavno i elegantno, osim činjenice da blok još nismo minirali. Pa, što točno podrazumijeva rudarenje bloka, koji već neko vrijeme plijeni maštu programera!

Dobro, kopanje bloka znači rješavanje računski složenog zadatka za blok. Iako je izračunavanje hasha bloka pomalo trivijalno, pronalaženje hasha koji započinje s pet nula nije. Još složenije bilo bi pronaći hash koji započinje s deset nula, a mi dobivamo opću ideju.

Pa, kako točno to možemo učiniti? Iskreno, rješenje je puno manje otmjeno! Grubom silom pokušavamo postići taj cilj. Ovdje koristimo nonce:

javni String mineBlock (int prefiks) {String prefixString = novi String (novi char [prefiks]). replace ('\ 0', '0'); while (! hash.substring (0, prefiks) .equals (prefixString)) {nonce ++; hash = izračunajBlockHash (); } return hash; }

Pogledajmo što ovdje pokušavamo učiniti:

  • Počinjemo s definiranjem prefiksa koji želimo pronaći
  • Zatim provjeravamo jesmo li pronašli rješenje
  • Ako ne, povećavamo nonce i izračunavamo hash u petlji
  • Petlja traje sve dok ne postignemo jackpot

Ovdje započinjemo sa zadanom vrijednošću nonce i povećavamo je za jedan. Ali ima ih još sofisticirane strategije za započinjanje i povećanje koraka u stvarnim aplikacijama. Također, ovdje ne provjeravamo svoje podatke, što je obično važan dio.

4.4. Pokrenimo primjer

Sad kad smo definirali naš blok zajedno s njegovim funkcijama, to možemo koristiti za stvaranje jednostavnog blockchaina. Spremit ćemo ovo u ArrayList:

Navesti blockchain = novi ArrayList (); prefiks int = 4; Niz prefixString = novi niz (novi znak [prefiks]). Replace ('\ 0', '0');

Uz to, definirali smo prefiks četiri, što zapravo znači da želimo da naše hash započinje s četiri nule.

Pogledajmo kako ovdje možemo dodati blok:

@Test javna praznina givenBlockchain_whenNewBlockAdded_thenSuccess () {Block newBlock = novi blok ("The is New Block.", Blockchain.get (blockchain.size () - 1) .getHash (), novi datum (). GetTime ()); newBlock.mineBlock (prefiks); assertTrue (newBlock.getHash (). substring (0, prefiks) .equals (prefixString)); blockchain.add (newBlock); }

4.5. Provjera blokchaina

Kako čvor može potvrditi da je blockchain valjan? Iako ovo može biti prilično komplicirano, razmislimo o jednostavnoj verziji:

@Test javna praznina givenBlockchain_whenValidated_thenSuccess () {boolean flag = true; for (int i = 0; i <blockchain.size (); i ++) {String previousHash = i == 0? "0": blockchain.get (i - 1) .getHash (); zastava = blockchain.get (i) .getHash (). jednako (blockchain.get (i) .calculateBlockHash ()) && previousHash.equals (blockchain.get (i) .getPreviousHash ()) && blockchain.get (i). getHash (). substring (0, prefiks) .equals (prefixString); ako (! zastava) pukne; } assertTrue (zastava); }

Dakle, ovdje vršimo tri određene provjere za svaki blok:

  • Pohranjeno hash trenutnog bloka zapravo je ono što izračunava
  • Hash prethodnog bloka pohranjenog u trenutnom bloku je hash prethodnog bloka
  • Trenutni blok je miniran

5. Neki napredni koncepti

Iako naš osnovni primjer iznosi osnovne koncepte blockchaina, on zasigurno nije potpun. Da bi se ova tehnologija primijenila u praktičnu upotrebu, potrebno je uzeti u obzir nekoliko drugih razmatranja.

Iako nije moguće detaljno opisati sve njih, prođimo kroz neke od važnih:

5.1. Potvrda transakcije

Izračunavanje hasha bloka i pronalaženje željenog hasha samo je jedan dio rudarstva. Blok se sastoji od podataka, često u obliku višestrukih transakcija. Moraju se provjeriti prije nego što se naprave dijelom bloka i iskopaju.

Tipična provedba blockchain postavlja ograničenje koliko podataka može biti dijelom bloka. Također postavlja pravila o načinu provjere transakcije. U procesu verifikacije sudjeluje više čvorova u mreži.

5.2. Alternativni protokol konsenzusa

Vidjeli smo da se algoritam konsenzusa poput "Proof of Work" koristi za miniranje i provjeru valjanosti bloka. Međutim, ovo nije jedini algoritam konsenzusa dostupan za upotrebu.

Tamo su nekoliko drugih konsenzusnih algoritama na izbor, poput dokaza o udjelu, dokaza o autoritetu i dokaza o težini. Sve to ima svoje prednosti i nedostatke. Koji ćemo koristiti ovisi o vrsti aplikacije koju namjeravamo dizajnirati.

5.3. Nagrada za rudarstvo

Blockchain mreža obično se sastoji od dobrovoljnih čvorova. Zašto bi sada netko želio pridonijeti ovom složenom procesu i održavati ga zakonitim i rastućim?

Ovo je zbog čvorovi se nagrađuju za provjeru transakcija i iskopavanje bloka. Te su nagrade obično u obliku novčića pridruženog aplikaciji. Ali aplikacija može odlučiti da nagrada bude bilo što vrijedno.

5.4. Vrste čvorova

Blockchain se u potpunosti oslanja na svoju mrežu za rad. U teoriji je mreža potpuno decentralizirana i svaki čvor je jednak. Međutim, u praksi se mreža sastoji od više vrsta čvorova.

Dok puni čvor ima potpun popis transakcija, lagani čvor ima samo djelomičan popis. Štoviše, ne sudjeluju svi čvorovi u provjeri i provjeri valjanosti.

5.5. Sigurna komunikacija

Jedno od obilježja blockchain tehnologije je njena otvorenost i anonimnost. Ali kako pruža sigurnost transakcijama koje se prenose? Ovo je na temelju kriptografije i infrastrukture javnih ključeva.

Inicijator transakcije koristi se njihovim privatnim ključem da bi ga osigurao i priložio javnom ključu primatelja. Čvorovi mogu koristiti javne ključeve sudionika za provjeru transakcija.

6. Praktična primjena blockchaina

Dakle, čini se da je blockchain uzbudljiva tehnologija, ali također se mora pokazati korisnim. Ova tehnologija postoji već neko vrijeme i - nepotrebno je reći - pokazala se remetilačkom u mnogim domenama.

Aktivno se provodi njegova primjena u mnogim drugim područjima. Razumijemo najpopularnije aplikacije:

  • Valuta: Ovo je daleko najstarija i najpoznatija upotreba blockchaina, zahvaljujući uspjehu Bitcoina. Oni pružaju siguran i bez trenja novac ljudima širom svijeta bez ikakvih intervencija središnjeg tijela ili vlade.
  • Identitet: Digitalni identitet brzo postaje norma u današnjem svijetu. Međutim, ovo je zagađeno sigurnosnim problemima i neovlaštenim radom. Blockchain je neizbježan u revoluciji ovog područja s potpuno sigurnim i neovlaštenim identitetima.
  • Zdravstvo: Zdravstvena industrija prepuna je podataka, kojima uglavnom upravljaju središnja tijela. To smanjuje transparentnost, sigurnost i učinkovitost u rukovanju takvim podacima. Blockchain tehnologija može pružiti sustav bez treće strane da pruži prijeko potrebno povjerenje.
  • Vlada: Ovo je možda područje koje je dobro otvoreno za narušavanje blockchain tehnologijom. Vlada je obično u središtu nekoliko usluga za građane koje su često opterećene neučinkovitošću i korupcijom. Blockchain može pomoći u uspostavljanju puno boljih odnosa između vlade i građana.

7. Alati trgovine

Iako je naša osnovna implementacija ovdje korisna za otkrivanje koncepata, nije praktično razvijati proizvod na blockchainu od nule. Srećom, ovaj je prostor sada sazrio i imamo nekoliko vrlo korisnih alata od kojih možemo krenuti.

Prođimo kroz neke od popularnih alata za rad u ovom prostoru:

  • Čvrstoća: Čvrstoća jest statički upisan i objektno orijentiran programski jezik dizajniran za pisanje pametnih ugovora. Može se koristiti za pisanje pametnih ugovora na raznim blockchain platformama poput Ethereuma.
  • Remix IDE: Remix je moćan alat otvorenog koda za pisanje pametnih ugovora u Solidnost. To korisniku omogućuje pisanje pametnih ugovora izravno iz preglednika.
  • Suite za tartufe: Tartuf nudi hrpa alata za pokretanje programera u razvoju distribuiranih aplikacija. To uključuje tartufe, ganache i kapljice.
  • Ethlint / Solium: Solium omogućuje programerima da osiguraju da njihov pametni ugovori napisani na Solidity ne sadrže probleme u vezi sa stilom i sigurnošću. Solium također pomaže u rješavanju ovih problema.
  • Paritet: Paritet pomaže postavljanje razvojnog okruženja za pametni ugovor na Eteriju. Pruža brz i siguran način interakcije s blockchainom.

8. Zaključak

Da sumiramo, u ovom uputstvu smo prošli kroz osnovne koncepte blockchain tehnologije. Shvatili smo kako mreža minira i dodaje novi blok u blockchain. Nadalje, osnovne koncepte implementirali smo u Javu. Također smo razgovarali o nekim naprednim konceptima povezanim s ovom tehnologijom.

Napokon smo završili s nekoliko praktičnih aplikacija blockchaina i dostupnim alatima.

Kao i uvijek, kod se može pronaći na GitHub-u.