Dacă ne uităm la tendințele din ultimii ani, am auzit tot timpul despre blockchain, dar nu prea multe despre specificul.
Cu toții știm că criptomonede precum Bitcoin, Ethereum, Dogecoin, Matic și altele se bazează pe tehnologia blockchain. Blockchain a condus evenimentele semnificative care au revoluționat numeroase industrii în 2021 și au deschis calea pentru noi realizări.
Blockchain este un mijloc de stocare a datelor într-un mod greu sau imposibil de editat, piratat sau escrocat. Este un registru digital al tranzacțiilor care sunt duplicate și răspândite în întreaga rețea de sisteme informatice a blockchain-ului.
Este tehnologia revoluționară a bazelor de date care alimentează practic toate criptomonedele. Blockchain face incredibil de dificil să piratați sau să înșelați sistemul prin răspândirea unor copii identice ale unei baze de date pe întreaga rețea.
În timp ce Bitcoin este acum cea mai proeminentă utilizare pentru blockchain, tehnologia poate servi pentru o varietate foarte largă de aplicații.
Criptomonedele și blockchain-urile au fost din ce în ce mai populare în ultimii ani, iar această tendință este de așteptat să continue.
Vom realiza un blockchain simplu cu JavaScript în acest tutorial. Vă va oferi o înțelegere de bază a modului în care funcționează un blockchain.
Să-i spunem MelodyCoin și să intrăm direct în acțiune!
Crearea unui bloc
Pentru început, vom crea un nou fișier JavaScript în care vom plasa tot codul nostru.
Să-l numim main.js și să începem cu o descriere a modului în care ar trebui să arate un blockchain și blocurile.
Creați o clasă Block și dați-i o funcție Object() { [cod nativ] } pentru început.
Trebuie să dați o dată și hash-ul blocului anterior atunci când creați un nou bloc:
Iată definițiile pentru fiecare proprietate:
- Marca temporală indică când a fost făcut blocul. Puteți utiliza orice format pe care îl alegeți (în acest caz, un marcaj temporal UNIX).
- Orice formă de date pe care doriți să o conectați la acest bloc poate fi inclusă în parametrul de date. Dacă doriți să creați o criptomonedă, puteți păstra aici datele despre tranzacție, cum ar fi expeditorul/destinatarul și suma de bani mutată.
- previousHash este un șir care conține hash-ul blocului anterior. Acesta este ceea ce va genera lanțul de blocuri, care va fi critic în asigurarea integrității blockchain-ului nostru mai târziu.
Crearea hashurilor
Fiecare bloc se leagă de blocul precedent (deci proprietatea precedent Hash). Adică, fiecare bloc necesită un hash. Un hash este similar cu o amprentă. Este distinct pentru fiecare bloc.
Hash-ul unui bloc poate fi calculat prin trecerea întregului său conținut printr-o funcție hash.
Deci, să începem prin a implementa o funcție care calculează hash-ul blocului curent.
Deci, sub clasa Block, definim funcția calculateHash:
Cu toate acestea, hash-ul SHA256 nu este acceptat de JavaScript și trebuie obținut dintr-o bibliotecă externă.
Crypto-js este un pachet fantastic care include implementări sigure ale mai multor algoritmi hash.
Apoi îl putem importa în codul nostru main.js.
Acum că avem funcția calculateHash(), să o folosim în funcția Block:
După ce descriem cum arată un Block, putem defini cum ar trebui să arate un Blockchain. Deci, să creăm o nouă clasă.
În acest scenariu, blockchain-ul este un obiect foarte simplu care are un lanț de proprietăți. Aceasta este o matrice care conține toate blocurile de pe lanț.
Înainte de a putea adăuga blocuri, trebuie mai întâi să creăm ceea ce este cunoscut sub numele de „bloc geneză”. Acesta este primul bloc din lanț și este unic prin faptul că nu poate indica un bloc anterior (este primul!).
Deci, pentru a construi blocul genesis, voi adăuga o funcție la clasa noastră numită createGenesisBlock (). Înapoi în funcția Object() { [cod nativ] } din clasa noastră Blockchain.
Acum putem include blocul geneză oricând construim o nouă instanță Blockchain:
Metode Blockchain
Acum, să adăugăm metode la clasa noastră Blockchain care ne vor permite să facem lucruri precum adăugarea de blocuri noi și preluarea celui mai recent bloc.
Funcția getLatestBlock este cea mai simplă. Pur și simplu returnează membrul final al matricei de lanț:
Tehnica addBlock este puțin mai implicată.
Înainte de a putea adăuga un nou bloc în lanțul nostru, trebuie mai întâi să setăm corespunzător câmpul Hash anterior al blocului respectiv.
Trebuie setat la hash-ul celui mai recent bloc adăugat în lanțul nostru. De asemenea, trebuie să calculăm hash-ul noului bloc:
Testarea
Să vedem cum a ieșit MelodyCoin-ul nostru.
Creați o instanță blockchain pentru a realiza acest lucru. Să mai adăugăm câteva blocuri:
Am făcut două blocuri noi acolo. Să aruncăm o privire la cum arată blockchain-ul nostru în prezent.
MelodyCoin va fi stringificat și formatat cu patru spații:
Verificați integritatea Blockchain-ului
Blockchain-urile sunt fantastice, deoarece odată ce un bloc a fost adăugat, acesta nu poate fi modificat fără a invalida restul lanțului.
Cu toate acestea, nu există nicio metodă pentru mine să verific integritatea blockchain-ului nostru cu această implementare.
Să introducem o funcție isChainValid în blockchain-ul nostru. Dacă lanțul este legitim, va reveni adevărat; în caz contrar, va returna false:
Testarea integrității
Acum putem pune la încercare integritatea blockchain-ului nostru. Dacă îl executăm acum, va confirma că lanțul nostru este autentic.
Să încercăm acum să modificăm blockchain-ul nostru. Să modificăm blocul 2 și să suprascriem conținutul acestuia (să presupunem că am transferat 100 de monede în loc de patru).
Când executăm acest lucru, putem vedea că software-ul recunoaște efortul nostru de a modifica lanțul.
Cu toate acestea, puteți crede că există o altă metodă pentru mine să mă amestec în asta. Am modificat conținutul din bloc, dar nu am recalculat hash-ul. Deci poți încerca să fii deștept și să recalculezi hash-ul aceluiași bloc.
Atât a fost tot ceea ce a fost în configurația noastră mică de blockchain! Ne permite să adăugăm noi blocuri și să detectăm falsificarea datelor din lanț.
Există două probleme cu micul nostru blockchain pe care trebuie să le soluționăm:
- Calculatoarele moderne sunt extrem de rapide și pot adăuga mii de blocuri la lanțul nostru în câteva secunde. Evident, nu vrem ca cineva să ne spamează blockchain-ul.
- Blockchain-ul nostru este încă vulnerabil la manipulare. Puteți actualiza conținutul unui bloc și apoi pur și simplu recalculați hashurile (și hashurile anterioare) pentru toate blocurile următoare. Chiar dacă te încurci cu el, vei ajunge cu un lanț legitim.
Pentru a aborda aceste preocupări, blockchain-urile folosesc o tehnică cunoscută sub numele de „dovada muncii”. Trebuie să demonstrați că ați folosit o cantitate semnificativă de resurse de calcul pentru a crea un bloc folosind această abordare. Aceasta se mai numește minerit.
Dovada de lucru necesită ca hash-ul unui bloc să înceapă cu o anumită cantitate de zerouri. Dar cum poți ști dacă hașul tău se încadrează în această regulă?
Conținutul unui bloc determină hash-ul acestuia. Deci obținem întotdeauna același hash, cu condiția să nu modificăm conținutul.
Fiecare bloc ar trebui să aibă o valoare nonce adăugată ca soluție. Acestea sunt în esență niște date aleatorii pe care le putem actualiza până când hash-ul blocului nostru începe cu suficiente zerouri. Deoarece nu puteți modifica rezultatul unei funcții hash, trebuie să testați o mulțime de combinații diferite și să sperați la ce este mai bun.
Introduceți mineritul în Blockchain
Să începem prin a include un nonce în clasa noastră Block. Nonce este singura valoare din blocul nostru pe care o putem modifica pentru a afecta hash-ul blocului.
Nu putem modifica marca temporală sau datele.
Apoi, să scriem o funcție mineBlock() care va face minarea propriu-zisă a unui bloc. Această funcție va primi ca parametru dificultatea necesară și va continua să se execute până când hash-ul blocului nostru începe cu suficiente zerouri.
Tocmai am făcut o buclă while de bază care ar rula până când hash-ul nostru începe cu suficiente zerouri. Folosim dificultatea pentru a determina câte zerouri sunt necesare. Cu o dificultate de 5, hashul nostru trebuie să înceapă cu 5 zerouri.
Când hash-ul nostru nu conține suficiente zerouri, creștem nonce cu unu și recalculăm hash-ul. Și dacă găsim un hash care corespunde cu dificultatea, îl logăm în consolă.
Mai este un lucru pe care trebuie să-l facem. Nu luăm în considerare variabila nonce în metoda noastră calculateHash, așa că iată-o:
Clasa Blockchain
Să testăm această nouă abordare în clasa noastră blockchain și să vedem cum merge.
Pentru început, voi defini dificultatea blockchain-ului nostru în funcția Object(). Îl definim aici, deoarece îl putem folosi undeva mai târziu.
Funcția addBlock trebuie apoi modificată astfel încât să extragă blocul înainte de a-l adăuga în lanțul nostru.
Utilizați Blockchain
Acum, să folosim noul nostru blockchain cu algoritmul de dovadă a muncii. Aici, adăugați câteva instrucțiuni console.log.
Când executăm acest cod, putem observa că procesul de minerit nu mai este deosebit de rapid.
Este nevoie de ceva timp pentru ca algoritmul să genereze blocuri cu hashuri care încep cu trei zerouri (configurat în funcție de dificultate).
Deci, acesta a fost sfârșitul configurației noastre de bază pentru blockchain.
Putem regla cât de repede sunt adăugate blocuri noi în lanțul nostru de blocuri datorită mecanismului de verificare a lucrului.
Este cea mai importantă caracteristică de securitate a blockchain-urilor. Și acum că ați înțeles cum funcționează, începeți să vă creați propriul!
Lasă un comentariu