Implementering av en enkel Blockchain i Java

1. Oversikt

I denne opplæringen lærer vi de grunnleggende konseptene i blockchain-teknologi. Vi implementerer også en grunnleggende applikasjon i Java som fokuserer på konseptene.

Videre vil vi diskutere noen avanserte konsepter og praktiske anvendelser av denne teknologien.

2. Hva er Blockchain?

Så la oss først forstå hva blockchain er ...

Vel, den sporer opprinnelsen tilbake til whitepaper utgitt av Satoshi Nakamoto på Bitcoin, tilbake i 2008.

Blockchain er en desentralisert informasjonsbok. Den består av datablokker som er koblet til ved bruk av kryptografi. Den tilhører et nettverk av noder koblet over det offentlige nettverket. Vi vil forstå dette bedre når vi prøver å bygge en grunnleggende opplæring senere.

Det er noen viktige egenskaper som vi må forstå, så la oss gå gjennom dem:

  • Saksesikker: Først og fremst data som en del av en blokk er manipulasjonssikker. Hver blokk refereres til av en kryptografisk sammendrag, ofte kjent som en hash, noe som gjør blokken manipuleringssikker.
  • Desentralisert: Hele blockchain er helt desentralisert på tvers av nettverket. Dette betyr at det ikke er noen hovednode, og hver node i nettverket har samme kopi.
  • Gjennomsiktig: Hver node som deltar i nettverket validerer og legger til en ny blokk i kjeden sin gjennom konsensus med andre noder. Derfor har hver node fullstendig synlighet av dataene.

3. Hvordan fungerer Blockchain?

La oss nå forstå hvordan blockchain fungerer.

De grunnleggende enheter i en blockchain er blokker. En enkelt blokk kan kapsle inn flere transaksjoner eller andre verdifulle data:

3.1. Gruvedrift en blokk

Vi representerer en blokk med en hash-verdi. Å generere hashverdien til en blokk kalles "gruvedrift" blokken. Å bryte en blokk er vanligvis beregningsdyktig å gjøre, da den fungerer som et "bevis på arbeid".

Hashen til en blokk består vanligvis av følgende data:

  • Primært består hasj av en blokk av transaksjonene den innkapsler
  • Hashet består også av tidsstempelet for blokkens opprettelse
  • Det inkluderer også et nonce, et vilkårlig nummer som brukes i kryptografi
  • Til slutt inkluderer hashen til den nåværende blokken også hashen til den forrige blokken

Flere noder i nettverket kan konkurrere om å mine blokken samtidig. Bortsett fra å generere hash, må noder også verifisere at transaksjonene som legges til i blokken er legitime. Den første til å utvinne en blokk vinner løpet!

3.2. Legge til en blokk i Blockchain

Mens gruvedrift av en blokk er beregningsdyr, å verifisere at en blokk er legitim er relativt mye enklere. Alle noder i nettverket deltar i verifiseringen av en nylig utvunnet blokk.

Dermed en nylig utvunnet blokk blir lagt til i blockchain på konsensus av nodene.

Nå er det flere konsensusprotokoller tilgjengelig som vi kan bruke til verifisering. Nodene i nettverket bruker samme protokoll for å oppdage ondsinnet gren av kjeden. Derfor vil en ondsinnet gren, selv om den er introdusert, snart bli avvist av flertallet av nodene.

4. Grunnleggende Blockchain i Java

Nå har vi nok kontekst til å begynne å bygge en grunnleggende applikasjon i Java.

Vår enkle eksempel her vil illustrere de grunnleggende begrepene vi så akkurat. En produksjonsgradssøknad medfører mange hensyn som ligger utenfor omfanget av denne opplæringen. Vi vil imidlertid berøre noen avanserte emner senere.

4.1. Implementere en blokk

For det første må vi definere en enkel POJO som vil inneholde dataene for blokken vår:

offentlig klasse Block {private String hash; privat streng tidligereHash; private strengdata; privat lang tidStempel; privat int nonce; public Block (String data, String previousHash, long timeStamp) {this.data = data; this.previousHash = forrigeHash; this.timeStamp = timeStamp; this.hash = calcBlockHash (); } // standard getters and setters}

La oss forstå hva vi har pakket her:

  • Hash av forrige blokk, en viktig del for å bygge kjeden
  • De faktiske dataene, all informasjon som har verdi, som en kontrakt
  • Tidsstempelet for opprettelsen av denne blokken
  • En nonce, som er et vilkårlig tall som brukes i kryptografi
  • Til slutt, hash av denne blokken, beregnet basert på andre data

4.2. Beregning av Hash

Nå, hvordan beregner vi hashen til en blokk? Vi har brukt en metode beregneBlockHash men har ikke sett en implementering ennå. Før vi implementerer denne metoden, er det verdt å bruke litt tid på å forstå hva som er en hash.

En hash er en utgang av noe kjent som en hash-funksjon. EN hash-funksjonen kartlegger inngangsdata av vilkårlig størrelse til utdata av fast størrelse. Hashet er ganske følsomt for endringer i inndataene, uansett hvor små de måtte være.

Videre er det umulig å få inndataene tilbake bare fra hashen. Disse egenskapene gjør hash-funksjonen ganske nyttig i kryptografi.

Så la oss se hvordan vi kan generere hash av blokken vår i Java:

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

Ganske mange ting som skjer her, la oss forstå dem i detalj:

  • Først sammenkobler vi forskjellige deler av blokken for å generere en hash fra
  • Deretter får vi en forekomst av SHA-256 hash-funksjonen fra MessageDigest
  • Deretter genererer vi hashverdien til inngangsdataene våre, som er en byte-array
  • Til slutt forvandler vi byte-matrisen til en heksestreng, en hash blir vanligvis representert som et 32-sifret heksenummer

4.3. Har vi utvunnet blokken ennå?

Alt høres enkelt og elegant ut så langt, bortsett fra det faktum at vi ikke har utvunnet blokken ennå. Så hva innebærer egentlig gruvedrift av en blokk, som har fanget utviklernes fancy for en stund nå!

Vi vil, gruve en blokk betyr å løse en beregningsmessig kompleks oppgave for blokken. Mens det er litt trivielt å beregne hasj av en blokk, er det ikke å finne hasjen som starter med fem nuller. Enda mer komplisert ville være å finne en hash som starter med ti nuller, og vi får en generell ide.

Så, hvordan kan vi gjøre dette? Ærlig talt er løsningen mye mindre fancy! Det er med brutal kraft vi prøver å oppnå dette målet. Vi bruker nonce her:

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

La oss se hva vi prøver å gjøre her er:

  • Vi starter med å definere prefikset vi ønsker å finne
  • Så sjekker vi om vi har funnet løsningen
  • Hvis ikke øker vi nonce og beregner hasjen i en løkke
  • Sløyfa fortsetter til vi treffer jackpotten

Vi begynner med standardverdien for nonce her og øker den med en. Men det er flere sofistikerte strategier for å starte og øke et nonce i virkelige applikasjoner. Vi verifiserer heller ikke dataene våre her, som vanligvis er en viktig del.

4.4. La oss kjøre eksemplet

Nå som vi har definert blokken vår sammen med funksjonene, kan vi bruke denne til å lage en enkel blockchain. Vi lagrer dette i en ArrayList:

List blockchain = ny ArrayList (); int prefiks = 4; String prefixString = new String (new char [prefix]). Erstatt ('\ 0', '0');

I tillegg har vi definert et prefiks på fire, noe som effektivt betyr at vi vil at hasjen vår skal starte med fire nuller.

La oss se hvordan vi kan legge til en blokk her:

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

4.5. Blockchain-bekreftelse

Hvordan kan en node validere at en blockchain er gyldig? Selv om dette kan være ganske komplisert, la oss tenke på en enkel versjon:

@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 (); flagg = blockchain.get (i) .getHash (). er lik (blockchain.get (i) .calculateBlockHash ()) && previousHash.equals (blockchain.get (i) .getPreviousHash ()) && blockchain.get (i). getHash (). substring (0, prefiks) .equals (prefixString); hvis (! flagg) bryter; } assertTrue (flagg); }

Så her lager vi tre spesifikke kontroller for hver blokk:

  • Den lagrede hash av den nåværende blokken er faktisk det den beregner
  • Hashen til den forrige blokken som er lagret i den gjeldende blokken, er hashen til den forrige blokken
  • Gjeldende blokk er utvunnet

5. Noen avanserte konsepter

Mens vårt grunnleggende eksempel bringer ut de grunnleggende konseptene til en blockchain, er det absolutt ikke komplett. For å ta denne teknologien i bruk, må det tas hensyn til flere andre hensyn.

Selv om det ikke er mulig å detaljere dem alle, la oss gå gjennom noen av de viktige:

5.1. Transaksjonsbekreftelse

Beregning av hash av en blokk og å finne ønsket hash er bare en del av gruvedrift. En blokk består av data, ofte i form av flere transaksjoner. Disse må verifiseres før de kan gjøres til en del av en blokk og utvinnes.

En typisk implementering av blockchain setter en begrensning på hvor mye data som kan være en del av en blokk. Det også setter opp regler for hvordan en transaksjon kan verifiseres. Flere noder i nettverket deltar i bekreftelsesprosessen.

5.2. Alternativ konsensusprotokoll

Vi så at konsensusalgoritme som “Proof of Work” brukes til å utvinne og validere en blokk. Dette er imidlertid ikke den eneste konsensusalgoritmen som er tilgjengelig for bruk.

Det er flere andre konsensusalgoritmer å velge mellom, som bevis på stav, bevis på autoritet og bevis på vekt. Alle disse har sine fordeler og ulemper. Hvilken som skal brukes, avhenger av hvilken applikasjon vi har tenkt å utforme.

