3.6 KiB
Blockchain
Introduction
Blockchain est une technique de stockage de données presque impossible à modifier, hacker ou manipuler les données stockées :
- Basée sur la Distributed Ledger Technology (DLT),
- Principalement utilisée dans les domaines des cryptomonnaies et NFTs.
Il s'agit d'un registre numérique de transactions généralement partagé entre tous les noeuds du réseau. Celui-ci est composé d'une série de blocs incluant plusieurs transactions et à chaque fois qu'une nouvelle transaction est réalisée, un enregistrement de celle-ci est ajouté dans le registre de chaque participant.
Les données stockées dans la chaine de blocs est sécurisé par des signatures cryptographiques (hash des blocks respectifs).
Les blocs
Les blocs sont les éléments de base d'une blockchain et sont constitués de :
- Transactions,
- Le hash du précédent bloc,
- Le hash de son propre contenu.
Le premier block d'un chaine est appelé genesis block.
from rich import print
from hashlib import sha256
from json import dumps
def hash_string_256(string):
"""Create a SHA256 hash for a given input string.
Arguments:
:string: The string which should be hashed.
"""
return sha256(string).hexdigest()
def hash_block(block):
"""Hashes a block and returns a string representation of it.
Arguments:
:block: The block that should be hashed.
"""
return hash_string_256(dumps(block, sort_keys=True).encode())
genesis_block = {
"previous_hash": "",
"transactions": []
}
genesis_block_hash = hash_block(genesis_block)
print(f'{genesis_block_hash = }')
block = {
"previous_hash": genesis_block_hash,
"index": 1,
"transactions": [{"sender": "A", "receiver": "B", "amount": 0.5}],
"proof": 9,
}
block_hash = hash_block(block)
print(f'{block_hash = }')
block['new_hash'] = block_hash
print(f'{block = }')
genesis_block_hash = '26cfa5c318d1195b72ecc139f11a740c5a71300dc1f3d4656188c684ac8ad01e' block_hash = '25cdb202d88ccc0d1c3eae6d27af4c231e7e9f889885f1feb40c85128aac7c37' block = {'previous_hash': '26cfa5c318d1195b72ecc139f11a740c5a71300dc1f3d4656188c684ac8ad01e', 'index': 1, 'transactions': [{'sender': 'A', 'receiver': 'B', 'amount': 0.5}], 'proof': 9, 'new_hash': '25cdb202d88ccc0d1c3eae6d27af4c231e7e9f889885f1feb40c85128aac7c37'}
hash
Un hash (sha256) est une str de longueur fixe qui apporte une couche de chiffrement autour du block, rendant impossible la manipulation de la blockchain (modification des transactions ou manipulation de la blockchain).
Proof of work
Proof of work est un algorithme propre à une blockchain :
- C'est le mécanisme qui définit la difficulté à ajouter un block à la blockchain,
- Il s'agit d'un nombre devant satisfaire une condition en utilisant un hash, hash différent des hash contenu dans les block existant,
- Généralement, ce hash est calculé ainsi : sha256((transactions + hash du block précédent) + proof of work),
- Proof of work est ajouté aux metadata du block si le hash calculé satisfait une ou plusieurs condition(s) arbitraire(s) (2 premiers digits égaux à 0 par exemple), dans le cas échant proof of work est incrémenté et le hash recalculé jusqu'à satisfaction des conditions,