Les fondamentaux de la blockchain

0
465
Blockchain

Introduction

La Blockchain est un grand livre virtuel, où chaque enregistrement est un bloc. Ces enregistrements sont distribués dans un réseau où chacun peut lire et écrire, mais pas modifier les informations existantes.

La taille d’un bloc varie en fonction de la configuration de la blockchain. Lorsque les données à inscrire sur la blockchain ont atteint la taille maximale du bloc, il est ajouté et un nouveau bloc est créé. La taille d’un bloc est d’environ 1Mb pour Bitcoin.

L’objectif de cet article est de comprendre le fonctionnement d’une blockchain. On va commencer par le contenu d’un bloc. Le schéma ci-dessous illustre un bloc.

Bloc

BlockNumber
Chaque bloc d’une blockchain porte un numéro qui représente votre position dans la chaîne. Le premier bloc ajouté à la chaîne a un nom spécial, il est appelé bloc de genèse.

PrevBlockHash
Chaque bloc a une référence au numéro de hachage du bloc précédent. C’est très important, car c’est ainsi que la blockchain reste cohérente et contrôle l’immuabilité. Le bloc de genèse n’a pas de référence un bloc précédent puisqu’il s’agit du premier bloc.

MerkleRoot
Il s’agit du résultat du hachage de toutes les transactions à l’intérieur du bloc. Si quelque chose est modifié à l’intérieur du bloc, ce hachage invalidera le bloc modifié. Le nom provient du fait que Bitcoin utilise l’arbre Merkle pour générer le hachage à partir des données du bloc.

Nonce
Il s’agit d’un nombre de 32 bits qui est lié au processus d’extraction d’un bloc. Ce numéro n’est utilisé qu’une seule fois pour trouver un hachage qui correspond à la difficulté de la chaîne de blocs.

CreationTimestamp
Il s’agit de la date de création du bloc.

Data
Il s’agit des données relatives aux transactions.

Hashage

Le hashage utilisé dans le bloc corresponds à une fonction qui va calculer une empreinte numérique à partir de données en entrée. L’algorithme de hashage dépend de la configuration de la blockchain. Bitcoin utilise le SHA-256 (Secure Hash Algorithm).

Le MerkleRoot est obtenu en calculant le hash des transactions de manière récursive de façon à obtenir un seul hash pour l’ensemble des transactions. Pour comprendre ce fonctionnement, on prend ces quatre transactions:

const tA = 'Hello'
const tB = 'How are you?'
const tC = 'This is Thursday'
const tD = 'Happy new Year'

On commence par calculer le hash de chacune de ces transactions.

const sha256 = require('js-sha256').sha256

// Double-hashing here
const hA = sha256(sha256(tA))
const hB = sha256(sha256(tB))
const hC = sha256(sha256(tC))
const hD = sha256(sha256(tD))

//Results
52c87cd40ccfbd7873af4180fced6d38803d4c3684ed60f6513e8d16077e5b8e //hA
426436adcaca92d2f41d221e0dd48d1518b524c56e4e93fd324d10cb4ff8bfb9 //hB
6eeb307fb7fbc0b0fdb8bcfdcd2d455e4f6f347ff8007ed47475481a462e1aeb //hC
fd0df328a806a6517e2eafeaacea72964f689d29560185294b4e99ca16c63f8f //hD

On doit concaténer ces hashs par pair pour obtenir un seul hash.

//Pairing hA and hB
const hAB = sha256(sha256(hA + hB))
//5dc23d1a2151665e2ac258340aa9a11ed227a4cc235e142a3e1738333575590b

//Pairing hC and hD
const hCD = sha256(sha256(hC + hD))
//ff220daefda29821435691a9aa07dd2c47ca1d2574b8b77344aa783142bae330

// We do it again. We pair hAB and hCD to obtain the root
const hABCD = sha256(sha256(hAB + hCD))
//301faf21178234b04e1746ee43e126e7b2ecd2188e3fe6986356cc1dd7aa1377

