:PROPERTIES:
:ID:       badea9d7-57cd-4734-98de-343f619ffe70
:mtime:    20220529123703
:ctime:    20220529102607
:END:
#+title: 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 :
 1) Transactions,
 2) Le /hash/ du précédent bloc,
 3) Le /hash/ de son propre contenu.

Le premier /block/ d'un chaine est appelé /genesis block/.

#+BEGIN_SRC python :results output
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 = }')
#+END_SRC
#+RESULTS:
: 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,

* Références
 * [[https://medium.com/@seaflux/getting-started-with-blockchain-and-programming-it-in-python-d7663b7cc3ef][Getting started with blockchain and programming it in python - Medium]]


