Om vi tittar på trenderna under de senaste åren har vi hört talas om blockchain hela tiden, men inte mycket om detaljerna.
Vi är alla medvetna om att kryptovalutor som Bitcoin, Ethereum, Dogecoin, Matic och andra är beroende av blockchain-teknik. Blockchain ledde de betydande händelserna som revolutionerade många branscher 2021 och banade väg för nya landvinningar.
Blockchain är ett sätt att lagra data på ett sätt som är svårt eller omöjligt att redigera, hacka eller lura. Det är en digital redovisning av transaktioner som dupliceras och sprids över blockkedjans hela nätverk av datorsystem.
Det är den banbrytande databastekniken som driver praktiskt taget alla kryptovalutor. Blockchain gör det otroligt svårt att hacka eller lura systemet genom att sprida identiska kopior av en databas över ett helt nätverk.
Medan Bitcoin nu är den mest framträdande användningen av blockchain, kan tekniken tjäna ett mycket brett utbud av applikationer.
Kryptovalutor och blockkedjor har blivit allt populärare de senaste åren, och denna trend förväntas fortsätta.
Vi kommer att göra en enkel blockchain med JavaScript i denna handledning. Det kommer att ge dig en grundläggande förståelse för hur en blockchain fungerar.
Låt oss kalla det MelodyCoin och ge dig i kast!
Skapa ett block
Till att börja med skapar vi en ny JavaScript-fil där vi lägger all vår kod.
Låt oss kalla det main.js och börja med en beskrivning av hur en blockkedja och block ska se ut.
Skapa en Blockklass och ge den en funktion Object() { [native code] } till att börja med.
Du måste ange ett datum och hash för det föregående blocket när du skapar ett nytt block:
Här är definitionerna för varje fastighet:
- Tidsstämpeln anger när blockeringen gjordes. Du kan använda vilket format du än väljer (i det här fallet en UNIX-tidsstämpel).
- Alla former av data som du vill koppla till detta block kan inkluderas i dataparametern. Om du vill skapa en kryptovaluta kan du behålla transaktionsdata som avsändare/mottagare och summa pengar som flyttats hit.
- The previousHash är en sträng som innehåller det föregående blockets hash. Detta är vad som kommer att generera kedjan av block, vilket kommer att vara avgörande för att tillhandahålla integriteten hos vår blockkedja senare.
Skapar hash
Varje block länkar till föregående block (därmed egenskapen previousHash). Det vill säga att varje block kräver en hash. En hash liknar ett fingeravtryck. Det är distinkt för varje block.
Ett blocks hash kan beräknas genom att skicka allt dess innehåll genom en hashfunktion.
Så låt oss börja med att implementera en funktion som beräknar hashen för det aktuella blocket.
Så under Block-klassen definierar vi calculateHash-funktionen:
SHA256-hashen stöds dock inte av JavaScript och måste hämtas från ett externt bibliotek.
Crypto-js är ett fantastiskt paket som inkluderar säkra implementeringar av flera hashalgoritmer.
Sedan kan vi importera den till vår main.js-kod.
Nu när vi har vår calculateHash() funktion, låt oss använda den i vårt blocks funktion:
Efter att ha beskrivit hur ett Block ser ut kan vi definiera hur en Blockchain ska se ut. Så låt oss skapa en ny klass.
I det här scenariot är blockkedjan ett mycket enkelt objekt som har en egenskapskedja. Detta är en array som innehåller alla blocken på kedjan.
Innan vi kan lägga till block måste vi först skapa vad som kallas ett "genesisblock". Detta är det första blocket i kedjan, och det är unikt genom att det inte kan peka på ett tidigare block (det är det första!).
Så för att bygga genesis-blocket lägger jag till en funktion i vår klass som heter createGenesisBlock (). Tillbaka i funktionen Object() { [native code] } i vår Blockchain-klass.
Vi kan nu inkludera genesis-blocket när som helst vi bygger en ny Blockchain-instans:
Blockchain metoder
Låt oss nu lägga till metoder till vår Blockchain-klass som gör att vi kan göra saker som att lägga till nya block och hämta det senaste blocket.
GetLatestBlock-funktionen är den mest grundläggande. Det returnerar helt enkelt den sista medlemmen i kedjearrayen:
AddBlock-tekniken är lite mer involverad.
Innan vi kan lägga till ett nytt block i vår kedja måste vi först ställa in blockets föregående Hash-fält på lämpligt sätt.
Den måste ställas in på hashen för det senast tillagda blocket i vår kedja. Vi måste också beräkna hashen för det nya blocket:
Testning
Låt oss se hur vårt MelodyCoin har kommit ut.
Skapa en blockchain-instans för att åstadkomma detta. Låt oss lägga till ett par block till:
Vi har gjort två nya block där. Låt oss ta en titt på hur vår blockchain ser ut för närvarande.
MelodyCoin kommer att strängas och formateras med fyra mellanslag:
Verifiera Blockchains integritet
Blockkedjor är fantastiska eftersom när ett block väl har lagts till kan det inte ändras utan att göra resten av kedjan ogiltig.
Det finns dock ingen metod för mig att kontrollera integriteten hos vår blockchain med denna implementering.
Låt oss introducera en isChainValid-funktion till vår blockchain. Om kedjan är legitim kommer den att returneras sant; annars kommer det att returnera false:
Testa integritet
Vi kan nu sätta vår blockchains integritet på prov. Om vi utför det nu kommer det att bekräfta att vår kedja är äkta.
Låt oss nu försöka manipulera vår blockchain. Låt oss ändra block 2 och skriva över dess innehåll (låt oss anta att vi överförde 100 mynt istället för fyra).
När vi utför detta kan vi se att programvaran känner igen vår ansträngning att manipulera kedjan.
Du kan dock tro att det finns en annan metod för mig att blanda mig i detta. Jag ändrade innehållet i blocket men räknade inte om hashen. Så du kan försöka vara smart och räkna om hashen för samma block.
Det var allt som fanns i vårt lilla blockchain-upplägg! Det gör det möjligt för oss att lägga till nya block och upptäcka manipulering av data inom kedjan.
Det finns två problem med vår lilla blockchain som vi måste ta itu med:
- Moderna datorer är extremt snabba och kan lägga till tusentals block till vår kedja på några sekunder. Vi vill uppenbarligen inte att någon ska spamma vår blockchain.
- Vår blockchain är fortfarande sårbar för manipulering. Du kan uppdatera innehållet i ett block och sedan helt enkelt räkna om hasharna (och tidigare hasharna) för alla följande block. Även om du bråkar med det, kommer du att få en legitim kedja.
För att ta itu med dessa problem använder blockkedjor en teknik som kallas "bevis på arbete". Du måste visa att du använt en betydande mängd beräkningsresurser för att skapa ett block med detta tillvägagångssätt. Detta kallas också brytning.
Bevis på arbete kräver att ett blocks hash börjar med ett specifikt antal nollor. Men hur kan du veta om din hash passar denna regel?
Innehållet i ett block bestämmer dess hash. Så vi får alltid samma hash, förutsatt att vi inte ändrar innehållet.
Varje block bör ha ett nonce-värde som en lösning. Det här är i huvudsak några slumpmässiga data som vi kan uppdatera tills hashen för vårt block börjar med tillräckligt med nollor. Eftersom du inte kan ändra en hashfunktions utdata måste du testa många olika kombinationer och hoppas på det bästa.
Introducera Mining till Blockchain
Låt oss börja med att ta med en nonce i vår blockklass. Nonce är det enda värdet i vårt block som vi kan ändra för att påverka blockets hash.
Vi kan inte ändra tidsstämpeln eller data.
Låt oss sedan skriva en mineBlock()-funktion som kommer att utföra den faktiska brytningen av ett block. Denna funktion kommer att skickas med den nödvändiga svårigheten som en parameter och kommer att fortsätta att köras tills hashen för vårt block börjar med tillräckligt med nollor.
Jag gjorde precis en grundläggande while-loop som skulle köras tills vår hash börjar med tillräckligt med nollor. Vi använder svårigheten för att avgöra hur många nollor som behövs. Med en svårighetsgrad på 5 måste vår hash börja med 5 nollor.
När vår hash inte innehåller tillräckligt med nollor, höjer vi nonce med en och räknar om hashen. Och om vi hittar en hash som motsvarar svårigheten loggar vi den till konsolen.
Det finns en sak till vi behöver göra. Vi tar inte riktigt hänsyn till nonce-variabeln i vår calculateHash-metod, så här är den:
Blockchain-klass
Låt oss testa detta nya tillvägagångssätt i vår blockchain-klass och se hur det går.
Till att börja med kommer jag att definiera svårigheten för vår blockkedja i funktionen Object(). Vi definierar det här eftersom vi kan använda det någonstans senare.
AddBlock-funktionen måste sedan modifieras så att den bryter blocket innan det läggs till i vår kedja.
Använd Blockchain
Låt oss nu använda vår nya blockchain med algoritmen för bevis på arbete. Här lägger du till ett par console.log-satser.
När vi kör den här koden kan vi observera att gruvprocessen inte längre är särskilt snabb.
Det tar lite tid för algoritmen att generera block med hash som börjar med tre nollor (som konfigurerats av svårighetsgrad).
Så det var slutet på vår grundläggande blockchain-inställning.
Vi kan reglera hur snabbt nya block läggs till vår blockchain tack vare proof-of-work-mekanismen.
Det är den viktigaste säkerhetsfunktionen på blockkedjor. Och nu när du förstår hur det fungerar, börja skapa ditt eget!
Kommentera uppropet