Tema 2 - Implementarea CUDA a algoritmului de consens Proof of Work din cadrul Bitcoin

  • Soft deadline: 8 Mai 2024 10 Mai 2024. Primiți un bonus de 10% din punctajul obtinut pentru trimiterea temei înainte de 30 aprilie 2024, ora 23:55.
  • Hard deadline: 12 Mai 2024 14 Mai 2024. Veți primi o depunctare de 10% din punctajul maxim al temei pentru fiecare zi de întârziere.

  • Dată publicare: 22 Aprilie 2024
  • Dată actualizare: 7 Mai 2024

Enunț

Implementarea unui algoritm de consens distribuit Proof of Work pe blockchain folosind programare pe GPU în CUDA.

Disclaimer: Această temă a pornit de la algoritmul Bitcoin descris în whitepaper , însă nu replică în totalitate algoritmul și structurile de date.

Introducere

Blockchain-ul este o tehnologie care a devenit cunoscută odată cu apariția criptomonedelor, precum Bitcoin-ul, Ethereum, etc. Este o formă de înregistrare descentralizată și distribuită a tranzacțiilor și datelor, care funcționează pe baza unui lanț de blocuri. Fiecare bloc înregistrează o serie de tranzacții și este legat de blocurile anterioare printr-un proces de criptare și verificare, cunoscut sub numele de “hashing”.

Descentralizare: Datele sunt stocate și gestionate de o rețea descentralizată de noduri, eliminând astfel nevoia de o autoritate centrală.

Imutabilitate: Datele înregistrate în blocurile blockchain-ului sunt imutabile și nu pot fi modificate sau șterse ulterior.

Transparență: Tranzacțiile și înregistrările sunt publice și transparente, iar oricine poate să le verifice.

Securitate: Criptografia și algoritmii de consens asigură securitatea și integritatea datelor stocate în blockchain.

Obiectivele temei

În cadrul acestei teme veți participa ca nod într-un blockchain, unde execuția tranzacțiilor se va face pe GPU. Obiectivele temei:

  • Înțelegerea conceptelor de bază ale blockchain-ului;
  • Înțelegerea algoritmului de consens distribuit;
  • Participarea la algoritmul de consens din perspectiva unui nod;
  • Programarea pe GPU și folosirea limbajului CUDA;

Algoritmul de consens

Calculatoarele participante la consens se numesc noduri (sau mineri în cazul PoW). Aceste noduri nu se cunosc și nu au încredere unele în altele. Scopul unui mecanism de consens este de a aduce toate nodurile în acord, adică de a avea încredere unul în celălalt, într-un mediu în care nodurile nu au încredere unul în celălalt.

  • Minerii (aceștia veți fi voi) efectuează lucrări de calcul în rezolvarea unei probleme matematice complexe. Demonstrarea rezolvării problemei aduce de la sine și încredere.
  • Problema matematică poate deveni mai complexă, în funcție de numărul de participanți la consens.

Minerul care a rezolvat primul problema, va propaga răspunsul în rețea, iar acest va fi validat de către ceilalți participanți la rețea. Astfel, problema are 2 proprietăți:

  • Este greu de calculat răspunsul;
  • Este ușor de verificat răspunsul.

Minerul care a rezolvat primul problema va fi recompensat. În cazul vostru, veți primi punctaj 😁

Structura unui bloc

Un bloc este format din:

  • Hash-ul blocului anterior - o valoare predefinită;
  • Root hash-ul tranzacțiilor - o valoare calculată de host, tranzactiile avand valori predefinite;
  • Nonce (Number used only once) - un număr întreg random, pozitiv, pe 32 biți, pe care minerii încearcă să îl găsească, astfel încât hash-ul block-ului rezultat să fie mai mic decât o dificultate threshold (un alt hash, ales în funcție de numărul de 0-uri consecutive din prefix). Acest număr trebuie să îl găsiți, prin metoda trial-and-error.

Hash-ul rezultat al blocului se va folosi în continuare pentru crearea unui alt bloc. De aici vine denumirea de blockchain: se creează un lanț de blocuri, iar fiecare bloc depinde de cel anterior.

Rezolvarea problemei

Problema de rezolvat este găsirea unei nonce care, atunci când se aplică o funcție hash, cum ar fi SHA-256, hash-ul începe cu un număr de zero biți. Munca medie necesară este exponențială în funcție de numărul de biți zero necesari și poate fi verificată prin executarea unui singur hash.

De exemplu, pornim de la “Hello world” și trebuie să găsim un nonce astfel încât hash-ul să înceapă cu un 0. Pentru nonce = 4, aplicând sha256(“Hello world4”) obținem un hash ce începe cu un 0:

Hello world4” → 09b044fe014a500edc4358d55e4b59d595b7a2c9d01143ae37c577d1f68378e4

Considerăm această problemă ca având dificultatea = 1. Pentru o problemă cu dificultatea = 3, hash-ul rezultat va începe cu trei de 0: “000”.

Cerințe ale temei

Înțelegerea algoritmului de consens pe CPU

  • Veți porni de la directorul cpu_miner, ce conține implementarea deja făcută pe CPU. Acesta nu face parte din rezolvarea temei. Scopul codului este de a înțelege funcționalitatea pe CPU, ca apoi să optimizați căutarea nonce-ului pe GPU, folosind CUDA.
  • Acesta conține 5 teste:
    • 4 pentru a vă familiariza cu funcțiile folosite.
    • al 5-lea este efectiv implementarea miner-ului pe CPU
  • Căutarea nonce-ului din testul 5 ar trebui să dureze ~2s pe xl, pentru o dificultate de 5 leading 0s.
  • Aceasta este o abordare simplistă a calculării unui block hash, cu complexitate redusă. Nu reflectă implementarea reală a algoritmilor de consens POW, având scop pur educativ.
  • Pași pentru rulare:
    • To compile: make
    • To run: make run
    • To clean: make clean

