As ons na die tendense van die vorige paar jaar kyk, het ons heeltyd van blockchain gehoor, maar nie veel oor die besonderhede nie.
Ons is almal bewus daarvan dat kripto-geldeenhede soos Bitcoin, Ethereum, Dogecoin, Matic en ander op blockchain-tegnologie staatmaak. Blockchain het die belangrike gebeurtenisse gelei wat talle bedrywe in 2021 'n omwenteling gemaak het en die weg gebaan het vir nuwe prestasies.
Blockchain is 'n manier om data te stoor op 'n manier wat moeilik of onmoontlik is om te redigeer, te kap of te bedrieg. Dit is 'n digitale grootboek van transaksies wat gedupliseer en oor die blokketting se hele netwerk van rekenaarstelsels versprei word.
Dit is die baanbrekende databasistegnologie wat feitlik alle kripto-geldeenhede aandryf. Blockchain maak dit ongelooflik moeilik om die stelsel te hack of te kul deur identiese kopieë van 'n databasis oor 'n hele netwerk te versprei.
Terwyl Bitcoin nou die mees prominente gebruik vir blockchain is, kan die tegnologie 'n baie wye verskeidenheid toepassings dien.
Kriptogeldeenhede en blokkettings is die afgelope paar jaar toenemend gewild, en hierdie neiging sal na verwagting voortduur.
Ons sal 'n eenvoudige blokketting met JavaScript maak in hierdie tutoriaal. Dit sal jou 'n basiese begrip gee van hoe 'n blokketting werk.
Kom ons noem dit MelodyCoin en begin met die aksie!
Skep 'n Blok
Om te begin, sal ons 'n nuwe JavaScript-lêer skep waarin ons al ons kode sal plaas.
Kom ons noem dit main.js en begin met 'n beskrywing van hoe 'n blokketting en blokke moet lyk.
Skep 'n Blokklas en gee dit 'n funksie Object() { [inheemse kode] } om mee te begin.
Jy moet 'n datum en die hash van die vorige blok gee wanneer jy 'n nuwe blok skep:
Hier is die definisies vir elke eiendom:
- Die tydstempel dui aan wanneer die blokkie gemaak is. Jy kan enige formaat gebruik wat jy kies (in hierdie geval, 'n UNIX-tydstempel).
- Enige vorm van data wat jy aan hierdie blok wil koppel, kan by die dataparameter ingesluit word. As jy 'n kripto-geldeenheid wil skep, kan jy transaksiedata soos die sender/ontvanger en die bedrag geld wat hierheen geskuif is, hou.
- Die previousHash is 'n string wat die vorige blok se hash bevat. Dit is wat die ketting van blokke sal genereer, wat later van kritieke belang sal wees om die integriteit van ons blokketting te verskaf.
Skep hashes
Elke blok skakel na die voorafgaande blok (dus die previousHash-eienskap). Dit wil sê, elke blok vereis 'n hash. 'n Hash is soortgelyk aan 'n vingerafdruk. Dit is afsonderlik vir elke blok.
'n Blok se hash kan bereken word deur al sy inhoud deur 'n hash-funksie te stuur.
Dus, kom ons begin deur 'n funksie te implementeer wat die hash van die huidige blok bereken.
Dus, onder die Block-klas, definieer ons die calculateHash-funksie:
Die SHA256-hash word egter nie deur JavaScript ondersteun nie en moet van 'n eksterne biblioteek verkry word.
Crypto-js is 'n fantastiese pakket wat veilige implementerings van verskeie hash-algoritmes insluit.
Dan kan ons dit in ons main.js-kode invoer.
Noudat ons ons calculateHash() funksie het, laat ons dit in ons Block se funksie gebruik:
Nadat ons beskryf het hoe 'n blok lyk, kan ons definieer hoe 'n Blockchain moet lyk. So kom ons skep 'n nuwe klas.
In hierdie scenario is die blokketting 'n baie eenvoudige voorwerp wat 'n eiendomsketting het. Dit is 'n skikking wat al die blokke op die ketting bevat.
Voordat ons blokke kan byvoeg, moet ons eers skep wat bekend staan as 'n "genese-blok." Dit is die eerste blok in die ketting, en dit is uniek deurdat dit nie na 'n vorige blok kan verwys nie (dit is die eerste!).
Dus, om die genesis-blok te bou, sal ek 'n funksie by ons klas voeg genaamd createGenesisBlock (). Terug in die funksie Object() { [inheemse kode] } van ons Blockchain-klas.
Ons kan nou die genesis-blok insluit wanneer ons 'n nuwe Blockchain-instansie bou:
Blockchain Metodes
Kom ons voeg nou metodes by ons Blockchain-klas wat ons sal toelaat om dinge te doen soos om nuwe blokke by te voeg en die mees onlangse blok te gaan haal.
Die getLatestBlock-funksie is die mees basiese. Dit gee eenvoudig die finale lid van die kettingskikking terug:
Die addBlock-tegniek is 'n bietjie meer betrokke.
Voordat ons 'n nuwe blok by ons ketting kan voeg, moet ons eers daardie blok se vorigeHash-veld toepaslik stel.
Dit moet gestel word op die hash van die blok wat die meeste by ons ketting gevoeg is. Ons moet ook die hash van die nuwe blok bereken:
toets
Kom ons kyk hoe ons MelodyCoin uitgekom het.
Skep 'n blockchain-instansie om dit te bereik. Kom ons voeg nog 'n paar blokke by:
Ons het twee nuwe blokke daar gemaak. Kom ons kyk hoe ons blokketting tans lyk.
MelodyCoin sal gestring en geformateer word met vier spasies:
Verifieer die Blockchain se integriteit
Blokkettings is fantasties, want sodra 'n blok bygevoeg is, kan dit nie verander word sonder om die res van die ketting ongeldig te maak nie.
Daar is egter geen metode vir my om die integriteit van ons blokketting met hierdie implementering na te gaan nie.
Kom ons stel 'n isChainValid-funksie aan ons blokketting bekend. As die ketting wettig is, sal dit waar terugkeer; anders sal dit vals terugkeer:
Toets integriteit
Ons kan nou ons blokketting se integriteit op die proef stel. As ons dit nou uitvoer, sal dit bevestig dat ons ketting eg is.
Kom ons probeer nou met ons blokketting peuter. Kom ons verander blok 2 en skryf die inhoud daarvan oor (kom ons veronderstel ons het 100 munte in plaas van vier oorgedra).
Wanneer ons dit uitvoer, kan ons sien dat die sagteware ons poging erken om met die ketting te peuter.
Jy kan egter glo dat daar vir my 'n ander metode is om hiermee in te meng. Ek het die inhoud in die blok verander, maar nie die hash herbereken nie. So jy kan probeer om slim te wees en die hash van dieselfde blok te herbereken.
Dit is al wat daar was vir ons klein blokketting-opstelling! Dit stel ons in staat om nuwe blokke by te voeg en gepeuter met data binne die ketting op te spoor.
Daar is twee probleme met ons klein blokketting wat ons moet aanspreek:
- Moderne rekenaars is uiters vinnig en kan binne sekondes duisende blokke by ons ketting voeg. Ons wil natuurlik nie hê dat iemand ons blokketting strooipos nie.
- Ons blokketting is steeds kwesbaar vir gepeuter. Jy kan die inhoud van 'n blok opdateer en dan eenvoudig die hashes (en vorige hashes) vir alle volgende blokke herbereken. Selfs as jy daarmee mors, sal jy met 'n wettige ketting eindig.
Om hierdie bekommernisse aan te spreek, gebruik blokkettings 'n tegniek bekend as "bewys van werk." Jy moet demonstreer dat jy 'n aansienlike hoeveelheid rekenaarhulpbronne gebruik het om 'n blok te skep deur hierdie benadering te gebruik. Dit word ook genoem mynbou.
Bewys-van-werk vereis dat 'n blok se hash met 'n spesifieke hoeveelheid nulle begin. Maar hoe kan jy weet of jou hash by hierdie reël pas?
Die inhoud van 'n blok bepaal sy hash. Ons kry dus altyd dieselfde hash, mits ons nie die inhoud verander nie.
Elke blok moet 'n nonce-waarde hê wat daarby gevoeg word as 'n oplossing. Dit is in wese 'n paar willekeurige data wat ons kan bywerk totdat die hash van ons blok met genoeg nulle begin. Omdat jy nie 'n hash-funksie se uitset kan verander nie, moet jy baie verskillende kombinasies toets en hoop vir die beste.
Stel Mynbou bekend aan The Blockchain
Kom ons begin deur 'n nonce in ons Blokklas in te sluit. Die nonce is die enkele waarde binne ons blok wat ons kan verander om die blok se hash te beïnvloed.
Ons kan nie die tydstempel of die data verander nie.
Kom ons skryf dan 'n mineBlock()-funksie wat die werklike ontginning van 'n blok sal doen. Hierdie funksie sal die nodige moeilikheidsgraad as 'n parameter gestuur word en sal voortgaan om uit te voer totdat die hash van ons blok met genoeg nulle begin.
Ek het net 'n basiese while-lus gemaak wat sou loop totdat ons hash met genoeg nulle begin. Ons gebruik die moeilikheidsgraad om te bepaal hoeveel nulle benodig word. Met 'n moeilikheidsgraad van 5 moet ons hash met 5 nulle begin.
Wanneer ons hash nie genoeg nulle bevat nie, verhoog ons die nons met een en herbereken die hash. En as ons 'n hash vind wat ooreenstem met die moeilikheidsgraad, teken ons dit by die konsole aan.
Daar is nog een ding wat ons moet doen. Ons neem nie regtig die nonce-veranderlike in ag in ons calculateHash-metode nie, so hier is dit:
Blockchain-klas
Kom ons stel hierdie nuwe benadering op die proef in ons blokkettingklas en kyk hoe dit gaan.
Om te begin, sal ek die moeilikheidsgraad van ons blokketting definieer in die funksie Object(). Ons definieer dit hier aangesien ons dit later iewers kan gebruik.
Die addBlock-funksie moet dan sodanig gewysig word dat dit die blok ontgin voordat dit by ons ketting gevoeg word.
Gebruik die Blockchain
Nou, laat ons ons nuwe blokketting gebruik met die bewys-van-werk-algoritme. Voeg hier 'n paar console.log-stellings by.
Wanneer ons hierdie kode uitvoer, kan ons waarneem dat die mynproses nie meer besonder vinnig is nie.
Dit neem 'n geruime tyd vir die algoritme om blokke te genereer met hashes wat met drie nulle begin (soos gekonfigureer deur moeilikheid).
Dit was dus die einde van ons basiese blokketting-opstelling.
Ons kan reguleer hoe vinnig nuwe blokke by ons blokketting gevoeg word danksy die bewys-van-werk-meganisme.
Dit is die belangrikste sekuriteitskenmerk op blokkettings. En noudat jy verstaan hoe dit werk, begin om jou eie te skep!
Lewer Kommentaar