Hvis vi ser på tendenserne fra de foregående år, har vi hørt om blockchain hele tiden, men ikke meget om detaljerne.
Vi er alle klar over, at kryptovalutaer som Bitcoin, Ethereum, Dogecoin, Matic og andre er afhængige af blockchain-teknologi. Blockchain ledede de vigtige begivenheder, der revolutionerede adskillige industrier i 2021 og banede vejen for nye resultater.
Blockchain er et middel til at gemme data på en måde, der er svær eller umulig at redigere, hacke eller snyde. Det er en digital hovedbog over transaktioner, der duplikeres og spredes over hele blockchains netværk af computersystemer.
Det er den banebrydende databaseteknologi, der driver praktisk talt alle kryptovalutaer. Blockchain gør det utroligt svært at hacke eller snyde systemet ved at sprede identiske kopier af en database på tværs af et helt netværk.
Mens Bitcoin nu er den mest fremtrædende anvendelse af blockchain, kan teknologien tjene en meget bred vifte af applikationer.
Kryptovalutaer og blockchains er blevet mere og mere populære i de senere år, og denne tendens forventes at fortsætte.
Vi laver en simpel blockchain med JavaScript i denne tutorial. Det vil give dig en grundlæggende forståelse af, hvordan en blockchain fungerer.
Lad os kalde det MelodyCoin og gå direkte ind i handlingen!
Oprettelse af en blok
Til at begynde med opretter vi en ny JavaScript-fil, hvori vi placerer al vores kode.
Lad os kalde det main.js og starte med en beskrivelse af, hvordan en blockchain og blokke skal se ud.
Opret en blokklasse og giv den en funktion Object() { [native code] } til at begynde med.
Du skal angive en dato og hash for den forrige blok, når du opretter en ny blok:
Her er definitionerne for hver ejendom:
- Tidsstemplet angiver, hvornår blokeringen blev lavet. Du kan bruge hvilket format du vælger (i dette tilfælde et UNIX-tidsstempel).
- Enhver form for data, som du ønsker at forbinde til denne blok, kan inkluderes i dataparameteren. Hvis du ønsker at oprette en kryptovaluta, kan du beholde transaktionsdata såsom afsender/modtager og det beløb, der er flyttet hertil.
- The previousHash er en streng, der indeholder den foregående bloks hash. Dette er, hvad der vil generere kæden af blokke, som vil være afgørende for at levere integriteten af vores blockchain senere.
Oprettelse af hashes
Hver blok linker til den foregående blok (altså den forrigeHash-egenskab). Det vil sige, at hver blok kræver en hash. En hash ligner et fingeraftryk. Det er særskilt for hver blok.
En bloks hash kan beregnes ved at sende alt dens indhold gennem en hash-funktion.
Så lad os starte med at implementere en funktion, der beregner hashen for den aktuelle blok.
Så under Block-klassen definerer vi calculateHash-funktionen:
SHA256-hashen understøttes dog ikke af JavaScript og skal hentes fra et eksternt bibliotek.
Crypto-js er en fantastisk pakke, der inkluderer sikre implementeringer af flere hash-algoritmer.
Så kan vi importere det til vores main.js-kode.
Nu hvor vi har vores calculateHash() funktion, lad os bruge den i vores Blocks funktion:
Efter at have beskrevet, hvordan en Block ser ud, kan vi definere, hvordan en Blockchain skal se ud. Så lad os oprette en ny klasse.
I dette scenarie er blockchain et meget simpelt objekt, der har en ejendomskæde. Dette er et array, der rummer alle blokkene på kæden.
Før vi kan tilføje blokke, skal vi først oprette det, der er kendt som en "genese-blok". Dette er den første blok i kæden, og den er unik ved, at den ikke kan pege på en tidligere blok (det er den første!).
Så for at bygge genesis-blokken tilføjer jeg en funktion til vores klasse ved navn createGenesisBlock (). Tilbage i funktionen Object() { [native code] } i vores Blockchain-klasse.
Vi kan nu inkludere genesis-blokken, når som helst vi bygger en ny Blockchain-instans:
Blockchain metoder
Lad os nu tilføje metoder til vores Blockchain-klasse, der giver os mulighed for at gøre ting som at tilføje nye blokke og hente den seneste blok.
GetLatestBlock-funktionen er den mest grundlæggende. Det returnerer simpelthen det sidste medlem af kædearrayet:
AddBlock-teknikken er lidt mere involveret.
Før vi kan tilføje en ny blok til vores kæde, skal vi først indstille blokens forrige Hash-felt korrekt.
Den skal indstilles til hashen for den senest tilføjede blok til vores kæde. Vi skal også beregne hashen for den nye blok:
Test
Lad os se, hvordan vores MelodyCoin er kommet ud.
Opret en blockchain-instans for at opnå dette. Lad os tilføje et par blokke mere:
Vi har lavet to nye blokke der. Lad os tage et kig på, hvordan vores blockchain ser ud i øjeblikket.
MelodyCoin vil blive strenget og formateret med fire mellemrum:
Bekræft Blockchains integritet
Blockchains er fantastiske, fordi når først en blok er blevet tilføjet, kan den ikke ændres uden at ugyldiggøre resten af kæden.
Der er dog ingen metode for mig at kontrollere integriteten af vores blockchain med denne implementering.
Lad os introducere en isChainValid-funktion til vores blockchain. Hvis kæden er legitim, vil den returnere sand; ellers vil det returnere falsk:
Test af integritet
Vi kan nu sætte vores blockchains integritet på prøve. Hvis vi udfører det nu, vil det bekræfte, at vores kæde er ægte.
Lad os nu prøve at pille ved vores blockchain. Lad os ændre blok 2 og overskrive dens indhold (lad os antage, at vi har overført 100 mønter i stedet for fire).
Når vi udfører dette, kan vi se, at softwaren genkender vores indsats for at manipulere med kæden.
Du kan dog tro, at der er en anden metode for mig at blande mig i dette. Jeg ændrede indholdet i blokken, men genberegnede ikke hashen. Så du kan prøve at være klog og genberegne hashen for den samme blok.
Det var alt, der var til vores lille blockchain-opsætning! Det giver os mulighed for at tilføje nye blokke og registrere manipulation med data i kæden.
Der er to problemer med vores lille blockchain, som vi skal løse:
- Moderne computere er ekstremt hurtige og kan tilføje tusindvis af blokke til vores kæde på få sekunder. Vi ønsker naturligvis ikke, at nogen spammer vores blockchain.
- Vores blockchain er stadig sårbar over for manipulation. Du kan opdatere indholdet af en blok og derefter blot genberegne hasherne (og tidligere hashes) for alle efterfølgende blokke. Selvom du roder med det, ender du med en legitim kæde.
For at løse disse bekymringer bruger blockchains en teknik kendt som "bevis på arbejde." Du skal demonstrere, at du har brugt en betydelig mængde beregningsressourcer til at oprette en blok ved hjælp af denne tilgang. Dette kaldes også minedrift.
Proof-of-work kræver, at en bloks hash begynder med en bestemt mængde nuller. Men hvordan kan du vide, om din hash passer til denne regel?
Indholdet af en blok bestemmer dens hash. Så vi får altid den samme hash, forudsat at vi ikke ændrer indholdet.
Hver blok skal have en nonce-værdi tilføjet som en løsning. Dette er i det væsentlige nogle tilfældige data, som vi kan opdatere, indtil hashen af vores blok begynder med nok nuller. Fordi du ikke kan ændre en hashfunktions output, skal du teste en masse forskellige kombinationer og håbe på det bedste.
Introducer Mining til Blockchain
Lad os begynde med at inkludere en nonce i vores blokklasse. Nonce er den enkelte værdi i vores blok, som vi kan ændre for at påvirke blokkens hash.
Vi er ikke i stand til at ændre tidsstemplet eller dataene.
Lad os derefter skrive en mineBlock()-funktion, der vil udføre selve miningen af en blok. Denne funktion vil blive sendt med den nødvendige sværhedsgrad som en parameter og vil fortsætte med at udføre, indtil hashen af vores blok begynder med nok nuller.
Jeg har lige lavet en grundlæggende while-løkke, der ville køre, indtil vores hash begynder med nok nuller. Vi bruger sværhedsgraden til at bestemme, hvor mange nuller, der er nødvendige. Med en sværhedsgrad på 5 skal vores hash begynde med 5 nuller.
Når vores hash ikke indeholder nok nuller, hæver vi nonce med én og genberegner hashen. Og hvis vi finder en hash, der svarer til sværhedsgraden, logger vi den på konsollen.
Der er en ting mere, vi skal gøre. Vi tager ikke rigtig højde for nonce-variablen i vores calculateHash-metode, så her er den:
Blockchain klasse
Lad os afprøve denne nye tilgang i vores blockchain-klasse og se, hvordan det går.
Til at begynde med vil jeg definere sværhedsgraden af vores blockchain i funktionen Object(). Vi definerer det her, da vi kan bruge det et sted senere.
AddBlock-funktionen skal derefter modificeres, så den miner blokken, før den tilføjes i vores kæde.
Brug Blockchain
Lad os nu tage vores nye blockchain i brug med proof-of-work-algoritmen. Tilføj her et par console.log-udsagn.
Når vi udfører denne kode, kan vi observere, at mineprocessen ikke længere er særlig hurtig.
Det tager noget tid for algoritmen at generere blokke med hashes, der begynder med tre nuller (som konfigureret af sværhedsgrad).
Så det var enden på vores grundlæggende blockchain-opsætning.
Vi kan regulere, hvor hurtigt nye blokke føjes til vores blockchain takket være proof-of-work-mekanismen.
Det er den vigtigste sikkerhedsfunktion på blockchains. Og nu hvor du forstår, hvordan det virker, så kom i gang med at skabe din egen!
Giv en kommentar