Implementarea algoritmului de consens pe GPU

  • Veți porni de la directorul gpu_miner, în care veți realiza implementarea în CUDA a logicii din cpu_miner.
  • Veți implementa funcția device findNonce, care va paraleliza căutarea nonce-ului, folosind CUDA Threads. Aceasta trebuie implementată astfel încât să caute prin toate numerele de la 1 la MAX_NONCE.
  • Pentru a va ajută, aveți deja implementate funcții ajutătoare în utils.cu. Vă recomandăm să va folosiți de ele în implementarea voastră.
  • Nonce-ul găsit, hash-ul block-ului, precum și timpul rulării kernel-ului, vor fi scrise într-un fișier results.csv, în urmă apelarii funcției printResult din utils.cu.
  • Pași pentru rulare:
    • To compile: make
    • To run: make run
    • To clean: make clean

Evaluarea performanței

  • Punctajul se va acorda în funcție de durata rulării kernel-ului findNonce. Pentru a testa eficiența implementării, în cazul valorilor predefinte în utils (previous block hash și cele 4 tranzacții, pentru o dificultate de 5 zero-uri), timpii rezultați sunt considerați:
    • 100% pct implementare: t < 1s.
    • 75% pct implementare: t < 1.5s.
    • 50% pct implementare: t < 2s (durata rulării pe CPU).
    • 0% pct implementare: t >= 2s SAU Nonce/Block hash incorect.

Unde t este timpul minim înregistrat în urma a 5 rulări succesive. Motivul pentru care rulăm de mai multe ori este că timpul poate fi diferit cu câteva zecimi de la o rulare la alta.

Această abordare o vom folosi și în testarea noastră, folosind teste private, pentru a vă oferi punctajul. Pentru a testa tema cu testele private, folositi submisia pe Moodle.

Observații

  • Compilarea si rularea temei se vor face EXCLUSIV pe coada xl. Nu este nevoie să modificăți nimic în Makefile, regulile sunt deja făcute. Tot ce trebuie să faceți este să apelați make, make run și make clean, ca la laborator.
  • Veți modifica DOAR fișierul gpu_miner.cu. Celelate fișiere din directorul gpu_miner se vor suprascrie la testarea automată.
  • Deși nonce-ul este un număr întreg, pozitiv, pe 32 biți, MAX_NONCE pe GPU este setat cu valoarea 1e8, în loc de UINT32_MAX (~4.29 * 1e9). Motivul este de a reduce timpul și de a nu întâmpină bottleneck-uri când sunt trimise multe job-uri, în același timp, de la mai mulți studenți, pe coada xl.

Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va fi depunctată conform regulamentului. Rezultatele notării automate este orientativă și poate fi afectată de corectarea manuală.

Notare

Toate modificările vor fi aduse fișierului gpu_miner.cu. Acest fișier îl veți submite pentru a fi evaluat și notat.

Punctajul maxim este de 100 pct distribuite astfel:

20 pct EXPLICAȚII

  • Implementare descrisă în README, alături de rezultate și o discuție asupra lor.
  • Programul compilează, codul nu are disfuncționalități majore.

80 pct IMPLEMENTARE

  • Punctaj dat de vmchecker.

Arhiva temei va fi încărcată pe Moodle. Aceasta va cuprinde obligatoriu:

  • gpu_miner.cu
  • README

Bonus

Pentru a primi un punctaj bonus de maxim 10 pct, va trebui să schimbați realizarea Merkle Tree-ului din metoda secvențială, pe CPU, într-una paralelă, pe GPU. Cerințe:

  • Puteți observa că Merkle Tree-ul se poate realiza într-un mod paralel, față de cel secvențial implementat deja.
  • Va trebui să vă creați un fișier de intrare inputs.txt, din care să citiți n tranzacții, n >= 1000. Este la latitudinea voastră dacă folosiți același previous block hash folosit deja în cod, sau citiți unul nou.
  • Veți defini o altă funcție kernel merkleTree, care va realiza în mod paralel crearea top hash-ului, folosind CUDA Threads.
  • Punctajul se va da pe o abordare corectă și eficient paralelă a generării top hash-ului, în care să arătați speedup-ul obținut de la trecerea secvențială pe CPU, la cea paralelă pe GPU. Timpul nu va fi luat în considerare, însă nu trebuie să dureze rularea job-ului mai mult decât valoarea predefinită în RUN_TIME.

Resurse necesare realizării temei

Pentru a clona repo-ul și a accesa resursele temei 2:

student@asc:~$ git clone https://gitlab.cs.pub.ro/asc/asc-public.git
student@asc:~$ cd asc-public/assignments/2-cuda_proof_of_work

Suport, întrebări și clarificări

Pentru întrebări sau nelămuriri legate de temă folosiți forumul temei.

Orice intrebare e recomandat să conțină o descriere cât mai clară a eventualei probleme. Întrebări de forma: “Nu merge X. De ce?” fără o descriere mai amănunțită vor primi un răspuns mai greu.

ATENȚIE să nu postați imagini cu părți din soluția voastră pe forumul pus la dispoziție sau orice alt canal public de comunicație. Dacă veți face acest lucru, vă asumați răspunderea dacă veți primi copiat pe temă.

asc/teme/tema2.txt · Last modified: 2024/05/08 17:49 by costin.carabas
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0