Implementering af en simpel Blockchain i Java

1. Oversigt

I denne vejledning lærer vi de grundlæggende koncepter inden for blockchain-teknologi. Vi implementerer også en grundlæggende applikation i Java, der fokuserer på begreberne.

Derudover diskuterer vi nogle avancerede koncepter og praktiske anvendelser af denne teknologi.

2. Hvad er Blockchain?

Så lad os først forstå, hvad blockchain er ...

Nå, det sporer sin oprindelse tilbage til hvidbogen, der blev offentliggjort af Satoshi Nakamoto på Bitcoin, tilbage i 2008.

Blockchain er en decentraliseret informationsbog. Den består af datablokke, der er forbundet ved hjælp af kryptografi. Det tilhører et netværk af noder, der er forbundet over det offentlige netværk. Vi forstår dette bedre, når vi forsøger at opbygge en grundlæggende tutorial senere.

Der er nogle vigtige egenskaber, som vi skal forstå, så lad os gennemgå dem:

  • Slagsikker: Først og fremmest data som en del af en blok er manipulationssikker. Hver blok henvises til ved en kryptografisk fordøjelse, almindeligvis kendt som en hash, hvilket gør blokken manipulationssikker.
  • Decentraliseret: Hele blockchain er helt decentraliseret på tværs af netværket. Dette betyder, at der ikke er nogen masternode, og at hver node i netværket har den samme kopi.
  • Transparent: Hver node, der deltager i netværket validerer og tilføjer en ny blok til sin kæde gennem konsensus med andre noder. Derfor har hver knude fuldstændig synlighed af dataene.

3. Hvordan fungerer Blockchain?

Lad os nu forstå, hvordan blockchain fungerer.

Det grundlæggende enheder i en blockchain er blokke. En enkelt blok kan indkapsle flere transaktioner eller andre værdifulde data:

3.1. Minedrift en blok

Vi repræsenterer en blok med en hash-værdi. At generere hash-værdien af ​​en blok kaldes "minedrift" blokken. Minedrift af en blok er typisk beregningsmæssigt dyrt at gøre, da det tjener som "bevis på arbejde".

Hash af en blok består typisk af følgende data:

  • Primært består hash af en blok af de transaktioner, den indkapsler
  • Hashet består også af tidsstemplet for blokens oprettelse
  • Det inkluderer også en nonce, et vilkårligt nummer, der bruges i kryptografi
  • Endelig inkluderer hash af den aktuelle blok også hash af den foregående blok

Mange noder i netværket kan konkurrere om minen blokken på samme tid. Bortset fra at generere hash, skal noder også kontrollere, at de transaktioner, der tilføjes i blokken, er legitime. Den første til at udvinde en blok vinder løbet!

3.2. Tilføjelse af en blok i Blockchain

Mens minedrift af en blok er beregningsdyr, det er relativt meget lettere at kontrollere, at en blok er legitim. Alle noder i netværket deltager i verificeringen af ​​en nyudvundet blok.

Således en nymineret blok tilføjes i blockchain på konsensus af noderne.

Nu er der flere konsensusprotokoller tilgængelige, som vi kan bruge til verifikation. Knudepunkterne i netværket bruger den samme protokol til at opdage ondsindet gren af ​​kæden. Derfor vil en ondsindet gren, selvom den introduceres, snart blive afvist af flertallet af noderne.

4. Grundlæggende Blockchain i Java

Nu har vi nok kontekst til at begynde at opbygge en grundlæggende applikation i Java.

Vores enkle eksempel her illustrerer de grundlæggende begreber vi så lige. En applikation af produktionskvalitet medfører mange overvejelser, der ligger uden for omfanget af denne vejledning. Vi vil dog berøre nogle avancerede emner senere.

4.1. Implementering af en blok

For det første er vi nødt til at definere en simpel POJO, der holder data til vores blok:

offentlig klasse Bloker {privat streng hash; privat streng tidligereHash; private strengdata; privat lang tidsstempel; privat int nonce; public Block (String data, String previousHash, long timeStamp) {this.data = data; this.previousHash = tidligereHash; this.timeStamp = timeStamp; this.hash = beregneBlockHash (); } // standard getters og setters}

Lad os forstå, hvad vi har pakket her:

  • Hash af den forrige blok, en vigtig del af opbygningen af ​​kæden
  • De faktiske data, alle oplysninger, der har værdi, som en kontrakt
  • Tidsstemplet for oprettelsen af ​​denne blok
  • En nonce, som er et vilkårligt nummer, der bruges i kryptografi
  • Endelig er hash af denne blok beregnet ud fra andre data

4.2. Beregning af hash

Hvordan beregner vi nu hash af en blok? Vi har brugt en metode beregneBlockHash men har ikke set en implementering endnu. Før vi implementerer denne metode, er det værd at bruge lidt tid på at forstå, hvad der nøjagtigt er en hash.

En hash er en output af noget kendt som en hash-funktion. EN hash-funktion kortlægger inputdata med vilkårlig størrelse til outputdata med fast størrelse. Hashet er ret følsomt over for enhver ændring i inputdataene, uanset hvor lille den måtte være.

Desuden er det umuligt at få inputdataene tilbage bare fra deres hash. Disse egenskaber gør hash-funktionen ret nyttig i kryptografi.

Så lad os se, hvordan vi kan generere hash af vores blok i Java:

offentlig streng beregneBlockHash () {String dataToHash = previousHash + Long.toString (timeStamp) + Integer.toString (nonce) + data; MessageDigest fordøjelse = null; byte [] bytes = null; prøv {digest = MessageDigest.getInstance ("SHA-256"); bytes = digest.digest (dataToHash.getBytes (UTF_8)); } fange (NoSuchAlgorithmException | Ikke-understøttet kodningException ex) {logger.log (Level.SEVERE, ex.getMessage ()); } StringBuffer buffer = ny StringBuffer (); for (byte b: bytes) {buffer.append (String.format ("% 02x", b)); } returner buffer.toString (); }

En hel del ting sker her, lad os forstå dem detaljeret:

  • Først sammenkæder vi forskellige dele af blokken for at generere en hash fra
  • Derefter får vi en forekomst af SHA-256 hash-funktionen fra MessageDigest
  • Derefter genererer vi hashværdien af ​​vores inputdata, som er et byte-array
  • Endelig omdanner vi byte-arrayet til en hex-streng, en hash repræsenteres typisk som et 32-cifret hex-tal

4.3. Har vi udvundet blokken endnu?

Alt lyder enkelt og elegant indtil videre bortset fra det faktum, at vi endnu ikke har udvundet blokken. Så hvad der præcist indebærer minedrift af en blok, som har fanget udviklerens lyst i nogen tid nu!

Godt, minedrift af en blok betyder løsning af en beregningsmæssigt kompleks opgave til blokken. Mens beregning af hash af en blok er noget trivielt, er det ikke at finde hash startende med fem nuller. Endnu mere kompliceret ville være at finde en hash, der starter med ti nuller, og vi får en generel idé.

Så hvordan kan vi præcist gøre dette? Ærligt talt er løsningen meget mindre fancy! Det er med brutal styrke, at vi forsøger at nå dette mål. Vi bruger nonce her:

public String mineBlock (int prefix) {String prefixString = new String (new char [prefix]). erstatt ('\ 0', '0'); mens (! hash.substring (0, prefix) .equals (prefixString)) {nonce ++; hash = calcBlockHash (); } returner hash; }

Lad os se, hvad vi prøver at gøre her er:

  • Vi starter med at definere det præfiks, vi ønsker at finde
  • Derefter kontrollerer vi, om vi har fundet løsningen
  • Hvis ikke øger vi nonce og beregner hash i en løkke
  • Loop fortsætter, indtil vi rammer jackpotten

Vi starter med standardværdien af ​​nonce her og øger den med en. Men der er flere sofistikerede strategier til at starte og forøge en nonce i virkelige applikationer. Vi verificerer heller ikke vores data her, hvilket typisk er en vigtig del.

4.4. Lad os køre eksemplet

Nu hvor vi har defineret vores blok sammen med dens funktioner, kan vi bruge denne til at oprette en simpel blockchain. Vi gemmer dette i en ArrayList:

Liste blockchain = ny ArrayList (); int præfiks = 4; String prefixString = new String (new char [prefix]). Erstatt ('\ 0', '0');

Derudover har vi defineret et præfiks på fire, hvilket effektivt betyder, at vi vil have vores hash til at starte med fire nuller.

Lad os se, hvordan vi kan tilføje en blok her:

@Test offentlig ugyldighed givenBlockchain_whenNewBlockAdded_thenSuccess () {Block newBlock = new Block ("The is a New Block.", Blockchain.get (blockchain.size () - 1) .getHash (), new Date (). GetTime ()); newBlock.mineBlock (præfiks); assertTrue (newBlock.getHash (). substring (0, prefix) .equals (prefixString)); blockchain.add (newBlock); }

4.5. Blockchain-verifikation

Hvordan kan en node validere, at en blockchain er gyldig? Selvom dette kan være ret kompliceret, lad os tænke på en simpel version:

@Test offentlig ugyldighed givenBlockchain_whenValidated_thenSuccess () {boolean flag = true; for (int i = 0; i <blockchain.size (); i ++) {String forrigeHash = i == 0? "0": blockchain.get (i - 1) .getHash (); flag = blockchain.get (i) .getHash (). er lig med (blockchain.get (i) .calculateBlockHash ()) && previousHash.equals (blockchain.get (i) .getPreviousHash ()) && blockchain.get (i). getHash (). substring (0, prefix) .equals (prefixString); hvis (! flag) bryder; } assertTrue (flag); }

Så her laver vi tre specifikke kontroller for hver blok:

  • Den gemte hash af den aktuelle blok er faktisk det, den beregner
  • Hashet for den forrige blok, der er gemt i den aktuelle blok, er hash for den forrige blok
  • Den aktuelle blok er blevet udvundet

5. Nogle avancerede begreber

Mens vores grundlæggende eksempel viser de grundlæggende begreber i en blockchain, er det bestemt ikke komplet. For at udnytte denne teknologi praktisk skal der tages højde for flere andre overvejelser.

Selvom det ikke er muligt at specificere dem alle, lad os gennemgå nogle af de vigtige:

5.1. Transaktionsbekræftelse

Beregning af hash for en blok og finde den ønskede hash er kun en del af minedrift. En blok består af data, ofte i form af flere transaktioner. Disse skal verificeres, før de kan gøres til en del af en blok og udvindes.

En typisk implementering af blockchain sætter en begrænsning for, hvor meget data der kan være en del af en blok. Det også opstiller regler for, hvordan en transaktion kan verificeres. Flere noder i netværket deltager i verificeringsprocessen.

5.2. Alternativ konsensusprotokol

Vi så, at konsensusalgoritme som “Proof of Work” bruges til at udvinde og validere en blok. Dette er dog ikke den eneste konsensusalgoritme, der er tilgængelig til brug.

Der er flere andre konsensusalgoritmer at vælge imellem, som bevis for stav, bevis for autoritet og bevis for vægt. Alle disse har deres fordele og ulemper. Hvilken der skal bruges, afhænger af hvilken type applikation vi har til hensigt at designe.

5.3. Minedrift belønning

Et blockchain-netværk består typisk af frivillige noder. Hvorfor vil nogen nu bidrage til denne komplekse proces og holde den legitim og voksende?

Dette er fordi noder belønnes for at kontrollere transaktionerne og udvinde en blok. Disse belønninger er typisk i form af mønt tilknyttet applikationen. Men en applikation kan beslutte, at belønningen skal være noget af værdi.

5.4. Knudetyper

En blockchain er helt afhængig af, at dens netværk fungerer. I teorien er netværket helt decentraliseret, og hver knude er lige. I praksis består et netværk dog af flere typer noder.

Mens en fuld node har en komplet liste over transaktioner, en lys node har kun en delvis liste. Desuden deltager ikke alle noder i verifikation og validering.

5.5. Sikker kommunikation

Et af kendetegnene ved blockchain-teknologi er dens åbenhed og anonymitet. Men hvordan giver det sikkerhed for transaktioner, der transporteres inden for? Dette er baseret på kryptografi og offentlig nøgleinfrastruktur.

Initiativtageren til en transaktion bruger deres private nøgle til at sikre den og vedhæfte den til modtagerens offentlige nøgle. Noder kan bruge deltagernes offentlige nøgler til at bekræfte transaktioner.

6. Praktiske anvendelser af Blockchain

Så blockchain ser ud til at være en spændende teknologi, men det skal også vise sig nyttigt. Denne teknologi har eksisteret i nogen tid nu, og det er overflødigt at sige, at det har vist sig at være forstyrrende på mange områder.

Dens anvendelse på mange andre områder forfølges aktivt. Lad os forstå de mest populære applikationer:

  • betalingsmiddel: Dette er langt den ældste og mest kendte brug af blockchain takket være Bitcoin succes. De giver sikre og friktionsløse penge til mennesker over hele kloden uden nogen central myndighed eller statslig indgriben.
  • Identitet: Digital identitet bliver hurtigt normen i den nuværende verden. Dette er imidlertid mired af sikkerhedsproblemer og manipulation. Blockchain er uundgåelig med at revolutionere dette område med helt sikre og manipulationssikre identiteter.
  • Sundhedspleje: Sundhedsindustrien er fyldt med data, hovedsagelig håndteret af centrale myndigheder. Dette mindsker gennemsigtighed, sikkerhed og effektivitet ved håndtering af sådanne data. Blockchain-teknologi kan levere et system uden nogen tredjepart, der giver den meget nødvendige tillid.
  • Regering: Dette er måske et område, der er godt åbent for forstyrrelser af blockchain-teknologien. Regeringen er typisk i centrum for flere borgertjenester, der ofte er fyldt med ineffektivitet og korruption. Blockchain kan hjælpe med at etablere meget bedre forhold mellem regering og borger.

7. Handelsværktøjer

Mens vores grundlæggende implementering her er nyttig til at fremkalde begreberne, er det ikke praktisk at udvikle et produkt på blockchain fra bunden. Heldigvis er dette rum modnet nu, og vi har nogle ganske nyttige værktøjer at starte fra.

Lad os gennemgå nogle af de populære værktøjer til at arbejde inden for dette rum:

  • Soliditet: Soliditet er et statisk skrevet og objektorienteret programmeringssprog designet til at skrive smarte kontrakter. Det kan bruges til at skrive smarte kontrakter på forskellige blockchain-platforme som Ethereum.
  • Remix IDE: Remix er en kraftfuld open source-værktøj til at skrive smarte kontrakter i fasthed. Dette gør det muligt for brugeren at skrive smarte kontrakter lige fra browseren.
  • Truffle Suite: Truffle giver en masse værktøjer til at få en udvikler i gang i udvikling af distribuerede apps. Dette inkluderer Truffle, Ganache og Drizzle.
  • Ethlint / Solium: Solium tillader udviklere at sikre, at deres smarte kontrakter skrevet på soliditet er fri for stil og sikkerhedsproblemer. Solium hjælper også med at løse disse problemer.
  • Paritet: Paritet hjælper med opsætning af udviklingsmiljø til smart kontrakt på Etherium. Det giver en hurtig og sikker måde at interagere med blockchain på.

8. Konklusion

For at opsummere gik vi i denne vejledning gennem de grundlæggende begreber inden for blockchain-teknologi. Vi forstod, hvordan en netværksmine og tilføj en ny blok i blockchain. Desuden implementerede vi de grundlæggende koncepter i Java. Vi diskuterede også nogle af de avancerede koncepter relateret til denne teknologi.

Endelig afsluttede vi nogle praktiske anvendelser af blockchain og såvel tilgængelige værktøjer.

Som altid kan koden findes på GitHub.