Présentation base de données

Blokchain

Blockshell est un programme qui sert Ă  la manipulation d’une base de donnĂ©es de type blockchain.

Blockchain: Mode de stockage de données dans des blocs chaînes les uns aux autres à leurs prédécesseurs et leurs successeurs respectifs. L’intégrité d’un bloc est garantie par la production d’un hash avec contrainte de la donnée qu’il contient. C’est ce que l’on appelle le minage. Pour modifier un bloc au milieu de la blockchain, il faut reminer tous les blocks qui suivent le bloc modifié de manière séquentielle. C’est d’autant plus sécurisé lorsque la blockchain est répliquée et diffusée.

class Block:
    """
        Create a new block in chain with metadata
    """
    def __init__(self, data, index=0):
        self.index = index
        self.previousHash = ""
        self.data = data
        self.timestamp = str(datetime.datetime.now())
        self.nonce = 0
        self.hash = self.calculateHash()

blockshell/blockchain/chain.py

La blockchain proposée par Blockshell est constituée de blocs, subdivisible en 3 sous-parties:

  • MĂ©tadonnĂ©e: index
  • DonnĂ©e: data
  • Preuve d’intĂ©gritĂ©: timestamp, previousHash, nonce, hash

Métadonnée

La mĂ©tadonnĂ©e est utilisĂ©e pour la manipulation des blocs dans la blockchain. Comme les blocs sont stockĂ©s de manière linĂ©aire, chaque bloc a un index unique relatif Ă  sa position dans la chaĂ®ne. L’attribut index permet une manipulation simplifiĂ©e dans des langage comme Python.

Donnée

La donnĂ©e est la raison d’exister d’une blockchain. Dans Blockshell, celle-ci est originellement une simple string, mais de la gĂ©nĂ©ricitĂ© peut Ăªtre ajoutĂ©e grĂ¢ce au Python. La donnĂ©e reprĂ©sente en gĂ©nĂ©ral une historisation immuable qui ne doit en aucun cas Ăªtre modifiĂ©e. Plusieurs applications peuvent Ăªtre faites, l’archivage de transactions, la traçabilitĂ© des produits, etc…

Preuve d’intĂ©gritĂ©

Comme le montre la classe Block, chaque bloc contient le hash du bloc le prĂ©cĂ©dant (previousHash). C’est ce qui permet le chaĂ®nage des blocs en blockchain.

Pour garantir l’intĂ©gritĂ© d’un bloc, celui-ci va Ăªtre minĂ©. Le minage consiste Ă  modifier un attribut donnĂ© du bloc, ici nonce, afin que le hash final corresponde aux contraites fixĂ©es prĂ©alablement.

class Block:

    # [...]

    def mineBlock(self, difficulty):
        """
            Method for Proof of Work
        """
        print Back.RED + "\n[Status] Mining block (" + str(self.index) + ") with PoW ..."
        startTime = time.time()

        while self.hash[:difficulty] != "0"*difficulty:
            self.nonce += 1
            self.hash = self.calculateHash()

        endTime = time.time()
        print Back.BLUE + "[ Info ] Time Elapsed : " + str(endTime - startTime) + " seconds."
        print Back.BLUE + "[ Info ] Mined Hash : " + self.hash
        print Style.RESET_ALL

blockshell/blockchain/chain.py

Dans la fonction mineBlock() de Blockshell, la contraintes est de trouver un hash qui commence par autant de ‘0’ que la valeur de la difficultĂ©. Une itĂ©ration s’oppère alors sur nonce pour trouver ce hash.