L’information qui va être stockée dans le bloc corresponds au dernier hash, c’est-à-dire : « 301faf21178234b04e1746ee43e126e7b2ecd2188e3fe6986356cc1dd7aa1377 ». La totalité des transactions d’un bloc est donc résumée en 32 bytes. Si une transaction est modifiée, alors ce dernier hash ne sera pas le même. Le schéma ci-dessous illustre le fonctionnement de l’arbre de Merkle.

Merkle Tree

Blockchain

Le schéma ci-dessous illustre les blocs liés entre eux grâce au PrevBlockHash, on parle alors de blockchain.

Blocs Chainés

La lecture des données sur une blockchain est gratuite et sans limite. Si la blockchain est publique, tout le monde peut vérifier les informations enregistrées. Par exemple, le bloc 500312 de Bitcoin est accessible. On y retrouve les informations du bloc présentées précédemment.

Bloc Bitcoin

Minage

L’écriture sur une blockchain nécessite de conserver son immutabilité, ceci implique la mise en place d’un consensus. L’algorithme de consensus de Bitcoin est le Proof Of Work, on appelle cette opération le minage.

Le minage sur Bitcoin consiste à trouver le hash du bloc en cours en premier. Il doit être valide et prendre en compte la date de création CreationTimestamp, le Nonce et la difficulté.

La difficulté indique à quel point il sera difficile et long de trouver le hash. La validité d’un hash dépendant de l’implémentation de la blockchain, il peut s’agir du fait qu’il doit contenir obligatoirement une suite de caractères. Le nonce permet de faire varier le résultat du hash jusqu’à trouver un hash valide.

Implémentation

Pour aller plus loin dans la compréhension d’une blockchain, on crée un fichier blockchain.js avec le code de notre blockchain simplifiée.

const sha256 = require('js-sha256').sha256

const blockchain = (function(){
  const blocks = []

  const initBlockchain = () => {
    const data = 'Hello World!'
    const timestamp = new Date()
    const previousHash = 0
    const index = 0
    hashBlock(data, timestamp, previousHash, index)
  }

  const hashBlock = (data, timestamp, prevHash, index) => {
    let hash = '', nonce = 0

    while( !isHashValid(hash) ){
      let input = `${data}${timestamp}${prevHash}${index}${nonce}`
      hash = sha256(input)
      nonce += 1
    }
    console.log(nonce)
    blocks.push(hash)
  }

  const getLastHash = blocks => blocks.slice(-1)[0]

  const isHashValid = hash => hash.startsWith('0000') // Difficulty

  const addNewBlock = data => {
    const index = blocks.length
    const previousHash = getLastHash(blocks)
    hashBlock(data, new Date(), previousHash, index)
  }

  const getAllBlocks = () => blocks

  return {
    initBlockchain,
    getLastHash,
    blocks,
    getAllBlocks,
    addNewBlock
  }
})()

module.exports = blockchain

Ce module en javascript contient 5 méthodes accessibles:

initBlockchain : Cette méthode démarre la blockchain en créant le premier bloc, le bloc de genèse. Je lui donne un horodatage, un message, l’index du bloc dans la blockchain (0) et un hachage précédent arbitraire car il n’y a pas encore de blocs précédents dans la chaîne.

hashBlock : Cette méthode prend toutes les données du bloc et crée un hash. Comme vous pouvez le voir, la première fois que nous exécutons la fonction pour un bloc spécifique, le nonce est mis à 0. Nous calculons le hash de notre bloc et vérifions si le hachage est valide avec isHashValid. Dans notre cas, un hachage est valide si les quatre premiers caractères sont 0, c’est ce qu’on appelle la difficulté. C’est le problème que nous devons résoudre pour nous assurer que le bloc peut faire partie de la blockchain. Une fois que le hachage est valide, nous l’ajoutons à notre tableau de blocs.

ajoutezNewBlock : Ajoute un nouveau bloc avec un message en entrée. La méthode appelle hashBlock avec les données pour créer et valider le nouveau bloc.

getLastHash : Obtient le hash précédent qui est nécessaire pour créer un nouveau bloc.

