TP1 – Parallélisation blockchain

Ce TP a pour but de paralléliser le calcul de bloc d’une blockchain (preuve de travail). Avant de commencer ce TP vous devez posséder la version monothread d’un calcul d’un bloc. Cela vous fournira l’algorithme les éléments de compilations pour bien commencer.

Pour l’évaluation, les corrections devront être poussées dans une branche GIT avec le nom du groupe dans le dépôt du TP.

Open in Coder

Calcul bloc localement

blockchain

Pour ce TP, la blockchain a été simplifiée pour n’embarquer qu’un nom de groupe comme information et sans utiliser de cryptographie. Le but n’est pas de réaliser une vraie blockchain, mais de voir comment paralléliser son algorithme. Voici de quoi est composé un bloc :

Cette structure de bloc permet de garantir les conditions de base pour une blockchain. Le Hash sur le bloc précédent permet donc de créer une chaîne. Le timestamp permet de rythmer la création des blocs, qui est une période fixe (1 minute pour le TP). Le Nonce est un nombre que l’on fait varier pour satisfaire la condition qui rend le bloc valide. Le nom de groupe sera le nom que vous donnerez pour le TP (cette information peut être aussi une valeur monétaire comme pour le Bitcoin).

Pour commencer, essayez de calculer un bloc localement. Pour cela utilisez la fonction staticTest().

Calcul bloc blockchain

Maintenant que vous avez testé la création d’un bloc, l’étape suivante est de créer un bloc valide par rapport à la blockchain courante. Pour cela vous devez générer un bloc qui correspond au travail demandé. Ce travail est composé de :

Le calcul d’un bloc de la blockchain a la cinématique suivante :

thread_blockchain_sequence

Maintenant il faut que vous calculiez un bloc de la blockchain. Pour cela modifier le nom de groupe dans le client-blockchain.cpp et utiliser la fonction uniqBlock().

Vous devriez voir le résultat de votre bloc dans Grafana.

Parallélisation hashing

Maintenant que vous avez une idée du traitement pour le calcul d’un bloc. Il faut désormais le paralléliser pour calculer les blocs plus efficacement/rapidement.

Paralléliser le calcul de bloc de la fonction uniqBlock().

Parallélisation bloc blockchain

Parallélisation algorithme

Maintenant que vous avez parallélisé l’algorithme de hashing il faut maintenant que votre mineur traite les travaux que vous donne le serveur les uns à la suite des autres.

Modifier votre méthode de parallélisation pour miner des blocs en continu. Pour cela vous devrez traiter les travaux les uns à la suite des autres sans supprimer vos threads.

Parallélisation communication

Pour le moment vous avez parallélisé l’algorithme de calcul d’un bloc, mais il reste une chose à prendre en compte. Si un autre mineur finalise un bloc avant vous, le bloc que vous devrez calculer ne sera plus le même. En effet, le travail à effectuer sera avec le nouveau hash que l’autre miner a réussi à créer.

Pour gérer ce cas, le serveur qui sert à agréger les blocs valides envoyés par les mineurs envois automatiquement le nouveau travail à tous les mineurs. Cela correspond à la cinématique suivante :

thread_blockchain_asyn_sequence

À chaque fois que le serveur vous enverra un nouveau travail, vous devrez préempter le calcul de votre bloc pour en recommencer un nouveau. Pour cela utiliser les fonctions vues dans le TP pour resynchroniser vos threads.

Modifier votre programme pour qu’il prenne en compte la cinématique avec préemption lors d’un nouveau bloc.
Par Jérémy HERGAULT, le .