mardi 7 décembre 2021

Chapitre 93 : création d"une blockchain en assembleur ARM 64 bits

 

En parcourant les divers forums sur internet, je trouve une proposition de développer un exemple de blockchain dans divers langages .

Bon dans mon inconscience je décide de voir ce que cela peut donner en assembleur. Après quelques recherches je découvre le site suivant qui propose un exemple en Java :

https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa

Je vais donc m’en inspirer pour créer ma propre blockchain locale. En effet pour cette première approche il n’est pas question d’écrire toute la partie distribuée du fonctionnement d’une blockchain. L’exemple propose la création des blocs, des portefeuilles, et des transactions ainsi que la vérification complète de la blockchain créée.

Le projet complet se trouve dans github à cette adresse :

https://github.com/vincentARM/ARMassembly64/tree/master/projet64_013

Le programme source blockchain1.s contient le programme maître, les routines de création de bloc, d’ajout d’un bloc dans la blockchain, d’ajout d’une transaction et la vérification complète de la blockchain.

Le programme effectue les initialisations, la création des portefeuilles, la création de la première transaction qui effectue un virement de 100 totos puis la création des blocs et des transactions des virements entre les portefeuilles.

La blockchain est une double liste chaînée, ce qui permet l’insertion d’un bloc à la fin de la chaîne sans avoir à balayer toute la liste.

Un bloc contient le hash du bloc précédent, son propre hash, un timestamp fourni par un appel système linux et diverses informations.

Le calcul et l’affichage des hash sont effectués par des routines du programme sha256_64.s écrites en assembleur. J’avais écrit ce programme pour une autre utilisation.

Les blocs sont crées sur le tas et ne peuvent pas être sauvegardés dans cet exemple. Le minage d’un bloc consiste à calculer un hash avec des zéros en tête. Plus on veut de zéros et plus c’est long à miner. Ici la routine se limite à vérifier la présence des 8 premiers zéros mais déjà le minage à 5 zéros dure un certain temps !! (constante DIFFICULTE à adapter dans le fichier constantesARM64.inc).

Le programme portefeuille.s contient les routines pour créer les portefeuilles, créer les clés publiques et privées, calculer le solde et envoyer des fonds à un autre portefeuille. Remarque : les clés publiques et privées ne sont pas sauvegardées sur un fichier externe !!

Les montants des soldes et virements sont exprimés par des floats de 64 bits (doubles). Leur affichage est effectué par une routine (dans utilFloat.s) différente de grisu et beaucoup plus simple. Merci au site  https://blog.benoitblanchon.fr/lightweight-float-to-string/ pour la présentation de cette solution. Bien sûr l'affichage peut être amélioré pour enlever le E0 derrière les montants !!!

La monnaie s'appelle dans cet exemple : toto !!!!

La génération des clés, la signature d’une transaction, et sa vérification nécessitent l’utilisation de la librairie openssl qu’il faudra donc télécharger et installer sur le raspberry pi. (voir les options du linker dans le makefile ).

Dans le programme transaction.s nous trouvons les routines de création et de gestion des transactions. La routine traiterTransaction est un peu complexe à comprendre mais vous pouvez vous reporter à l’exemple en Java du site cité plus haut.

Voici un exemple d’exécution de ce programme :

 

Début programme.

Init librairie SSL

Init sorties UTXO

création blockchain

création portefeuille 1

création portefeuille 2

création portefeuille depart

création transaction départ

Calcul signature TX départ

Création tx sortie départ

Ajout TX dans liste et hashmap

Création bloc 0

Ajout TX origine au bloc 0

Ajout bloc 0 à la blockchain

creation bloc 1

Solde A

Solde du portefeuille = +100E0 totos

Virement 1

Le solde est OK

Ajout transaction de virement 1

Virement 2

Le solde est OK

Ajout transaction de virement 2

Solde A

Solde du portefeuille = +70,5E0 totos

Solde B

Solde du portefeuille = +29,5E0 totos

Ajout bloc 1 à la blockchain

creation bloc 2

Virement 3

Le solde est OK

Ajout transaction de virement 2

Ajout bloc 2

SOLDE A

Solde du portefeuille = +65,25E0 totos

SOLDE B

Solde du portefeuille = +34,75E0 totos

Verification de la blockchain

La blockchain est valide.

Fin normale du programme.

 



Aucun commentaire:

Enregistrer un commentaire