getAllBlocks : Renvoie tous les blocs de la Blockchain

On crée maintenant un fichier index.js pour utiliser notre blockchain.

const blockchain = require('./blockchain')

blockchain.initBlockchain()
blockchain.addNewBlock('First new block')
blockchain.addNewBlock('I love blockchains')
blockchain.addNewBlock('Make me a new hash!!')

console.log(blockchain.getAllBlocks())

Ce script ajoute 4 blocs, le résultat obtenu est le suivant:

Initializing the blockchain
139355
30720
68789
51486
[ '0000d87875f12e8c00d60cdfc8c21c4867eb1e732d3bb0e4d60bd0febcfafbaf',
  '0000331d80f4e83461bad846e082baa08c5e739edfa19a4880c1dcbe4eed1984',
'00000dcab247410050e357158edc20555cc0110429023fdadb1d8cda3e06da5e',
  '0000a16968811cf75c33d877e99f460d396c46b5485f669c8e55b193b862106d' ]

Les valeurs 139355, 30720, 68789 et 51486 correspondent aux nonces, c’est à dire au nombre de fois que la méthode hashBloc a été exécutée pour obtenir un hash valide.

Limites

On a pu voir que la blockchain repose sur des algorithmes connus et simple à mettre en place. Cette technologie a révolutionné les échanges de données en P2P, mais il reste des problématiques à résoudre.

Débit des transactions

Il y a une limite dans la quantité de transactions qu’on peut enregistrer dans un bloc. On peut donc mesurer le nombre de transactions par secondes (tps) de la blockchain. Bitcoin a un nombre de tps de 7 et Ethereum de 15 actuellement. Le débit est bien trop faible pour une utilisation massive, il y a donc beaucoup de recherche dans ce domaine. Un objectif raisonnable à atteindre est de 10 000 transactions par secondes pour une utilisation mondiale et 100 000 pour changer le monde.

Propagation des transactions

La latence de propagation d’un nouveau bloc est aussi importante que le débit. Elle permet d’éviter un hard fork de la chaine, c’est-à-dire que la chaîne se divise en deux chaînes distinctes. Lorsqu’on effectue un achat sur internet en Bitcoin, le commerçant attend plusieurs confirmations du bloc pour être certain que la transaction a été enregistrée sur la bonne chaîne. Ce processus peut prendre plusieurs minutes en fonction du nombre de confirmation requises.

Frais des transactions

La limite sur la taille des blocs d’une blockchain public peut provoquer une augmentation des frais de transactions en cas de forte utilisation d’une blockchain publique. Il est pratique de pouvoir choisir si on veut payer des frais de transactions de 10 centimes ou 1€ pour accélérer le traitement de sa transaction, mais lorsqu’il s’agit de payer 40€ pour transférer 100€, ce n’est pas soutenable. Le jeu Cryptokitties avait fait augmenter les frais de transaction de 0.10$ à 4$ sur Ethereum, car il générait beaucoup de transaction.

Stockage des transactions

L’ensemble des transactions sont stockées sur chaque noeud pour conserver le côté immuable de la blockchain, donc au fur et à mesure la taille du noeud augmente. À long terme, il sera plus difficile de télécharger un noeud entier, car il faudra l’espace nécessaire. La blockchain Bitcoin utilise actuellement plus de 300 Go d’espace disque donc cela réduit le nombre de personnes pouvant participer à la décentralisation du réseau.

Conclusion

Cette présentation des fondamentaux d’une blockchain vous permettra de mieux appréhender les recherches des équipes de développement concernant la Blockchain. N’hésitez pas à nous dire en commentaire si cet article vous a été utile et si vous avez des questions sur certaine partie afin qu’on complète le contenu.

Sources
https://dev.to/damcosset/blockchain-what-is-in-a-block-48jo
https://dev.to/damcosset/trying-to-understand-blockchain-by-making-one-ce4

5 1 vote
Évaluation
S’abonner
Notifier de
guest
0 Commentaires
Feedback en ligne
Voir tous les commentaires