5.3. Gruvedriftbelønning

Et blockchain-nettverk består vanligvis av frivillige noder. Nå, hvorfor skulle noen ønske å bidra til denne komplekse prosessen og holde den legitim og voksende?

Dette er fordi noder blir belønnet for å bekrefte transaksjonene og bryte en blokk. Disse belønningene er vanligvis i form av mynt assosiert med applikasjonen. Men en applikasjon kan bestemme belønningen til å være noe av verdi.

5.4. Nodetyper

En blockchain er helt avhengig av at nettverket fungerer. I teorien er nettverket helt desentralisert, og hver node er lik. Imidlertid består et nettverk i praksis av flere typer noder.

Samtidig som en full node har en komplett liste over transaksjoner, en lys node har bare en delvis liste. Dessuten deltar ikke alle noder i verifisering og validering.

5.5. Sikker kommunikasjon

Et av kjennetegnene ved blockchain-teknologi er dens åpenhet og anonymitet. Men hvordan gir det sikkerhet for transaksjoner som bæres innenfor? Dette er basert på kryptografi og offentlig nøkkelinfrastruktur.

Initiativtakeren til en transaksjon bruker sin private nøkkel for å sikre den og knytte den til mottakerens offentlige nøkkel. Noder kan bruke deltakernes offentlige nøkler til å verifisere transaksjoner.

6. Praktiske anvendelser av Blockchain

Så blockchain ser ut til å være en spennende teknologi, men det må også være nyttig. Denne teknologien har eksistert i noen tid nå, og det er unødvendig å si at den har vist seg å være forstyrrende på mange domener.

Anvendelsen på mange andre områder følges aktivt. La oss forstå de mest populære applikasjonene:

  • Valuta: Dette er den klart eldste og mest kjente bruken av blockchain, takket være suksessen til Bitcoin. De gir sikre og friksjonsløse penger til mennesker over hele kloden uten sentral myndighet eller myndighetsintervensjon.
  • Identitet: Digital identitet er raskt i ferd med å bli normen i den nåværende verden. Imidlertid er dette mired av sikkerhetsproblemer og manipulering. Blockchain er uunngåelig i å revolusjonere dette området med helt sikre og manipuleringssikre identiteter.
  • Helsevesen: Helsevesenet er lastet med data, hovedsakelig håndtert av sentrale myndigheter. Dette reduserer gjennomsiktighet, sikkerhet og effektivitet i håndtering av slike data. Blockchain-teknologi kan gi et system uten noen tredjepart for å gi sårt tiltrengt tillit.
  • Myndighetene: Dette er kanskje et område som er godt åpent for forstyrrelser av blockchain-teknologien. Regjeringen er vanligvis i sentrum for flere innbyggertjenester som ofte er lastet med ineffektivitet og korrupsjon. Blockchain kan bidra til å etablere mye bedre forhold mellom myndigheter og borgere.

7. Handelsverktøy

Selv om vår grunnleggende implementering her er nyttig for å få frem konseptene, er det ikke praktisk å utvikle et produkt på blockchain fra bunnen av. Heldigvis har dette rommet modnet nå, og vi har noen ganske nyttige verktøy å starte fra.

La oss gå gjennom noen av de populære verktøyene for å jobbe innenfor dette rommet:

  • Soliditet: Soliditet er et statisk skrevet og objektorientert programmeringsspråk designet for å skrive smarte kontrakter. Den kan brukes til å skrive smarte kontrakter på forskjellige blockchain-plattformer som Ethereum.
  • Remix IDE: Remix er en kraftig open source-verktøy for å skrive smarte kontrakter i Solidity. Dette gjør det mulig for brukeren å skrive smarte kontrakter rett fra nettleseren.
  • Truffle Suite: Truffle sørger for en haug med verktøy for å få en utvikler i gang i utvikling av distribuerte apper. Dette inkluderer Truffle, Ganache og Drizzle.
  • Ethlint / Solium: Solium tillater utviklere å sikre at deres smarte kontrakter skrevet på soliditet er fri for stil og sikkerhetsproblemer. Solium hjelper også med å løse disse problemene.
  • Paritet: Paritet hjelper i sette opp utviklingsmiljøet for smart kontrakt på Etherium. Det gir en rask og sikker måte å samhandle med blockchain på.

8. Konklusjon

For å oppsummere, i denne opplæringen, gikk vi gjennom de grunnleggende konseptene i blockchain-teknologi. Vi forsto hvordan et nettverk gruve og legge til en ny blokk i blockchain. Videre implementerte vi de grunnleggende konseptene i Java. Vi diskuterte også noen av de avanserte konseptene knyttet til denne teknologien.

Til slutt avsluttet vi noen praktiske anvendelser av blockchain og så vel tilgjengelige verktøy.

Som alltid kan koden bli funnet på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found